搭建Window驱动调试环境(Host:Win10 x64 + Target:VBox/WiN10 64)

一:

Host 软件:

系统:

Win10 64 位家庭版

软件包:

二:

Target 软件:

系统:

Win10 64 企业版

 

三:

让虚拟机和主机可以ping通

(1)为虚拟机新增一个网卡,选用桥接,界面名称选择你的主机现在使用的网卡,保证虚拟机和主机在同一网段就可以ping通过,有时主机不能ping通虚拟机,需要关闭虚拟机的防火墙:

搭建Window驱动调试环境(Host:Win10 x64 + Target:VBox/WiN10 64)

 

四:

开启调试步骤:

(1)在Target上以管理员模式在CMD中依次执行以下命令:

(2)在Host上以管理员模式在CMD中依次执行以下命令:

C:\> Cd C:\Program Files(x86)\Windows Kits\10\Debuggers\x64

WinDbg –k net:port=50000,key=1.2.3.4

(3)重启Target

(4)Host WinDbg 连接Target成功,可开始驱动调式。

五:

编写KMDF(内核模式驱动,基于WDF(Windows Driver Framework),另外还有一个WDM(Windows Driver Model)框架,现在很少使用)驱动:

(1)打开微软提供的示范项目:windows-driver-samples\general\echo\kmdf 下的kmdfecho.sln(下载:https://github.com/Microsoft/Windows-driver-samples)

(2)配置echo 和 echo2 的项目属性:

搭建Window驱动调试环境(Host:Win10 x64 + Target:VBox/WiN10 64)

搭建Window驱动调试环境(Host:Win10 x64 + Target:VBox/WiN10 64)

(3)编译项目:

(4)在Target安装证书:

  • 第一步:拷贝Windows-driver-samples\general\echo\kmdf\driver\AutoSync\x64 下的文件到Target, 比如我是C:\share
  • 第二步:在Target上安装证书,安装证书前需要对Target做以下操作:
  • a. Open Windows Settings.
  • b. In Update and Security, select Recovery.
  • c. Under Advanced startup, click Restart Now.
  • d. When the PC reboots, select Startup options. In Windows 10, select Troubleshoot > Advanced options > Startup Settings , then click Restart button.
  • e. Select Disable driver signature enforcement by pressing the F7 key.
  • f. Reboot the target computer.
  • 第三步:然后双击echo.cer按提示安装证书

(5)在Target上安装驱动:

  •     第一步:拷贝D:\Windows Kits\10\Tools\x64\devcon.exe 到,目标机器用于安装驱动;
  •     第二步:以管理员模式CMD执行 devcon install echo.inf root\ECHO(devcon install <INF file> <hardware ID>
  •     第三步:查看设备管理器,检查驱动是否安装,如下图
  • 搭建Window驱动调试环境(Host:Win10 x64 + Target:VBox/WiN10 64)

(5)测试驱动:

  • 第一步:拷贝与驱动交互的程序Windows-driver-samples\general\echo\kmdf\exe\x64\Debug\echoapp.exe 拷贝到Target
  • 第二步:在Target上执行程序,如下输出,说明成功:

C:\Samples\KMDF_Echo_Sample> echoapp
DevicePath: \\?\root#sample#0005#{cdc35b6e-0be4-4936-bf5f-5537380a7c1a}
Opened device successfully
512 Pattern Bytes Written successfully
512 Pattern Bytes Read successfully
Pattern Verified successfully
30720 Pattern Bytes Written successfully
30720 Pattern Bytes Read successfully
Pattern Verified successfully

(6)调试驱动:

  • 第一步:如果已经关闭WinGDB,则重新启动:WinDbg -k net:port=50000,key=1.2.3.4, 然后用ctr+Break进入调试;
  • 第二步:加载调试symple,需要执行以下几点:
  • 1: 

0: kd> .symfix

  • 2: 

0: kd> .sympath+ C:\DriverSamples\general\echo\kmdf
     0: kd> .reload /f

  • 第三步:加载完sympol后可用WinGDB命令进行调试

 

六:

WinGDB调试驱动常用技术:

(1)查看驱动模块中的所有符号(函数、变量):

以字母开头的方式列出:x /D Echo!a*

说明: 

x 为指令

/D 为选项

Echo为驱动名

!为分隔符,分隔后面的过滤内容

a*表示以字母A开头的所有符号

执行后如下图:

搭建Window驱动调试环境(Host:Win10 x64 + Target:VBox/WiN10 64)

可以看到上面一排蓝色字符,这些字符是可点击的,点击后搜索对应开头的符号

>要开启此功能WinGDB的DML功能, 执行

0: kd> .prefer_dml 1
DML versions of commands on by default

 

(2)查看驱动模块中的指定符号(函数、变量):

x ECHO!Echo*

关于x的详细用法参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/x--examine-symbols-

(3)查看驱动信息: lm m echo* v

(4)查看驱动详细信息: !lmi echo

(5)查看文件头信息:!dh echo

(6)修改调试信息输出等级:

   最多:ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF

   最少:ed nt!Kd_DEFAULT_MASK 0x00000000

   查看当前设置等级:dd nt!kd_DEFAULT_MASK

(7)查看即插即用设备树:

  查看整个即插即用设备树:!devnode 0 

  在即插即用设备树中过滤查找:!devnode 0 echo 

参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-devnode

(8)打断点和查看源码:

1>设置源码路径:

.srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync

 

2>设置Sympol路径:

.sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync

 

3>列出所有函数:

x ECHO!EchoEvt*

 

4>用bm打断点:

bm ECHO!EchoEvtDeviceAdd

 

5>查看所有断点:

0: kd> bl
1 e fffff801`0bf9b1c0     0001 (0001) ECHO!EchoEvtDeviceAdd

以上输出表示,1-> 表示断点的编号,从1开始排,e表示enable(**的)

 

5>重启驱动:

g

(9)触发断点:

以上我们在新增设备的回调函数中打了断点,所以我要制造此场景,步骤如下:

在Target的设备管理器中禁用Echo设备然后启用,就可以触发断点。

 

七:

WinGDB调试驱动触发断点后的常用调试技术:

(1)查看local的变量值:dv

(2)查看全局的变量值:? value_name

(3)查看调用栈:kn

(4)查看当前哪个进程的线程调用了驱动的方法:当触发驱动IO类函数时,执行:!process(参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-process)