質問:
Windowsドライバーを手動で確実に解凍するにはどうすればよいですか?
Ange
2013-03-30 01:43:20 UTC
view on stackexchange narkive permalink

Windowsユーザーモード実行可能ファイルを手動で解凍すると、そのEntryPoint(またはTLS)で簡単に中断し、元のEntryPointに到達するまでトレースできます。ただし、パックされたドライバーではそれは不可能です。

Windowsドライバーを手動で確実に解凍するにはどうすればよいですか?

それらすべての最大のものを見逃さない人、Softice
四 答え:
mrduclaw
2013-03-30 07:19:14 UTC
view on stackexchange narkive permalink

特にカーネルデバッグのファンでない場合は、サブシステムの変更についてのあなたの答えが好きです。でも、私はWindbgの大ファンです。これを行う方法は次のとおりです。

  1. カーネルデバッガーをVMに接続します
  2. ドライバーのエントリポイントの最初のバイトをINT3(0xCC)に変更します。
  3. PEチェックサムを修正します(私は pefileにこの作業を任せるのが好きです)。
  4. VMにドライバーをロードします( OSRには優れたドライバーローダーがあります)
  5. ol>

    カーネルは、ドライバーで DriverEntry()を呼び出し、デバッガーに侵入する必要があります。次に、とにかく行ったように、OEPが見つかるまでコードをトレースできます。このメソッドの主な利点は、解凍中にドライバーが実行する可能性のあるカーネルDLLや呼び出しを偽造する必要がなく、x64で機能することです。

ただし、新しいWindowsバージョンでは壁にぶつかる可能性があります。 OPの答えはその意味でより用途が広いですが、あなたの答えは確かにより専門的です:) ...ドライバーのロードの必要性のために `devcon`も忘れないでください(DDK / WDKのソースに付属しています)
@0xC0000022L新しいバージョンのWindowsではこれに問題はありません。テスト署名を有効にするなどの通常の操作を実行するだけです。確かに、Windows8では試していません。何か変わった?
@mrduclawドライバのエントリポイントの最初のバイトをINT3に変更するにはどうすればよいですか?!??
@AminM返信が遅れて申し訳ありませんが、このアカウントを長い間チェックしていません。 IDAでファイルを開き、エントリポイントがある場所のバイトを見つけます。 16進エディターで開き、0xCC(ブレークポイント)に変更します。または、最近はIDAで直接編集することもできます。幸運を!
Ange
2013-03-30 01:43:20 UTC
view on stackexchange narkive permalink
  1. ドライバーサブシステムをGUIに変更します(ユーザーモードバイナリに変換します)
  2. インポートのRVAをクリアするか、偽のカーネルDLLのセットを使用します(32ビットのみ)インポートの読み込みを有効にするには
  3. デバッガーで起動し、ユーザーモードのように続行します。元のEntryPointに到達する前に、いくつかのAPI呼び出しをシミュレートする必要があります。
  4. ol>
ekse
2013-08-14 01:15:14 UTC
view on stackexchange narkive permalink

DriverInit関数にINT3でパッチを適用する代わりに、DriverInitの呼び出しを担当する IopLoadDriver 関数にブレークポイントを設定することもできます。 Windows XP SP3では、ブレークポイントは IopLoadDriver + 0x66a に追加する必要があります。これは call dword ptr [edi + 2Ch] です(0x2Cは_DRIVER_OBJECT.DriverInitです)。

  1. x nt!IopLoadDriver
  2. でIopLoadDriverを検索します。IopLoadDriver+ 0x66aにブレークポイントを追加します
  3. ドライバーを読み込んで起動します
  4. ol>

    他のWindowsバージョンのオフセット:

  • Windows 7 Pro SP1 32ビットドイツ語:nt!IopLoadDriver + 0x7eb
  • Windows 7 Ultimate64ビット米国:nt!IopLoadDriver + 0xA04
  • Windows 10 Pro x64米国:nt!IopLoadDriver + 0x51C(ビルド10586.420)

(他のバージョンのWindows用のオフセットがある場合、この回答を編集してください)

ちょっとした情報。リバーサーとして組み合わせることができる小片を持っていることは常に価値があります。また、ReactOSのソースコードを見ると、Windowsでの実装の詳細を正確に推測できることを忘れないでください。
blabb
2013-08-14 05:43:33 UTC
view on stackexchange narkive permalink

nt!IopLoadDriver 間接呼び出しは、SERVICE_DEMAND開始ドライバーエントリにのみ使用されます

ブートロードドライバーの場合、 nt!IopInitializeBuiltInDriver で中断する必要があります間接呼び出しも

このリンクのメッセージ#17 &#18に短い例があります

http://www.osronline.com/showthread.cfm ?link = 231280

