3

我刚开始开发驱动程序。对于加载、卸载和调试的一些实验,我编写了以下简单的驱动程序:

#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; 
}

我为我的目标系统 Windows 7 64bit 编译了带有调试符号的驱动程序,将其复制到目标系统并使用 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 内核调试器),*
  • 在调试器机器的键盘上。*
  • *
  • 这不是错误或系统崩溃 *
  • *
  • 如果您不打算闯入调试器,请按“g”键,然后 *
  • 现在按“Enter”键。此消息可能会立即再次出现。如果它 *
  • 确实,请再次按“g”和“Enter”。*
  • *

nt!RtlpBreakWithStatus 指令:fffff800 028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff88003572010 0001

(0001) MyDriver1!DriverEntry < 性能 > (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 ......

这里有什么问题?是我的代码错误还是我设置的断点不正确?

4

1 回答 1

5

您要查找的命令是 sxe ld:MyDriver1

这将在驱动程序映射到内存但在调用 MyDriver1!DriverEntry 之前中断,并允许您在 DriverEntry 处放置断点。

该命令bu MyDriver1在驱动程序映像的 PE 标头的第一个字节中放置一个断点。

此外,在卸载驱动程序后清理断点,否则会导致调试器修改可能分配给其他内容的内存。

于 2012-06-11T16:48:30.067 回答