36

タスク マネージャーでプロセスを非表示にする必要があります。これは、イントラネット シナリオ用です。したがって、すべてが合法です。:)

あなたが持っているコード (できれば C#) やその他の手法、またはこのルートを使用する際の問題を自由に共有してください。

Update1 : ほとんどのユーザーは、一部のレガシー アプリを実行するために管理者権限を持っています。そのため、提案の 1 つは、タスク マネージャーで非表示にすることでした。ユーザーがプロセスを強制終了するのを防ぐための他のアプローチがあれば、それは素晴らしいことです。

Update2 : ルートキットへの参照を削除します。どういうわけか、この投稿はネガティブに見えました。

4

16 に答える 16

73

それが殺されるのを止めようとしないでください-あなたはそれを管理するつもりはありません。代わりに、定期的にWebサービスを呼び出してください。Webサービスは、クライアントが「サイレント」になっていることに気付くと、マシンにpingを送信して、それが単なる再起動の問題であるかどうかを確認し、マネージャー(または誰でも)に電子メールを送信して、プロセスを強制終了した人を懲戒します。

于 2008-10-09T16:29:57.937 に答える
48

これを実現する方法はサポートされていません。プロセス リストは、どの特権レベルでも読み取ることができます。管理者からさえプロセスを隠したいと思っていた場合、これは二重にサポートされていません。

これを機能させるには、NtQuerySystemInformationへの呼び出しをインターセプトするカーネル モードのルートキットを記述して、SystemProcessInformation 情報クラスが非表示のプロセスを一覧表示できないようにする必要があります。

システム コールを傍受することを安全に行うのは非常に困難であり、64 ビット Windows カーネルはこれを防ぐためにあらゆる手段を講じています。syscall テーブルを変更しようとすると、即座にブルー スクリーンが表示されます。これらのプラットフォームでは非常に困難になるでしょう

これは、似たようなことをしようとするルートキットの例です (いくつかの重大な問題があります)。

于 2008-10-09T16:22:03.693 に答える
19

ユーザーがタスクマネージャーからプロセスを強制終了しないようにする場合は、プロセスのセキュリティ記述子を使用して、全員へのアクセスの終了を拒否できます。管理者は、技術的には、プロセスの所有権を取得してDACLをリセットすることでプロセスを強制終了できますが、タスクマネージャーからこれらのいずれかを実行するためのインターフェイスはありません。ただし、 ProcessExplorerにはインターフェイスがある場合があります。

プロセスが開始したら、現在のプロセスハンドルを使用してSetKernelObjectSecurityを使用します。DACL_SECURITY_INFORMATIONACLがゼロのDACLを設定します。これにより、タスクマネージャーでプロセスを終了しようとしているユーザーを含め、すべてのユーザーへのすべてのアクセスが拒否されます。

プロセスの所有者も変更する例を次に示します。

SECURITY_DESCRIPTOR sd;
ACL dacl;
SID_IDENTIFIER_AUTHORITY ntauth = SECURITY_NT_AUTHORITY;
PSID owner;

assert(InitializeAcl(&dacl, sizeof dacl, ACL_REVISION));

assert(AllocateAndInitializeSid(&ntauth, 1, SECURITY_LOCAL_SYSTEM_RID, 0,0,0,0,0,0,0, &owner));

assert(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION));

assert(SetSecurityDescriptorDacl(&sd, TRUE, &dacl, FALSE));

assert(SetSecurityDescriptorOwner(&sd, owner, FALSE));

assert(SetKernelObjectSecurity(GetCurrentProcess(), DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &sd));

assert(FreeSid(owner) == NULL);

残念ながら、それは効果的ではないようです。プロセスを閉じることはできます(ただし、制限付きユーザーとしてではありません)。おそらく、タスクマネージャーが所有権を取得しているか、プロセスを強制終了するために他の特権を呼び出していますか?以前のバージョンのWindows(2003をテストしていた)でこれが機能していたことを覚えているようですが、誤解される可能性があります。

于 2008-10-09T16:35:06.163 に答える
10

できないことを願っています。

更新:シナリオを考えると、おそらく別の管理者アカウントで実行するのが最善だと思います。これは、プロセスを強制終了してはならないという事実を人々に警告するのに役立つ場合があります。

于 2008-10-09T16:11:42.637 に答える
7