これは休止状態のスクリプトです(gcを使用するように少し編集されています(推奨されるように移動する代わりに条件付きから移動します)。これは永遠に待機し続け、いつでも!drvobjの詳細を出力します。ドライバーはカーネルデバッグセッションでロードされます

コマンドを1行にする必要があります

  .foreach / pS 1 / ps 10(place {#call * dword * ptr * \ [* \ + * \] nt!IopInitializeBuiltinDriver}){bu place ".printf \"%msu \\ n \ "、poi(esp + 4); r $ t0 = poi(esp); gu ;!drvobj $ t0 2; gc "}。foreach / pS 1 / ps 10(place {#call * dword * ptr * \ [* \ + * \] nt!IoploadDriver}){bu place" .printf \ "% msu \\ n \ "、poi(esp + 4); r $ t1 = poi(esp); gu;!drv obj $ t1 2; gc "}  

xp sp3 vm

接続されたkdセッションで sxe ibp; .reboot kdは、再起動時に最初の中断を要求します(boot.iniの/ breakスイッチと同等)。中断すると、このスクリプトを実行します。

  $$ >a< "thisscript.extension" コード> 

すべてのシステムドライバーエントリポイントとそのドライバーオブジェクトを印刷することに加えて

アプリケーションが追加のドライバーをロードすると、それらの詳細も印刷されます

ターゲットVMで開かれたsysinternalsdbgviewのサンプル出力

カーネルキャプチャを有効にする(ctrl + k)をチェックマークを付けると、dbgv.sysエントリポイントが呼び出されます

  \ REGISTRY \ MACHINE \ SYSTEM \ ControlSet001 \ Services \ DBGV ***エラー:モジュールのロードは完了しましたが、Dbgv.sysDriverオブジェクト(ffbd6248)のシンボルをロードできませんでした:\ Driver \ DBGVDriverEntry:f6d89185 DbgvDriverStartIo :00000000 DriverUnload:00000000 AddDevice:00000000ディスパッチルーチン:
[00] IRP_MJ_CREATE f6d87168 Dbgv + 0x1168 [01] IRP_MJ_CREATE_NAMED_PIPE 804fa87e点!IopInvalidDeviceRequest [02] IRP_MJ_CLOSE f6d87168 Dbgv + 0x1168 [03] IRP_MJ_READ 804fa87e点!IopInvalidDeviceRequest [04] IRP_MJ_WRITE 804fa87e点!IopInvalidDeviceRequest [05] IRP_MJ_QUERY_INFORMATION 804fa87e点!IopInvalidDeviceRequest 06 IRP_MJ_SET_INFORMATION 804fa87eポイント!IopInvalidDeviceRequest [07] IRP_MJ_QUERY_EA 804fa87eポイント!IopInvalidDeviceRequest [08] IRP_MJ_SET_EA 804fa87eポイント!IopInvalidDeviceRequest [09] IRP_MJ_FLUSH_BUFFERS 804fa87eポイント!IopInvalidDeviceRequest [0A] IRP_MJ_QUERY_VOLUME_INFORMATION 804fa87eポイント!IopInvalidDeviceRequest [0B] IRP_MJ_SET_VOLUME_INFORMATION 804fa87eポイント!IopInvalidDeviceRequest [0C] IRP_MJ_DIRECTORY_CONTROL 804fa87e nt!IopInvalidDeviceRequest [0d] IRP_MJ_FILE _SYSTEM_CONTROL 804fa87e点!IopInvalidDeviceRequest [0E] IRP_MJ_DEVICE_CONTROL f6d87168 Dbgv + 0x1168 [0F] IRP_MJ_INTERNAL_DEVICE_CONTROL 804fa87e点!IopInvalidDeviceRequest [10] IRP_MJ_SHUTDOWN 804fa87e 11点!IopInvalidDeviceRequest IRP_MJ_LOCK_CONTROL 804fa87e 12点!IopInvalidDeviceRequest IRP_MJ_CLEANUP 804fa87e点!IopInvalidDeviceRequest [13] IRP_MJ_CREATE_MAILSLOT 804fa87e 14点!IopInvalidDeviceRequest IRP_MJ_QUERY_SECURITY 804fa87e 15点!IopInvalidDeviceRequest IRP_MJ_SET_SECURITY 804fa87e 16点!IopInvalidDeviceRequest IRP_MJ_POWER 804fa87e 17点!IopInvalidDeviceRequest IRP_MJ_SYSTEM_CONTROL 804fa87e 18点!IopInvalidDeviceRequest IRP_MJ_DEVICE_CHANGE 804fa87e 19点!IopInvalidDeviceRequest IRP_MJ_QUERY_QUOTA 804fa87e点! IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA 804fa87e nt!IopInvalidDeviceRequest [1b] IRP_MJ_PNP 804fa87e nt!IopInvalidDeviceRequest  


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...