Windows下64位驱动调试方法

尴尬的境地 囧

很多时候,我们写的驱动是64位的,而这种64位驱动是不可以在代码中加入_asm int 3 中断来实现在合适的地方进入中断。因为vs此时会报:error C4235: 使用了非标准扩展: 不支持在此结构上使用“_asm”关键字 。
而目标平台又要求一定是64位的,因此这就很尴尬了。

好在,使用WinDBG可以解决这个问题。核心原理是WinDbg向gdb一样支持 按函数名下断点。因此,我们可以下类似于:WinDivert64!DriverEntry 这样的断点。其中WinDivert64是驱动名,而DriverEntry是想要在这个驱动的内存空间中断的函数名,这个函数名可以是自己按需要写入自己任意想要中断的函数名。

使用WinDbg 调试驱动程序

配置好WinDbg

配置方法见:https://blog.csdn.net/nonecode/article/details/82491923

配置好符号表路径

注意了!!!!配置符号表时,一定要把VS生成 .sys 所在的目录加入到符号表路径里面!!!符号表文件名并非与驱动文件同名!!!! 本人在这个地方绕了很大的弯子。

例如: 本人写了一个驱动,在VS里面 驱动的项目名叫做Driver。但是我想把它取名成WinDivert64.sys,于是我先把生成的驱动文件Driver.sys改为WinDivert64.sys,同时把Driver.pdb也改成了WinDivert64.pdb,(个人想让他们保持一致),然后把WinDivert64.sys拷贝到虚拟机中。在虚拟机是可以加载驱动的。但是!!!WinDdg无论如何也加载不了WinDivert64.pdb这个符号表。。。通过一系列的方式,最终的结论是 WinDdg在寻找WinDivert64.sys的符号表时其实寻找的是Driver.pdb这个文件,而不是我们手动修改后的WinDivert64.pdb。
结论就是:驱动的符号表文件*.pdb 的文件名不宜修改。

遇到加载问题,我们可以在WinDdg里面使用 !sym noisy 和 .reload命令来调试。

例如,在本人这个案例中:
先输入 ! sym noisy
得到输出:

kd> !sym noisy
noisy mode - symbol prompts on

然后输入:.reload WinDivert64 ,WinDivert64是模块名,这个名字是我们在开发驱动程序时自己设置的。
得到输出:

···
SYMSRV:  BYINDEX: 0x36
         E:\Windows Kits\10\Debuggers\x64\sym
         Driver.pdb
         B2E97F0D622F4B8EA1ADFB2C132268E51
···

从这里可以看到,WinDbg寻找的其实是Driver.pdb文件,而这个文件是VS在编译驱动时生成的。因此,我们应该把VS生成驱动的release或debug输出目录条件到WinDbg的符号表路径里面。

添加源码目录

在WinDbg里面添加驱动的源码所在的目录;如果文件在多个文件目录,不同目录用分号隔开。

加断点

设置好符号表后,我们就可以加断点了。
在WinDbg里面输入:bp WinDivert64!DriverEntry
然后通过sc或net命令,或者自己写代码去加载我们的驱动。
在驱动的入口点,驱动被中断,得到输出:

kd> bp WinDivert64!DriverEntry
Bp expression 'WinDivert64!DriverEntry' could not be resolved, adding deferred bp
kd> 
Bp expression 'WinDivert64!DriverEntry' could not be resolved, adding deferred bp
kd> g
SYMSRV:  BYINDEX: 0x36
         E:\Windows Kits\10\Debuggers\x64\sym
         Driver.pdb
         B2E97F0D622F4B8EA1ADFB2C132268E51
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pdb - path not found
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pd_ - path not found
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\file.ptr - path not found
SYMSRV:  RESULT: 0x80070003
SYMSRV:  BYINDEX: 0x37
         E:\Windows Kits\10\Debuggers\x64\sym*https://msdl.microsoft.com/download/symbols
         Driver.pdb
         B2E97F0D622F4B8EA1ADFB2C132268E51
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pdb - path not found
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pd_ - path not found
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\file.ptr - path not found
SYMSRV:  HTTPGET: /download/symbols/Driver.pdb/B2E97F0D622F4B8EA1ADFB2C132268E51/Driver.pdb
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  HTTPGET: /download/symbols/Driver.pdb/B2E97F0D622F4B8EA1ADFB2C132268E51/Driver.pd_
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  HTTPGET: /download/symbols/Driver.pdb/B2E97F0D622F4B8EA1ADFB2C132268E51/file.ptr
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  RESULT: 0x80190194
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pdb - path not found
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pd_ - path not found
SYMSRV:  UNC: E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\file.ptr - path not found
DBGHELP: c:\windivert\x64\Driver.pdb cached to E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pdb
DBGHELP: WinDivert64 - private symbols & lines 
        E:\Windows Kits\10\Debuggers\x64\sym\Driver.pdb\B2E97F0D622F4B8EA1ADFB2C132268E51\Driver.pdb
Breakpoint 0 hit
Breakpoint 1 hit
WinDivert64!DriverEntry:
fffff880`0311d8c0 48895c2418      mov     qword ptr [rsp+18h],rbx

可见,已经中断好了。然后,WinDbg自动打开驱动的源码文件,其效果如下图所示:左边是代码,右边是调试信息,可以直接在里面设置断点,调试的快捷键和Visual Studio一样!
Windows下64位驱动调试方法_第1张图片

自由发挥吧

接下来,就可以好好调试了,使用方法和VS里面的调试方法一样。
1.插入断点:鼠标光标移动到指定的行,然后按F9,即可加入断点。加入断点后,行的前面会显示为红色。
在这里插入图片描述
2.单步跳过:F10
3.单步步入:F11
4.查看局部变量:Alt+3
Windows下64位驱动调试方法_第2张图片
效果:
Windows下64位驱动调试方法_第3张图片
5.追踪变量名Watch:Alt+2
Windows下64位驱动调试方法_第4张图片
效果:
Windows下64位驱动调试方法_第5张图片

你可能感兴趣的:(驱动开发)