多くのマルウェア実行可能ファイルは、フックを使用して見えないようにします。私はいくつかのフック方法に精通していますが、それらを検出するためにどのような方法が存在するのかわかりません。関数呼び出しがフックを介して他のタスクを実行するように変更されたことを通知する方法はありますか?
フック は、さまざまな方法で実装されています。
PeekMessage
)-ウィンドウ通知メッセージへのフック。PsSetCreateProcessNotifyRoutine
のような正当なコールバック。最初の2つのタイプに最も興味があると思います。
ジャンプフックは、ほぼ無限の方法で作成できます。これにより、フックを識別するツールを作成することがほとんど不可能になります。ただし、整合性チェックのトリックを使用できます。バイナリファイル内のコード(exe
またはdll
など)をメモリ内のコードと比較します。 WriteProcessMemory
やその他のAPIをフックして、プロセスメモリの変更を検出することもできますが、これはユーザーモードの攻撃に対してのみ機能します。
IATフックはチェックが少し簡単です。プロセスの開始時に(静的バイナリからなど)プロセスのIATのスナップショットを取得し、メモリ内のIATをそこにあるはずの関数の実際のアドレスと比較します。たとえば、IATエントリ4がuser32.MessageBoxA
を指していることがわかっている場合、GetProcAddress
を使用してその関数の実際のアドレスを検索し、IAT内のアドレスをそれと比較できます。それらが一致しない場合、あなたはそれが夢中になっていることを知っています。
さらに読むために、この件については素晴らしい paper があります。BillBlundenによる " The Rootkit Arsenal "を読むことを強くお勧めします。