0x00 背景
为了学习windows内核的知识,需要编写驱动代码,这个时候就不得不进行双机调试了
内核调试需要使用一台计算机用于被调试,另一台计算机用于使用调试器来调试前面所述的计算机。为了能在同一台计算机上进行内核调试,通常使用虚拟机来运行被调试的计算机。另外,使用虚拟机运行被调试的机器比较安全,因为虚拟机可以随便的使用,无需担心调试过程中导致的系统损坏。而调试器所在的计算机通常使用物理机。
这里我的环境如下:
主机:win11 23H2
虚拟机软件:Vmware Workstation 17.5.1 Pro
虚拟机:Win10 22H2
调试器:Windbg
0x01 方法一、使用VirtualKD
我们首先需要下载VirtualKD这款软件,这是专门用来调试内核的调试器,这是来自官网的介绍
但是目前无法在win10的虚拟机中使用(别问我,我也不知道为啥QAQ~),那怎么办呢?还好Github有大佬出手,有一个开源项目叫做VirtualKD-Redux,这个船新版本就可以解决高版本系统无法使用的问题啦!
把它下载下来之后,可以看到项目的结构是这样的:
Tips:我们只用关注红框里的内容即可,target32
和target64
就是需要放在虚拟机里的文件夹,根据客户机系统的版本而定,而下面的vmmon64
就是在我们主机上用来和target
建立通信的客户端。
这里我将target64
文件夹复制到客户机上,双击vminstall.exe
进行安装(保持默认即可,也可以更改输入框中的文字,我们重启之后能看到效果):
点击Install,会有两个提示框,第一个是告诉我们开机之后要关闭驱动签名,第二个则是安装成功,提示重启,然后我们就能看到引导界面多了一项:
按照提示,我们按F8,找到“禁用驱动程序强制签名”,回车
别忘记打开前面提到的vmmon64.exe
,并打开Windbg
,这个时候整个虚拟机就会卡住(这里是因为系统初始化加载内核的时候,kd自动下了一个断点,从而产生异常,并把这个异常处理交给了调试器)
我们按下g
就能让虚拟机继续运行啦(其实是两个)
开机后我们会看到桌面右下角有个水印,表示我们已经进入了测试模式。
0x02 方法二、使用串口
打开虚拟机设置,我们添加一个串行端口:
我们使用命名管道通信,第一个输入框是管道名,可以将kd_com1
改成任意名,然后其他如图配置即可
配置好之后,我们就可以开启虚拟机啦,进入系统后以管理员权限打开cmd,执行以下命令:
bcdedit /copy {current} /d Windows10-双机调试模式 -------> 创建一个新的引导项
bcdedit /timeout 10 -------> 设置超时时间为10s
bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS -------> 关闭强制数字签名
bcdedit /set testsigning on -------> 开启系统测试模式
bcdedit /debug on -------> 开启调试功能
bcdedit /bootdebug on -------> 开启调试功能
bcdedit /dbgsettings -------> 查看调试配置
bcdedit /dbgsettings serial debugport:1 baudrate:115200 -------> 设置调试端口为1,波特率为115200
此时我们重启就是这个样子的:
然后我们直接打开Windbg
(因为没有使用kd,不用开启vmmon64.exe
)
然后点击ok进入等待连接状态:
这时我们再回到虚拟机敲击回车,Windbg就会通过串口通信的方式和虚拟机建立连接啦
接下来还是使用g命令让它继续运行就好啦~