实现 Windbg 会话
Host: Windows 10 x64 22H2
Guest: Windows 10 x64 22H2
(都为 VMware 虚拟机)
主机安装:
- IDA Pro 7.6
- Win10 SDK 2004 官方下载: https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/
- Win10 WDK 官方下载:https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk (这个没找到旧版本的下载地址,新版本肯定兼容旧版本)
SDK 安装时只需要勾选 Debugging Tools 即可, WDK 安装后 VS 扩展可选
确保主机和目标机之间可以ping通,建议设置静态IP因为IP修改起来麻烦,设置静态IP时注意VMware NAT的默认网关在 192.168.xx.2
在这个文件夹找到 kdnet.exe
和 VerifiedNICList.xml
:
1 | C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 |
将这两个文件复制到目标机,放入 C:/KDNET
文件夹,执行kdnet.exe查看网络适配器是否支持调试:
目标机上执行命令,获取密钥:
1 | C:\KDNET>kdnet.exe <主机IP> <调试端口,一般为50000> |
主机设置快捷方式或者脚本,复制上面返回的命令,加上 -d
表示内核加载后就启动调试,注意以管理员身份执行该命令:
1 | windbg -d -k net:port=50000,key=234s3q1beeby0.1e0i8ran96uhl.1wash7qcm06n6.xseu45di0i51 |
启动 Windbg 可以看到调试器在等待连接:
此时重启目标机即可连接调试器。
注意开启了内核调试以后,目标机貌似无法访问互联网
故障检查:
- 主机关闭防火墙或者允许 Windows Kernel Debugger 通过防火墙
- 更换端口,50000貌似不太行
- 主机和目标机可以ping通
- 先开启Windbg,再重启目标机
IDA 附加 Windbg
Debugger -> Attach -> Windbg debugger
这里的 Connection string 填入 net:port=50000,key=234s3q1beeby0.1e0i8ran96uhl.1wash7qcm06n6.xseu45di0i51
一定要选择内核调试不然连接不上调试器,在 Debug options -> Set specific options 中:
不知道什么原因,我的 IDA 7.7 这里一直出现找不到 Windbg 的问题,换 IDA 7.6 就行了
第一次调试 IDA 会卡在 Refreshing modules list 很久,应该是在线下载驱动文件的符号库,等个几分钟就行,之后的调试会快一些不过还是很慢,不知道怎么解决。
看到这些内核驱动模块之后,我们就可以动手调试我们想要调试的驱动了。
安装目标驱动
这里我使用了一个驱动加载工具:https://dennisbabkin.com/driverloader/
管理员身份打开64位或者32位程序,选择驱动文件,根据需要修改参数,然后Register Driver,没有提示就是注册成功,然后点击 Start Driver,如果提示签名无法验证,Edit -> Test Signing 重启电脑。
不过发现这样子还是会跳签名验证失败,必须要在设置里高级启动选择禁用签名才能临时打上驱动
在网上找了半天解决方法,终于找到如何给驱动程序签名的方法:https://blog.csdn.net/qq_29542611/article/details/119944691 原来驱动不签名就算关闭签名验证也没法加载啊!
执行以下两条命令,先是生成证书,然后用证书签名,注意需要添加 /fd SHA256
:
1 | C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64> .\MakeCert.exe -r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) -eku 1.3.6.1.5.5.7.3.3 ContosoTest.cer |
签名了以后就能正常打驱动了。
IDA 调试驱动
IDA 打开驱动文件并解析,然后运行 Windbg Debugger,注意选择调试选项为内核模式,设置好连接命令,连接上调试器后点击工具栏绿色箭头继续执行,此时弹出 Running 窗口。这时在目标机上点击 Start Driver,IDA 弹出提示说明成功!
选择 Same 之后就可以进行调试了,这里我采用经典的 攻防世界XCTF MyDriver2 作为示例,这个函数执行到 return 时, byte_FFFFF8075CE96390
存放着解密了的flag:
(运行完这个驱动会导致目标机蓝屏,应该是因为没有正确处理驱动返回值的结果,属于正常现象)