1

ユーザー モード アプリケーションは、DeviceIoControl() API を呼び出すことによって、IOCTL コードとデータ バッファーをカーネル デバイス ドライバーに渡すことができることがわかっています。

BOOL WINAPI DeviceIoControl(
  _In_         HANDLE hDevice,
  _In_         DWORD dwIoControlCode, <--Control Code
  _In_opt_     LPVOID lpInBuffer,  <- Input buffer pointer
  _In_         DWORD nInBufferSize, <- Input buffer size
  _Out_opt_    LPVOID lpOutBuffer,
  _In_         DWORD nOutBufferSize,
  _Out_opt_    LPDWORD lpBytesReturned,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

ユーザー モード アプリケーションが IOCTL バッファをカーネル ドライバに渡し、何度も何度も BSOD を引き起こしている状況があります。BSOD のカーネル メモリ ダンプを取得するたびに。

私の質問は、単純な C プログラムを使用して BSOD を再現できるように、カーネル メモリ ダンプから BSOD を引き起こす正確な不正な入力バッファと IOCTL コードを見つけることは可能ですか?

スタック トレースからわかるように、ntDeviceIoContrilFile 呼び出しの直後にクラッシュします。

kd> kb
ChildEBP RetAddr  Args to Child              
b8048798 805246fb 00000050 ffff0000 00000001 nt!KeBugCheckEx+0x1b
b80487e4 804e1ff1 00000001 ffff0000 00000000 nt!MmAccessFault+0x6f5
b80487e4 804ed0db 00000001 ffff0000 00000000 nt!KiTrap0E+0xcc
b80488b4 804ed15a 88e23a38 b8048900 b80488f4 nt!IopCompleteRequest+0x92
b8048904 806f2c0a 00000000 00000000 b804891c nt!KiDeliverApc+0xb3
b8048904 806ed0b3 00000000 00000000 b804891c hal!HalpApcInterrupt2ndEntry+0x31
b8048990 804e59ec 88e23a38 88e239f8 00000000 hal!KfLowerIrql+0x43
b80489b0 804ed174 88e23a38 896864c8 00000000 nt!KeInsertQueueApc+0x4b
b80489e4 f7432123 8960e9d8 8980b300 00000000 nt!IopfCompleteRequest+0x1d8
WARNING: Stack unwind information not available. Following frames may be wrong.
b80489f8 804e3d77 0000001c 0000001c 806ed070 NinjaDriver+0x1123
b8048a08 8056a9ab 88e23a8c 896864c8 88e239f8 nt!IopfCallDriver+0x31
b8048a1c 8057d9f7 89817030 88e239f8 896864c8 nt!IopSynchronousServiceTail+0x60
b8048ac4 8057fbfa 00000090 00000000 00000000 nt!IopXxxControlFile+0x611
b8048af8 b6e6a06f 00000090 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
b8048b8c b6e6a5c3 00000001 00000090 00000000 Ninja+0x506f
b8048c80 b6e6ab9b 00000001 88da9898 00000090 Ninja+0x55c3
b8048d34 804df06b 00000090 00000000 00000000 Ninja+0x5b9b
b8048d34 7c90ebab 00000090 00000000 00000000 nt!KiFastCallEntry+0xf8
00f8fd7c 00000000 00000000 00000000 00000000 0x7c90ebab

前もって感謝します、

4

1 に答える 1

2

nt!NtDeviceIoControlFile の関数シグネチャが必要になります。その情報を使用して、nt!NtDeviceIoControlFile の戻りアドレスから逆アセンブルしub b6e6a06fます。これは、Ninja が nt!NtDeviceIoControlFile への呼び出しの引数を設定する方法を示しています。ioctl コードとバッファに対応する引数を見つけて、その内容をダンプします。

レジスタは再利用されるため、関数呼び出しの前にスタックに保存される不揮発性レジスタから正しい値を取得するために、逆アセンブリをさらに掘り下げる必要がある場合があることに注意してください。

windbg ヘルプ ファイル (debugger.chm) には、「x86 アーキテクチャ」という非常に役立つページがあります。この場合、「レジスタ」および「呼び出し規約」というタイトルのセクションを読むことをお勧めします。

于 2014-03-07T14:14:54.973 に答える