Windowsユーザーモード実行可能ファイルを手動で解凍すると、そのEntryPoint(またはTLS)で簡単に中断し、元のEntryPointに到達するまでトレースできます。ただし、パックされたドライバーではそれは不可能です。
Windowsドライバーを手動で確実に解凍するにはどうすればよいですか?
Windowsユーザーモード実行可能ファイルを手動で解凍すると、そのEntryPoint(またはTLS)で簡単に中断し、元のEntryPointに到達するまでトレースできます。ただし、パックされたドライバーではそれは不可能です。
Windowsドライバーを手動で確実に解凍するにはどうすればよいですか?
特にカーネルデバッグのファンでない場合は、サブシステムの変更についてのあなたの答えが好きです。でも、私はWindbgの大ファンです。これを行う方法は次のとおりです。
カーネルは、ドライバーで DriverEntry()
を呼び出し、デバッガーに侵入する必要があります。次に、とにかく行ったように、OEPが見つかるまでコードをトレースできます。このメソッドの主な利点は、解凍中にドライバーが実行する可能性のあるカーネルDLLや呼び出しを偽造する必要がなく、x64で機能することです。
DriverInit関数にINT3でパッチを適用する代わりに、DriverInitの呼び出しを担当する IopLoadDriver 関数にブレークポイントを設定することもできます。 Windows XP SP3では、ブレークポイントは IopLoadDriver + 0x66a に追加する必要があります。これは call dword ptr [edi + 2Ch]
です(0x2Cは_DRIVER_OBJECT.DriverInitです)。
x nt!IopLoadDriver
他のWindowsバージョンのオフセット:
(他のバージョンのWindows用のオフセットがある場合、この回答を編集してください)
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