フックされているか調査する
そんなアプリ(とドライバ)を書いてます。とりあえず今のところ実装している、実装しようと考えている機能は以下。
- KeServiceDescriptorTableのフック検出
- KeServiceDescriptorTableShadowのフック検出
- /Deviceディレクトリから辿れる全デバイスオブジェクトのIRPハンドラのフック検出
- 指定したアドレスのインラインフックの検出(現在簡易実装)
- 関数名からアドレスを得る
- アドレスからシンボル名を得る(実装方法がわからない)
ユーザインターフェース(exe)を適当にパァーっと書いたら、随分とカオスなソースになってしまったのでうpはどうなるか知らない。
あと、できそうなのでやってみたいこと。
- IRPハンドラのフック
- カーネルオブジェクトのメソッドフック
- 0x90 でシフトさせた上でのインラインフック
before:0xXX 0xXX 0xXX 0xXX 0xXX after :0xE9 | address |
↑ではなくて↓のように先頭バイトにJMPを仕込まないようにすれば、多少は誤魔化しやすいんじゃないだろうか。
before:0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX after :0x90 0x90 0x90 0x90 0x90 0xE9 | address |