6

私はキオスクアプリを持っており、ユーザーがプログラムを閉じないように常にタスクマネージャーを無効にする必要があります。 ただし、一部のユーザーは、ハングしているプログラムを閉じるために TaskManager が必要です。 任意のヘルプが割り当てられます。ただし、 rundll.exeプロセスを強制終了 しようとした場合のように、プログラムのプロセスを閉じるのを防ぐ機能がWindowsにあると確信しています。で呼び出すことができれば、その関数を知りたい




DllImport

誰でもトリックを手伝ってもらえますか?
ハック?
機能?
他の解決策はありますか?

編集:

少なくともプロセスが閉じられないようにする方法がない場合は、タスク マネージャーに表示されるプロセス リストからプロセスを非表示にする方法が必要です。

編集2: これまでのところ解決策が見つかりません

4

7 に答える 7

6

管理コンテキストでプロセス ID にアクセスできる場合の 1 つの方法は、プロセスに対する PROCESS_TERMINATE 権限をエンド ユーザーに拒否することです。プロセスの終了 (タスク マネージャーまたはその他のコンテキストによる) は、デフォルトで所有者に許可されますが、明示的に拒否することができます。拒否された場合、プロセスを終了するには、所有者が ACL を手動で変更してからプロセスを終了する必要があります。ユーザーがプロセスの管理者でも所有者でもない場合、プロセスを強制的に終了することはできません (たとえば、タスク マネージャーを使用)。ただし、プロセスは正常に終了できます。

processid次のコードは、Everyone グループのメンバーのPID を使用して、明示的な拒否 ACE をプロセスに配置します。

#include "Aclapi.h"
#include "Sddl.h"
DWORD RestrictTerminateOnProcessId(DWORD processid)
{
    PACL dacl = NULL, newdacl = NULL;
    HANDLE ph = NULL;
    PSECURITY_DESCRIPTOR* desc = NULL;
    PSID everyonesid = NULL;
    ph = OpenProcess(WRITE_DAC | READ_CONTROL, false, processid);
    if (!ph) goto cleanup;

    if (ERROR_SUCCESS != GetSecurityInfo(ph,
            SE_KERNEL_OBJECT,
            DACL_SECURITY_INFORMATION,
            NULL,
            NULL,
            &dacl,
            NULL,
            desc)) goto cleanup;

    SID_IDENTIFIER_AUTHORITY WorldAuth = SECURITY_WORLD_SID_AUTHORITY;
    if (!AllocateAndInitializeSid(
            &WorldAuth,1,SECURITY_WORLD_RID,
            0,0,0,0,0,0,0,&everyonesid)) goto cleanup;

    // begin copy dacl
    _ACL_SIZE_INFORMATION si;
    GetAclInformation(dacl,
            &si,
            sizeof(si),
            AclSizeInformation);

    DWORD dwNewAclSize = si.AclBytesInUse +
            (2*sizeof(ACCESS_DENIED_ACE)) + (2*GetLengthSid(everyonesid)) -
            (2*sizeof(DWORD));

    newdacl = (PACL)HeapAlloc(
            GetProcessHeap(),
            HEAP_ZERO_MEMORY,
            dwNewAclSize);

    if (newdacl == NULL) goto cleanup;

    if (!InitializeAcl(newdacl, dwNewAclSize, ACL_REVISION_DS))
            goto cleanup;

    if (!AddAccessDeniedAce(newdacl,
            ACL_REVISION_DS,
            PROCESS_TERMINATE,
            everyonesid)) goto cleanup;

    for (int i = 0; i < si.AceCount; i++)
    {
            LPVOID pace = NULL;
            if (!GetAce(dacl, i, &pace)) goto cleanup;
            if (!AddAce(newdacl, ACL_REVISION_DS,
                    MAXDWORD, pace, ((PACE_HEADER)pace)->AceSize))
                    goto cleanup;
    }

    // end copy dacl

    if (!SetSecurityInfo(ph,
            SE_KERNEL_OBJECT,
            DACL_SECURITY_INFORMATION,
            NULL,
            NULL,
            newdacl,
            NULL)) goto cleanup;
     SetLastError(0);

cleanup:
    DWORD ret = GetLastError();
    if (desc) LocalFree(desc);
    if (newdacl) HeapFree(GetProcessHeap(), 0, (LPVOID)newdacl);
    if (ph) CloseHandle(ph);
    if (everyonesid) FreeSid(everyonesid);
    return !ret;
}
于 2011-07-24T18:47:59.737 に答える
5

これを行う適切な方法は次のとおりです。

Kiosk アプリケーションのユーザーを作成します。KioskUser としましょう。コンピューターで何かを行う他のユーザーを作成します。User1 のどれもが管理者であってはならないとしましょう。彼らは管理者である必要はありませんよね? もちろん、彼らは特権を持つことができます。

通常どおり User1 アカウントを使用します。次に、KioskUser としてキオスク アプリケーションを実行します。(runas コマンドを使用) - アプリケーションをセッションに追加し、可視化します (詳細については、引数を参照してください)。

