Eri*_*rik 3 windbg driver wdk device-driver
我刚开始开发驱动程序.对于一些加载,卸载和调试的实验,我编写了以下简单的驱动程序:
#include <ntddk.h>
void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UNREFERENCED_PARAMETER(pDriverObject);
DbgPrint("Driver unloading\n");
}
NTSTATUS DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = DriverUnload;
DbgPrint("Hello, World\n");
return STATUS_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我编译了我的目标系统驱动程序,Windows 7 64位,带有调试符号,将其复制到目标系统并加载并使用OSR Driver Loader运行它.
一切正常,我可以卸载并加载驱动程序:
我可以使用串行连接与WinDbg连接,并可以成功中断并运行目标系统.但是,当我尝试设置断点时会出现问题.
我最初尝试像这样设置断点:
kd> bp MyDriver1!DriverEntry
但问题是,如果我重新加载驱动程序并检查断点:
kd> bl
0 e fffff880`03572010 0001(0001)<Unloaded_MyDriver1.sys> + 0x1010
对于我作为初学者,它看起来不好(卸载?)并且在加载时没有发生中断.
所以,我发现在加载模块时可以设置断点:
kd> bu MyDriver1
0 e fffff880`03578000 0001(0001)MyDriver1!DriverEntry <PERF>(MyDriver1 + 0x0)
当我在上述命令之后继续系统执行并加载驱动程序(net start MyDriver1)时,系统崩溃:
中断指令异常 - 代码80000003(第一次机会)
- *
- 您看到此消息是因为您按了*
- CTRL + C(如果你运行控制台内核调试器)或*
- CTRL + BREAK(如果你运行GUI内核调试器),*
- 在调试器机器的键盘上.*
- *
- 这不是一个BUG或系统崩溃*
- *
- 如果您不打算进入调试器,请按"g"键,然后按*
- 现在按"Enter"键.此消息可能会立即重新出现.如果它*
- 确实如此,再次按"g"和"Enter".*
- *
nt!RtlpBreakWithStatusInstruction:fffff800
028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff88003572010 0001(0001)MyDriver1!DriverEntry <PERF>(MyDriver1 + 0x0)
kd> bc 0 kd> bl 1 e fffff880`03578000 0001(0001)
MyDriver1!DriverEntry(MyDriver1 + 0x0)
kd> g访问冲突 - 代码c0000005(!!!第二次机会!!!)
nt!IopUnloadDriver + 0x327:fffff800`02cb8b29 0fb74844 movzx
ecx,word ptr [rax + 44h]
最后,如果我现在继续执行,我会得到一个BSOD ......
这里有什么不对?我的代码是错误的还是我没有正确设置断点?
您正在寻找的命令是sxe ld:MyDriver1
当驱动程序映射到内存但在调用MyDriver1!DriverEntry之前,这将会中断,并允许您在DriverEntry中放置断点.
该命令bu MyDriver1将断点放在驱动程序映像的PE头的第一个字节中.
此外,卸载驱动程序后清理断点,否则会导致调试程序修改可能为其他内容分配的内存.