调试是进行研究的一个必经之路,有本书里提到“调试器下无秘密”也说明了调试的重要性,学习的过程就是慢慢积累解决问题的过程。针对内核级别(ring0)的调试则由于调试时会导致内核中断所以会采用配置双机调试与虚拟机辅助的手段来方便调试内核。这里就简单记录下配置过程,当然配置过程或多或少会存在一些坑,因此有必要一一梳理下,对于后续的重新安装配置环境也是一种参照。
双机调试的环境的物理机为Windows10,可以在应用商店直接安装Windbg Preview为调试做好准备,如下。
利用系统环境变量设置符号服务器,Windbg Preview可以不用设置微软公共符号服务器地址也可以自行下载微软的符号。(也许是现在没有被墙了,记得2019年下半年的时候突然就访问不了,比较麻烦还需要设置代理网络才能下载到符号),地址为https://msdl.microsoft.com/download/symbols。
Win7环境双机内核调试
虚拟机安装的宿主机Win7开启关闭数字签名验证与测试模式,如下。
接着在虚拟机设置中配置串行端口,命名管道:\\.\pipe\com1,注意这里需要重启下Win7系统,虚拟机设置才能生效。
设置系统为调试模式,以管理员身份运行DOS控制台在控制台中依次输入以下命令:
bcdedit /copy {current} /d "Win7-双机调试模式" // 这是系统副本的名字,任意即可
bcdedit /timeout 10
重启后成功,如下。
使用管理员权限打开Windbg Preview,如下。
点击Break会中断下来,如下表示成功中断了内核。
命令g表示运行,如下。
调试之前编写的样例驱动程序,首先创建服务,但不启动。
因为已经复制样例驱动的pdb文件至Win7系统里,命中后会自动出现源代码窗口,如果未出现源代码窗口需要重置加载对应的pdb文件,如下。
调试器配置信息如下:
Windows 10 1909配置双机内核调试
调试驱动由于微软的安全机制导致需要使用测试签名,请在编译驱动的时候设置测试签名选项(需要VS中进行配置)。然后在执行的系统中以管理员模式打开cmd,执行下面指令,然后重启电脑:
允许测试签名的指令:bcdedit /set testsigning on
允许调试:bcdedit /debug on
重启后右下角会有测试模式的标识
如果要恢复成禁止测试签名的状态,就运行下面的指令:
禁止测试签名的指令:bcdedit /set testsigning off
禁止调试:bcdedit /debug off
目前采用网络调试配置,使用网络调试比串口调试速度要快些。
首先保证两个机器互联(能ping通,如果不行的话需要配置下防火墙)
打开内核调试:bcdedit /debug on
允许测试签名的指令:bcdedit /set testsigning on
设置网络接口调试:bcdedit /dbgsettings net hostip:w.x.y.z port:n key:1.2.3.4
w.x.y.z是host的ip,host指运行windbg的那个机器
port是target上开通的调试端口,不被占用就行,例如50001
key是一个四个数字,用点号隔开。例如1.2.3.4
然后需要查询一下网卡的pci地址(Powershell执行)
Get-NetAdapterHardwareInfo -InterfaceDescription *Intel* | select Name, InterfaceDescription, DeviceType, Busnumber, Devicenumber, Functionnumber | FL
然后:bcdedit /set "{dbgsettings}" busparams b.d.f
其中b是bus号,d是device号,f是function号,按照上面查询到的结果填。例如这里填0.31.6
设置完毕,重启。查网卡设置busparams这一步不做可能也可以。
在Windbg Preview进行网络调试配置,之后连接成功,如果不行的话,还需要重启下虚拟机内的待调试系统。
可以中断看看效果,如下表明中断成功可以正常调试,如果中断不成可能会因为符号文件下载未能完成导致,需要查看网络情况或者等待符号下载完毕。