web-dev-qa-db-ja.com

フックされた関数とAPIを見つける方法は何ですか?

多くのマルウェア実行可能ファイルは、フックを使用して見えないようにします。私はいくつかのフック方法に精通していますが、それらを検出するためにどのような方法が存在するのかわかりません。関数呼び出しがフックを介して他のタスクを実行するように変更されたことを通知する方法はありますか?

5
Heeru West

フック は、さまざまな方法で実装されています。

  • 通常のコードではなくフックを指すように正当なジャンプ命令を変更します。
  • ユーザーコールテーブル(IAT)フッキング-プロセス内のユーザーモードAPIのアドレスを変更します。
  • カーネルコールテーブルのフック(SSDT/GDTなど)-コールテーブルポインターをフックのアドレスに置き換えます。
  • WndProcフック(例:PeekMessage)-ウィンドウ通知メッセージへのフック。
  • PsSetCreateProcessNotifyRoutineのような正当なコールバック。

最初の2つのタイプに最も興味があると思います。

ジャンプフックは、ほぼ無限の方法で作成できます。これにより、フックを識別するツールを作成することがほとんど不可能になります。ただし、整合性チェックのトリックを使用できます。バイナリファイル内のコード(exeまたはdllなど)をメモリ内のコードと比較します。 WriteProcessMemoryやその他のAPIをフックして、プロセスメモリの変更を検出することもできますが、これはユーザーモードの攻撃に対してのみ機能します。

IATフックはチェックが少し簡単です。プロセスの開始時に(静的バイナリからなど)プロセスのIATのスナップショットを取得し、メモリ内のIATをそこにあるはずの関数の実際のアドレスと比較します。たとえば、IATエントリ4がuser32.MessageBoxAを指していることがわかっている場合、GetProcAddressを使用してその関数の実際のアドレスを検索し、IAT内のアドレスをそれと比較できます。それらが一致しない場合、あなたはそれが夢中になっていることを知っています。

さらに読むために、この件については素晴らしい paper があります。BillBlundenによる " The Rootkit Arsenal "を読むことを強くお勧めします。

13
Polynomial