をいただければ幸いそして、すべてが働いていたが、LIST_ENTRY間接参照しようとするとx64の上でそれをクラッシュされます。任意のポインタ/ヒントが大いに評価されます
カーネルデバッガを接続することができれば、DriverSectionオブジェクトが定義に一致するかどうかを確認できます。これを行うには、デバッグしたいドライバを選んでください。私は単純なドライバを使用する傾向があります。記号パスをpdbを含むように固定してから、windbgまたはkdに改行して入力します。
.reload
シンボルをリロードするには、次のように入力します。次に、ドライバをロードすることができます。
sc start drivername
レガシードライバであると仮定してサービスを作成しました。タイプ:
bu drivername!DriverEntry
このモジュールのDriverEntryにブレークポイントを設定します。 bp
とbu
の違いは、bu
ブレークポイントが評価され、モジュールのロード時に設定されることです。現在は、当然のことながら、DriverEntry
は呼び出されませんが、我々は、ドライバを再ロードする場合はそれがされます:
sc stop drivername
sc start drivername
今、あなたのブレークポイントがヒットしなければならないし、それがポインタ引数とポインタであるため、RCXは、DRIVER_OBJECT
構造が含まれています/整数引数は、Windows ABIに従ってrcx、rdx、r8、r9に渡されます。したがって、ドライバオブジェクト構造体を以下のように出力することができます。
dt _DRIVER_OBJECT (address of rcx)
ドライバセクションへのポインタが表示されます。次に、タイプ:
dt _LDR_DATA_TABLE_ENTRY (driver section object pointer)
これはあなたにあなたのドライバセクションのオブジェクトを与える必要があります。 _LDR_DATA_TABLE_ENTRY
はWindowsのシンボルに実際に存在しているので、これは動作します。デバッガを使用して
、あなたがNT _LDR_DATA_TABLE_ENTRY structure, for example). If you do it successfully, one of those addresses will resolve to
のアドレスにdpps
を試してみてください(成功しLIST_ENTRY
ポインタ(.flink
と.blink
)を逆参照のことができるようにすべきである!PsLoadedModuleList`。
私は何をしようとしています言うことを遠回しに、ということであるということである:どちらかあなたのコードにバグがどこかにあり
- 、または
- 同期の問題が発生しました。この構造は不透明であると考えられており、何らかの形でそれを変更することは想定されていません。それは私たちの上で変わる可能性もあり、アクセスを同期させるためのロックがどこにあるのかわかりません。
1が当てはまらない場合は、2つの可能性があります。幸いにもMicrosoftは実際にAuxKlibQueryModuleInformation()
と呼ばれるこれらの構造から情報を取得する機能を提供しました。ドライバに余分なライブラリを追加する必要がありますが、それは世界の終わりではありません。 Aux_klib.h
を含みます。 MSDNのページには、それを使用する方法を示すコードサンプルがあります - それはかなり簡単です。