User1 がログインし、キオスク アプリケーションが KioskUser から実行されている間、User1 はプロセスを強制終了できません。

システムを「ハッキング」したり、レジストリを変更したりすることはお勧めしません。また、キオスク アプリケーションをサービスにして、キオスク ユーザーで実行することもできます。

于 2011-07-23T18:51:33.540 に答える
5

起動時に実行されるサービスを作成できます。次に、ユーザーがいつログインしてプログラムを開始するかを監視します。そこから、次の 2 つの選択肢があります。

  1. プログラムを待機させ、ユーザーのセッションが持続する限り復活させます。
  2. 管理者アカウントで実行し、ユーザーが常に制限付きアカウントで実行していることを確認してください。Windows の特権の強制は、プログラムが停止しないように処理する必要があります。

ユーザーに管理者権限を許可する必要がある場合 (その結果、ユーザーがサービスを強制終了する可能性がある場合)、SCMがサービスを自動的に再起動するようにサービスを登録してください。

それを超えると、mdm が言ったようにカーネルのハッキングが必要になるか、ルートキットの領域に飛び込む必要があります。これは避けることをお勧めします。

万一、システム サービスの代わりにまだ Windows XP を実行している場合は、Winlogon 通知パッケージを登録できます。それらは winlogon.exe のコンテキストで実行されるため、基本的には殺すことができません。これが、Vista 以降から削除された理由です。

于 2011-07-23T09:40:12.033 に答える
2

プロセスが強制終了されるのを防ぐことはできないようです。この質問と、特に説明に投稿されたリンクを参照してください。

ただし、ユーザーがタスクバーからタスク マネージャーを開いたり (右クリック -> タスク マネージャーを開く)、Ctrl-Shift-Esc を押したりtaskman、次のレジストリ キーを使用してコマンド プロンプトで入力したりできないようにすることができます。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr 

1 に設定するとタスク マネージャーが無効になり、0 に設定すると再び有効になります。

コマンド プロンプトから、次のように無効にします。

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f

そして、次のコマンドで有効にすることができます:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 0 /f

また、ユーザーがレジストリ内のこのキーに書き込めないようにする方法を見つける必要があります。ただし、私の Windows 7 64 ビット マシンでは、キーを変更する前に管理コマンド プロンプトを開く必要がありました。

編集

コメントで示唆されているように、低レベルのシステム コールをインターセプトして、報告されたプロセスのリストを変更できます。基本的に、カーネルモードのルートキットを作成する必要があります-おそらくデバイスドライバーとして実装されます。これは、Vista 以降でカーネルが変更されたため、Windows XP 以降でのみ機能する可能性があります。それは可能ですが、私の友人が学士号の最終学位論文のためにこのプロトタイプを作成しました。

プロセスを照会する他の方法も検討する必要NtQuerySystemInformationがあります。プロセスを列挙できる方法は IIRC だけではありません。

于 2011-07-20T08:06:46.057 に答える
1

キオスクアプリをルートキット/ドライバーで保護することはできません...ただし、このコンテキストで使用する必要がある方法は「マルウェアのような」ものなので注意してください...

ここhttp://blogs.msdn.com/b/oldnewthing/archive/2004/02/16/73780.aspxこれが実際には不可能なタスクである理由と、反対側でいくつかの可能性を確認できます防御する必要があります...これは次のようになります:

PROCESS_TERMINATE
を拒否する PROCESS_CREATE_THREAD を拒否する PROCESS_VM_WRITE
を拒否する PROCESS_SUSPEND_RESUME
を拒否する
さらに、デバッガーに対して手に入れることができるすべての防御 - これも非常にトリッキーなビジネスです。

于 2011-07-24T22:56:52.767 に答える
1

これをコメントとして投稿していないことをお詫びします(評判が不十分です)。drfs ソリューションを使用していますが、GetSecurityInfo の使用方法でメモリ リークを誘発するようです。私はコードを変更し、次のようにメモリリークを取り除きました:

宣言:

PSECURITY_DESCRIPTOR desc = NULL;

初期化:

desc = (PSECURITY_DESCRIPTOR)GlobalAlloc(GMEM_FIXED,  sizeof(PSECURITY_DESCRIPTOR));

掃除:

if (desc) GlobalFree(desc);

電話:

GetSecurityInfo(ph, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, NULL, &desc)

この問題に関するこの記事も見つけました: http://i1.blogs.msdn.com/b/oldnewthing/archive/2012/12/12/10376639.aspx

于 2016-05-25T11:02:24.207 に答える
0

許可されたユーザーがプロセスを強制終了するのを防ぐことはできませんが、ユーザーがプロセスを強制終了するために必要な権限を持たないようにすることはできます。そうは言っても、ローカル管理者は常にプロセスを強制終了する権限を持っています。ユーザーまたは管理者以外のユーザーによるアプリケーションの終了を防止したいですか?前者の場合は、専用のユーザーアカウントでプロセスを実行するだけで、うまくいく可能性があります。

于 2011-07-25T14:18:43.430 に答える