一:
Host 软件:
系统:
Win10 64 位家庭版
软件包:
- Visual Studio Comunity 2019(Visual Studio 2022 IDE - AI for coding debugging and testing)
- Windows Software Development Kit (SDK) for Windows 10(安装VS时会附带)
- Windows Driver Kit (WDK) for Windows 10(Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Learn)
- The sample echo driver for Windows 10(Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Learn)
-
VBox -版本 6.1.4 r136177 (Qt5.6.2)
二:
Target 软件:
系统:
Win10 64 企业版
三:
让虚拟机和主机可以ping通
(1)为虚拟机新增一个网卡,选用桥接,界面名称选择你的主机现在使用的网卡,保证虚拟机和主机在同一网段就可以ping通过,有时主机不能ping通虚拟机,需要关闭虚拟机的防火墙:
四:
开启调试步骤:
(1)在Target上以管理员模式在CMD中依次执行以下命令:
- C:\> bcdedit /set {default} DEBUG YES
- C:\> bcdedit /set TESTSIGNING ON
- C:\> bcdedit /dbgsettings net hostip:192.168.1.1 port:50000 key:1.2.3.4
- C:\> bcdedit /dbgsettings
- 参考(Debug Windows Drivers Step-By-Step Lab (Echo Kernel Mode) - Windows drivers | Microsoft Learn)
(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 的项目属性:
(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>)
- 第三步:查看设备管理器,检查驱动是否安装,如下图
(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开头的所有符号
执行后如下图:
可以看到上面一排蓝色字符,这些字符是可点击的,点击后搜索对应开头的符号
>要开启此功能WinGDB的DML功能, 执行
0: kd> .prefer_dml 1
DML versions of commands on by default
(2)查看驱动模块中的指定符号(函数、变量):
x ECHO!Echo*
关于x的详细用法参考:x (Examine Symbols) - Windows drivers | Microsoft Learn
(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
参考:!devnode (WinDbg) - Windows drivers | Microsoft Learn
(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(参考:!process (WinDbg) - Windows drivers | Microsoft Learn)