内核调试 - 如何在 DriverEntry 处设置断点?

逆向工程 调试 风袋 内核模式 虚拟机 司机
2021-06-27 01:32:29

我很抱歉我的英语不好。我是逆向工程的初学者。我有这样的问题。我得到了两个文件,一个是驱动程序的 .inf 文件,另一个是驱动程序的 .sys 文件。我的任务是调试这个驱动程序并了解它的功能(驱动程序没有物理设备)。我使用了 2 台机器,一台是主机,实际上是我的真实计算机和 XP 虚拟机(VMware)。我也使用 VirtualKD 和 Windbg。我想在它的 DriverEntry 上设置断点。

当我安装驱动程序时,我注意到它在安装后立即自动运行。所以我不能在 DriverEntry 设置断点。我重新启动虚拟机并使用以下所有命令在 Windbg 中设置断点:
bu Driver!DriverEntry(Driver 是驱动程序的 ClassName,我在 .inf 文件中看到它)
bu Drv!DriverEntry(Drv 是安装时的服务名称)
bu drv!DriverEntry (drv 是 sys 文件名,drv.sys)
但是 Windbg 没有捕捉到任何断点。看到Windbg打印了一些信息,不知道是不是断点抓不到:


* * 驱动程序正在映射它不拥有的物理内存 0064F000->006D0FFF *。这可能会导致内部 CPU 损坏。* 已检查的构建将在内核调试器中停止 * 因此可以完全调试此问题。*


错误:DavReadRegistryValues/RegQueryValueExW(4)。WStatus = 5 错误:DavReadRegistryValues/RegQueryValueExW(5)。WStatus = 5 错误:DavReadRegistryValues/RegQueryValueExW(6)。WStatus = 5 CodeSet_Init:没有 ICU 看门狗!WdUpdateRecoveryState:恢复启用。


我的第二个想法是在安装驱动程序之前回滚我的虚拟机并设置断点。但 Windbg 表示无法解决这些断点。当然,它不能击中任何一个。

我真的不知道如何设置这个驱动程序的条目。请帮我。谢谢你。

P/S:可能这个驱动程序可以通过管道与其他应用程序通信。如何在不影响其通信的情况下对其进行调试?

3个回答

您可以尝试中断驱动程序负载,而不是仅在条目上中断:

sxe ld drv.sys

这将在图像加载时停止 windbg,因此如果所有其他方法都失败,您将能够使用原始地址设置断点。

用 a 修补入口点的地址(0xcc aka int 3)并加载驱动程序 AddrOfEntryPoint 通常指向 DriverEntry 或 GsDriverEntry

当损坏时,您需要用原始字节替换 0xcc 并将 eip 重置为一个字节

use eb <address> originalbyte enter 
r eip = <addresss>

这里是 beep.sys 的入口点,它指向 Beep!driverEntry

lkd> lm m beep
start    end        module name
f7b0e000 f7b0f080   Beep       (pdb symbols)          f:\symbols\beep.pdb\65DC45B439164E4C9DEFF20E161DC74C1\beep.pdb
lkd> ? by(beep+3c) 
Evaluate expression: 208 = 000000d0
lkd> ? dwo(beep+dwo(beep+3c)+28)
Evaluate expression: 1644 = 0000066c
lkd> .printf "%y\n" , beep+66c
Beep!DriverEntry (f7b0e66c)
lkd>

您可以按照本网站评论中的步骤操作:

http://windbg.info/doc/1-common-cmds.html

这与伊戈尔建议的大致相同。