オブジェクトのメソッドフック

以前に記事にしていたものを実装しました(ObHook.cab)。適当な方法でロードさせると、ProcessオブジェクトのOpenメソッドをフックして、デバッグ文字列を出力します。

2000 SP4 / XP SP3 / Vista SP1 で動作確認していますが、コードの質的な意味で実機での動作は推奨しません。あと、ドライバをロードするコードは用意していないので適当に対応してださいな。


画像はフックした様子。DbgViewにログがいっぱいでます。

このドライバをSERVICE_SYSTEM_STARTにした状態でリブートすると、Systemがsmss.exeをCreateする様子などがつぶさに見えます。

Vista SP1では

内容的にObRegisterCallbacksを使ったアプローチに近い。今回扱ったOpenメソッドは、XPではアクセスマスクの値が非参照(プリミティブっていうのかな?)で渡されてくるため変更はできない。しかしVista SP1では引数の数が変化し、OB_PRE_OPERATION_INFORMATIONないしはOB_PRE_OPERATION_PARAMETERSによく似た引数が渡されてくる(詳細は未調査)。アクセスマスクなどはポインタで渡されるため変更可能と思われる。もう少し、調べてみたいところ。

08/05/25 追記
NTSTATUS NTAPI V6KRNL::NewPsOpenProcedure(
    IN OB_OPERATION Operation,                    // たぶんOK
    IN ULONG  Flags,                              // 非常に怪しい
    IN PEPROCESS Process,                         // OK
    IN PVOID Object,                              // OK(PEPROCESS)
    IN POB_PRE_OPERATION_PARAMETERS  Parameters,  // 非常に怪しい
    IN ULONG HandleCount);                        // 謎(常に 0

シグネチャの特徴は OB_PRE_OPERATION_INFORMATION とも違うようだ。第一引数をOB_OPERATIONと仮定したとき、OB_OPERATION_HANDLE_DUPLICATE が来た場合には第四引数をOB_PRE_DUPLICATE_HANDLE_INFORMATIONと解釈しなければいけないのだが、ぜんぜん、ちがう。まあいっか。