または、アプリが実行されているかどうかを確認する小さな「チェッカー」ユーティリティを作成し、実行されていない場合は自動的に起動することもできます。次に、同じことを行う「チェッカー」ユーティリティをチェックするコードをアプリに追加します。このようにして、一方が終了した場合、もう一方がバックアップを開始します。ウイルスがこれを行っているようで、かなり効果的に機能しているようです。

于 2008-10-09T16:39:02.910 に答える
6

ドライバーを作成する - ObRegisterCallbacks を使用して、プロセス オブジェクト アクセス通知を登録できます。DesiredAccess に、プロセスの終了やプロセス メモリへの書き込みなど、望ましくないアクセス権が含まれている場合は、STATUS_ACCESS_DENIED を返します。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff558692(v=vs.85).aspx

于 2012-02-28T15:25:03.297 に答える
4

プロセスを完全に隠すのではなく単に偽装する必要がある場合は、名前を winlogon.exe または svchost.exe に変更すると、ユーザーに無視される可能性があります。しかし、Sergio が述べたように、それはあいまいさによるセキュリティであり、評判が悪いのには理由があります。

ユーザーが適切な権限を持っている場合、ユーザーがプロセスを強制終了できないようにすることも困難です。私が知っている唯一の方法は、複数のプロセスが互いに監視し、監視されているプロセスが強制終了された場合に再起動することです。繰り返しますが、これは日陰の道を進んでいます。

于 2008-10-09T16:26:19.393 に答える
4

なぜこれがまだ提案されていないのかはわかりませんが、このサイトでの最初の回答です。ユーザーがプロセスを強制終了するのを防ぐ代わりに。(ルートキットのフックが必要です。) タスク マネージャーがレジストリ入力で使用されないようにするだけです。

public static void ToggleTaskManager(bool toggle)
{
    Microsoft.Win32.RegistryKey HKCU = Microsoft.Win32.Registry.LocalMachine;
    Microsoft.Win32.RegistryKey key = HKCU.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
    key.SetValue("DisableTaskMgr", toggle ? 0 : 1, Microsoft.Win32.RegistryValueKind.DWord);
}
于 2013-01-11T12:59:19.640 に答える
3

多くの人がその方法を知っているかもしれませんが、ここには投稿しません。悪意のあるコードをインターネットに投稿することは非常に危険です。あなたが危険にさらされている可能性があることを誰が知っていますか。コンピューターエンジニアに聞いてください。ただし、プログラムの構造を示します。

プログラムの dll を explorer.exe に挿入するだけです。

プロセスはプログラムとして実行されているのではなく、プログラム (explorer.exe) で実行されているため、表示されません。ユーザーは、どんな種類のタスク マネージャーを使用しても、そのプロセスを見ることはできません。

于 2013-08-06T15:19:32.920 に答える
3

上で述べたように、最良の方法は 2 つのタスクを監視することです。CPU を無駄にしたくないことは理解しています。そのため、タスクが閉じたときにトリガーされるタスク間にイベントを確立するのが最善の方法です。

フックの設定方法については完全にはわかりませんが、CPU を浪費する while ループは使用しません。

于 2009-12-27T17:43:21.653 に答える
3

これを行う簡単な方法やサポートされている方法はありません。それを行うためのルートキットを作成したとしても、その穴を塞ぐために作成された将来の更新によって非常に簡単に壊れてしまう可能性があります。それがやりたいことなのか、もう一度考えてみます。

于 2008-10-09T16:27:52.153 に答える
2

サービスを書くことを見たことがありますか?このように、サービスはローカル システムとして実行され、アプリケーションはユーザーのコンテキストで実行されます。サービスは、必要に応じて処理が行われることを保証できます。アプリケーションは、このサービスへのインターフェイスにすぎません。アプリケーションを強制終了すると、通知やシステム トレイ アイコンなどが表示されなくなりますが、サービスは引き続き機能します。

于 2010-03-24T16:48:17.210 に答える
1

プロセスを強制終了しないようにユーザーに依頼するのはどうですか? 同じ会社の従業員からすると明らかに幼稚な行動に対して、あなたがそれに費やす時間。

于 2008-10-09T16:40:20.240 に答える
0

プロセスが永久に強制終了されるのを止めるには、プロセスが最初に行うことは、'atexit()' を呼び出し、atexit() 関数でプロセスを開始することです。

于 2015-03-31T18:36:32.200 に答える