18

ESet アンチウイルスを使用していますが、最近その GUI フロントエンド egui.exe がハングし、CPU の 50% (つまり、1 つのコアの 100%) を使用していました。驚くべきことに、デバッグ権限が有効になっていても、それを強制終了できないことがわかりました。

今、私は興味があります: 彼らはどのようにそのような防御を実装しているのでしょうか? また、カーネル ドライバーを書く以外にそれを無効にする方法はありますか?

egui.exe プロセスは通常のユーザー (非管理者) で実行され、管理者アカウントを使用してさまざまな方法で強制終了しようとしています。これが私が試したものです。

  • タスクマネージャからそれを殺すことはできません
  • pskill を使用してそれを殺すことはできません
  • プロセス エクスプローラーを使用して強制終了することも、デバッガーをアタッチすることもできません。

次に、プログラミングを開始したところ、次のことがわかりました。

  • 非特権ユーザーでは、PROSESS_TERMINATE アクセスで開くことができますが、TerminateProcess() への実際の呼び出しはエラー 5 で失敗します。

  • 管理者アカウントでは、(もちろんデバッグ権限を有効にした後) 必要なアクセス権で開くことができますが、TerminateProcess()、GetKernelObjectSecurity()、SetKernelObjectSecurity() の呼び出しはすべてエラー 5 で失敗します。

Terminate が DACL にない場合、そもそも PROCESS_TERMINATE を使用してプロセスを開くことができないため、これはプロセス DACL を設定するだけでなく、なんらかの操作を行っていることを明確に示しています。彼らは実際に Win32 API 呼び出しをインターセプトしていますか? はいの場合、どのように?低レベルのシステム プログラミングを行うのは久しぶりなので、私の無知を許してください。

4

2 に答える 2

6

Joanna Rutkowska から「System Virginity Verifier」を手に入れることができれば、フックがどこに実装されているかがよくわかるはずです。同様のツール ( GMERを含む) を使用して、システムの内部で何が起こっているかを調査できます。奇妙に聞こえるかもしれませんが、ウイルス対策ソフトウェアは、悪意のあるソフトウェアによく見られる手法、つまりルートキット手法を使用して、ソフトウェアが騙されないようにすることがあります。

プロセスを「保護」するために SSDT-Hooking および同様の手法が使用されているようです。これに対する私の最初の試みは、プロセスのすべてのスレッドを一時停止することです。このような (マルウェアとマルウェア対策の) 保護メカニズムのほとんどは、終了の試行時にのみトリガーされます。ただし、すべてのスレッドを一時停止すると (Process Explorer で実行できます)、スケジューラによってそれらのスレッドがスケジュールされなくなります (CPU 使用率がなくなります)。

SSDT (SDT の場合もある) は、System Service Descriptor Table の略です。これは、システム サービスの機能アドレスを持つテーブルです (システム サービスの番号がインデックスです)。Win32 アプリケーションからのようなものを呼び出すとCreateFile、NTDLL 呼び出しNtCreateFile(== ZwCreateFileUM) になります。そこから (Windows 2000/XP から変更された) メカニズムは、カーネル モード (KM)、別名「リング 0」に移行する方法が異なります。とにかく、NtCreateFileNTDLL での の実装は、大まかに次のことを行います。システム サービスのインデックスをレジスタに移動し、KM への移行に使用されるメソッドを呼び出します (sysenter新しい実装ではオペコード)。KM に到着すると、ハンドラーはインデックスをチェックし、SSDT から関数アドレスを見つけて、その関数を呼び出します。ここで (UM から来たときに) UM スタックのチェックが行われますが、これは簡単な言葉で言えばプロセスです。したがって、このレベルで機能をフックすると、Win32 サブシステムを含むすべてのサブシステムが何かを実行するのを防ぐことができます。ただし、これにはいくつかの問題が付随しています(あなたのものはそれらの中で最も少ないです)。ほとんどの実装者は悪い仕事をしています。これは、Sony が 2005 年に一部のオーディオ CD に配置することを選択したルートキットなどのマルウェアでよく見られます。そのため、バグ チェックといくつかの独立したコードの断片が同じものをフックする危険を冒さずに、フックを解除することは事実上不可能です。通常、SSDT インデックスは、実装者の無謀さによって問題が発生します。

したがって、スレッドを一時停止することは可能だと思われますが、この質問はもちろん、(ESET ドライバーの詳細を知らなくても) 自由回答のようなものです。ただし、それが妨げられる場合は、実際に製品の切り替えを検討する必要があります. そのような製品のシステム安定性に対する不利な点は、追加の「保護」よりも重要であると私は賭けています.

別の可能な方法は、コードを挿入し (たとえば、DLL を介して)、プロセス自体に を呼び出すことExitProcessです。これは、フックがこの抜け穴を許容するかどうかにも依存します。

于 2012-06-26T19:23:16.050 に答える
1

次のように、さまざまなケースが考えられます。

  1. 強制終了しようとしているプロセスの子スレッドがカーネル オブジェクトで待機している場合、待機が完了するまで終了しません。これにより、アプリケーションが応答を停止する可能性があります。プロセス内のスレッドはすべて終了のマークが付けられます。これは、プロセスの終了手順の 1 つです。
  2. ファイアウォール、AV、およびその他のセキュリティ関連のものなどのインテリジェントなソフトウェアは、常にカーネル フック (別名フック - カーネル オブジェクトまたはソフトウェア コンポーネント間で渡される API 呼び出し、メッセージ、またはイベントをインターセプト) をインストールします。彼らは常に外力から身を守る盾を持っています。

ERROR_ACCESS_DENIED を受信して​​います。どのような手順を経たかわかりませんが、次のことをお勧めします。

  1. タスク マネージャーを開き、[プロセス] タブに移動します。
  2. egui.exe を右クリックし、[プロパティ] をクリックします。
  3. [セキュリティ] タブをクリックし、[編集] をクリックします。
  4. [アクセス許可] ウィンドウで資格情報を確認します。
  5. ユーザーを追加するか、完全な権限を設定してください。

アプリを戦略化する場合でも(それはあなたがやろうとしたことだと思います)、アカウントの資格情報を使用するため、それをいじることができます。

于 2012-06-26T19:02:44.807 に答える