2012-01-26 5 views
0

win7のx64ビット版のDriverSectionポインタの構造は誰にも分かります。DRIVER_OBJECT.DriverSection

typedef struct _KLDR_DATA_TABLE_ENTRY { 
    LIST_ENTRY InLoadOrderLinks; 
    PVOID ExceptionTable; 
    ULONG ExceptionTableSize; 
    //ULONG padding1; 
    PVOID GpValue; 
    PVOID NonPagedDebugInfo; 
    PVOID DllBase; 
    PVOID EntryPoint; 
    ULONG SizeOfImage; 
    UNICODE_STRING FullDllName; 
    UNICODE_STRING BaseDllName; 
    ULONG Flags; 
    USHORT LoadCount; 
    USHORT __Unused5; 
    PVOID SectionPointer; 
    ULONG CheckSum; 
    //ULONG Padding2; 
    PVOID LoadedImports; 
    PVOID PatchInformation; 
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; 

そして、すべてが働いていたが、LIST_ENTRY間接参照しようとするとx64の上でそれをクラッシュさ:32ビットでは、私は次のように使用しました。任意のポインタ/ヒントが大幅

答えて

0

をいただければ幸いそして、すべてが働いていたが、LIST_ENTRY間接参照しようとするとx64の上でそれをクラッシュされます。任意のポインタ/ヒントが大いに評価されます

カーネルデバッガを接続することができれば、DriverSectionオブジェクトが定義に一致するかどうかを確認できます。これを行うには、デバッグしたいドライバを選んでください。私は単純なドライバを使用する傾向があります。記号パスをpdbを含むように固定してから、windbgまたはkdに改行して入力します。

.reload 

シンボルをリロードするには、次のように入力します。次に、ドライバをロードすることができます。

sc start drivername 

レガシードライバであると仮定してサービスを作成しました。タイプ:

bu drivername!DriverEntry 

このモジュールのDriverEntryにブレークポイントを設定します。 bpbuの違いは、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. 同期の問題が発生しました。この構造は不透明であると考えられており、何らかの形でそれを変更することは想定されていません。それは私たちの上で変わる可能性もあり、アクセスを同期させるためのロックがどこにあるのかわかりません。

1が当てはまらない場合は、2つの可能性があります。幸いにもMicrosoftは実際にAuxKlibQueryModuleInformation()と呼ばれるこれらの構造から情報を取得する機能を提供しました。ドライバに余分なライブラリを追加する必要がありますが、それは世界の終わりではありません。 Aux_klib.hを含みます。 MSDNのページには、それを使用する方法を示すコードサンプルがあります - それはかなり簡単です。