WinDbgでコードパッチを簡単に検出する

!chkimgコマンドを使うと、コードパッチを簡単に検出することができる。以下の実行例では、ntカーネル(ntoskrnl.exe)に10byteの改ざんがあること、それらが5byteの改ざん2つ(そして関数フック)であることを確認している。

C:\>livekd
...

0: kd> .exepath c:\windows\system32
Executable image search path is: c:\windows\system32
Expanded Executable image search path is: c:\windows\system32

0: kd> !chkimg nt
10 errors : nt (8332b2d0-8332b349)

0: kd> !chkimg -d  nt
    8332b2d0-8332b2d4  5 bytes - nt!InbvSolidColorFill
        [ 8b ff 55 8b ec:e9 11 ce 26 06 ]
    8332b345-8332b349  5 bytes - nt!InbvSetTextColor (+0x75)
        [ 8b ff 55 8b ec:e9 e0 cd 26 06 ]
10 errors : nt (8332b2d0-8332b349)

0: kd> u 8332b2d0
nt!InbvSolidColorFill:
8332b2d0 e911ce2606      jmp     bsodp_nt+0x10e6 (895980e6)
8332b2d5 51              push    ecx
8332b2d6 51              push    ecx
...

0: kd> u 8332b345
nt!InbvSetTextColor:
8332b345 e9e0cd2606      jmp     bsodp_nt+0x112a (8959812a)
8332b34a 83ec0c          sub     esp,0Ch
8332b34d 6a25            push    25h
...


SSDTなどのデータの改ざんは検出できないものの、モジュール全体を(関数のエントリーポイントに限定したりしないで)調査するので、とりあえずlivekdからたたいて見るのも良いかもしれない。もちろん、ユーザーモードプロセスのフックを検出したいのであれば、プロセスにアタッチしてたたいても良い。

原理は調べていないのだけど(少なくともProcmonで見る限り、ディスクイメージを開いて比較、とかではない模様)、コードパッチ自体を隠蔽しようとするようなRootkitはかなりレアだと思われるので、結構効果的なのではないかと思う。

ただし、改ざんがあった=ウイルスの所為 ではない。感染していない環境でも改ざんが行われていることがあるので、正常時のベースラインを把握しておくことが重要。