gpt4 book ai didi

crash - 从崩溃转储+ Windbg [BSOD]中检索IOCTL输入缓冲区内容

转载 作者:行者123 更新时间:2023-12-03 16:00:18 25 4
gpt4 key购买 nike

我们知道用户模式应用程序可以通过调用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的内核内存转储时。

所以我的问题是,是否有可能从内核内存转储中找到导致BSOD的格式错误的输入缓冲区和IOCTL代码,以便我可以使用简单的C prog重现BSOD。

从堆栈跟踪中可以找到,它在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

提前致谢,

最佳答案

您将需要nt!NtDeviceIoControlFile的函数签名。有了这个信息,就用ub b6e6a06f从nt!NtDeviceIoControlFile的返回地址反汇编。这将向您展示Ninja如何设置其对nt!NtDeviceIoControlFile的调用的参数。查找与ioctl代码和缓冲区相对应的arg,然后转储其内容。

请注意,寄存器将被重用,因此您可能需要在反汇编中进一步追溯以从非 Volatile 寄存器中获取正确的值,该值将在函数调用之前保存在堆栈中。

在windbg帮助文件(debugger.chm)中,有一个非常有用的页面,名为“x86 Architecture”。在这种情况下,您可能需要阅读标题为“寄存器”和“ call 约定”的部分。

关于crash - 从崩溃转储+ Windbg [BSOD]中检索IOCTL输入缓冲区内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22247604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com