Rootkitのようなデバイスドライバファイルを回収するツール

デバイスドライバカーネルにロードされたタイミングで、そのファイルをバックアップコピーするデバイスドライバを書いてみました(drvcopy.cab)。よければどうぞー。


マルウェアは、往々にしてデバイスドライバを使ってきます。デバイスドライバを動的に生成し、カーネル空間にロードさせます。有名なことですが、一度ロードされたドライバは、ディスク上から削除することができます。そして、デバイスドライバを使うマルウェアは、痕跡を消すためにかなりの割合で、自身が生成したデバイスドライバをディスク上から削除してしまいます。

削除されたドライバはProcess Explorerなどで確認すると一見してわかります。

デバイスドライバのファイルが削除される前に回収するには、デバッガで生成元にアタッチし、CreateServiceをブレークすることでディスク上にある状態で停止させることができます。

ただし、この方法は少し手間がかかります。マルウェアはたいていPack、アンチデバッグが施されており、機械的にCreateServiceにブレークを置いてもうまくいきません。

また、net系やscコマンドを発行したり、別プロセスにインジェクトしたスレッドからCreateServiceしたり、別のAPIを使うという可能性もあり、いずれの場合も手動での解析が必要になります。

この手間を減らすため(とカーネル空間内でのファイルIOの学習のため)、デバイスドライバカーネルにロードされたタイミングで、そのファイルをバックアップコピーするデバイスドライバを書いてみました。

このデバイスドライバをロードすると、以降のデバイスドライバのロード時にそのファイルを \WINDOWS\drvcopy\.sys という名前でコピーします。各 .sys に対応するもともとのファイル名は同じディレクトリの drvcopy.log に記録されていきます。

これを事前にロードさせておくことで、新たにロードされるドライバをすべて回収することができるようになります。また、このモジュールをブートドライバとして登録しておくことで、システム起動時のかなり早い段階からのドライバロードを監視しコピー出来るようになります。

>sc create drvcopy binpath= \systemroot\system32\drivers\drvcopy.sys start= boot group= "Boot Bus Extender" type= kernel
[SC] CreateService SUCCESS

このデバイスドライバを少し改変すると、ユーザー空間のファイルマップにも対応出来るようになります(この場合、CRC32ではなくMD5か何か、もっと衝突しづらいアルゴリズムに変更した方がよさそうです。)

ということで、皆様の日々のお仕事にお役立てくださいませ。*1  たぶん、リビルドすれば2000XP以降のすべてのOSで動きます。


あ…ありのまま 今 起こった事を話すぜ!
『おれは文章を書きあげたと思ったらなぜか「ですます調」になっていた』
な… 何を言ってるのか わからねーと思うが(ry

参考

CRC32の実装に「プログラミングのメモ帳」さまのコードを利用させていただきました。

*1:だれ宛だよ(笑