PsSetLoadImageNotifyRoutineのテスト

とりあえずPsSetLoadImageNotifyRoutineのテストドライバの開発に成功.と言っても,何もしないフィルタドライバのサンプルコードに以下のようなコードを追加するだけ.

まずDriverEntry関数内にて,

NTSTATUS status = PsSetLoadImageNotifyRoutine( LoadImageCallback );

次にDriverUnload用のディスパッチルーチン内にて,

NTSTATUS status = PsRemoveLoadImageNotifyRoutine( LoadImageCallback );

とする.もちろんエラー処理等も行うが,ここでは省略.そして最後にプロセス構造ルーチンは以下のようになる.

VOID LoadImageCallback(
IN PUNICODE_STRING FullImageName,
IN HANDLE ProcessId,
IN PIMAGE_INFO ImageInfo
)
{
....
}

このプロセス構造ルーチン内に適当な処理を追加するだけで良い.ちなみにFullImageNameには,メモリ空間にマッピングされるイメージの名前.ProcessIdには,イメージがマッピングされるプロセスのID.ImageInfoには,イメージのベースアドレスやサイズなどが構造体として格納されている.これらを適宜利用しつつ,目的の処理を行えば良いことになる.

私が今回作成したテストドライバは,このプロセス構造ルーチン内でDbgPrintを行い,正しくイメージ名等が取得できているのかをテストするという,非常に単純なものだ.これでPsSetLoadImageNotifyRoutineの使用方法は(何とか)理解できたため,次はそのイメージをZwReadVirtualMemoryでリードしてみるテストだ.