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はかなりレアだと思われるので、結構効果的なのではないかと思う。
ただし、改ざんがあった=ウイルスの所為 ではない。感染していない環境でも改ざんが行われていることがあるので、正常時のベースラインを把握しておくことが重要。