1. 环境准备
-
VMware Workstations
(笔者用的版本是16) - 虚拟机
Win7 x86 sp1 旗舰版
- 主机环境
- Microsoft Windows 版本
10.0.19042.1083
(命令行输入VER
或WINVER
查看) -
Visual Studio2019 + Windows driver Kit 10.0.19041.685 +
Windows Software Development Kit - Windows 10.0.19041.685(VS 2019装好后应该默认的SDK就是,可在控制面板中查看是否安装)
,这两的SDK最好和WDK版本一致。 -
DriverMonitor
,这个是用来在调试时加载驱动的
- Microsoft Windows 版本
上述工具大家可自行百度,还是很好解决的
2. 单独的windbg双机配置
VM(虚拟机)里的OS 称为GuestOS
物理机里的OS 称为HostOS
,一般情况下在安装上述环境后windbg
就已经存在了,无需单独安装
2.1 设置GuestOS环境
- 编辑虚拟机设置,将虚拟机的软盘移除掉(在安装VMTools时不删除软盘一直无法安装)
- 编辑虚拟机设置,将虚拟机的打印机移除掉(打印机占了一个串口)
- 编辑虚拟机设置,添加一个串口设备,使用有名管道,并将管道名设置为:
\\.\pipe\com_1
1. 管道名必须唯一
2. 轮询(Polling)I/O方式,也称作程序控制I/O方式,是让CPU以一定的周期按次序查询每一个外设,看它是否有数据输入或输出的要求,若有,则进行相应的输入/输出服务;若无,或I/O处理完毕后,CPU就接着查询下一个外设。 - 创建虚拟机的调试环境 (最终是创建一个Windows调试环境的启动项)
- 管理员运行cmd
- 运行
bcdedit
,查看当前启动项 - 建立新的启动项
bcdedit /copy {current} /d "Win7-双机调试模式"
- 重启虚拟机并选择
Win7-双机调试模式
,后以管理员身份重新运行cmd - 设置新的启动项
- 关闭强制数字签名(驱动程序正常运行时需要数字签名)
bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS
注意:关闭时使用bcdedit -set loadoptions DENABLE_INTEGRITY_CHECKS
- 开启系统的测试模式
bcdedit /set testsigning on
注意:关闭时使用bcdedit /set testsigning off
- 开启操作系统内核调试
bcdedit /debug ON
- 开启应用程序调试
bcdedit /bootdebug ON
- 设置启动管理器的超时值
bcdedit /timeout 10
- 查看当前调试配置
bcdedit /dbgsettings
输出内容通常为: debugtype Serial debugport 1 baudrate 115200 注意: debugport要与vmware为虚拟机添加的端口号一直,否则无法通信,可以使用bcdedit /dbgsettings serial debugport:1 baudrate:115200进行调整 debugport:1对应的是虚拟机中串行端口COM1 baudrate为波特率,与其相关的几个概念如下: 1. 码元 2. 码元速率 3. 比特率 4. 波特率
- 关闭强制数字签名(驱动程序正常运行时需要数字签名)
2.2 设置HostOS环境
- 给windbg设置启动参数,给windbg创建桌面快捷方式
在快捷方式的目标中追加参数-b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect –y SRV*D:\Symbols\x86_symbols*http://msdl.microsoft.com/download/symbols"
,参数说明如下:-
-b
- 指定启动windbg后立即连接到GuestOS中
- 在GuestOS重启内核初始化时,windbg将立即连接到GuestOS中
-
-k com:pipe,port=\\.\pipe\com_1,baud=115200
-
-k
用来指定连接的类型 -
com:pipe
通过命名管道连接,其中port
表示有名管道,baud
表示波特率 -
restart=0
:当主控机和目标机重新同步时,发送给目标机的重置包个数,这包的个数没有限制。对于Microsoft Virtual PC和其他丢弃管道中多余数据的虚拟机,使用resets=0 参数。对于VMware 或其他不丢弃管道的多余数据的虚拟机,不要这样使用。 -
reconnect
:当调试器当管道读/写错误时,自动断开并重连。如windbg启动是没有找到管道名,则reconnect会使windbg一直等待正确的管道出现。对Virtual PC和其他在重起虚拟机时销毁并重建管道的虚拟机使用reconnect。对于VMWare和其他在重起计算机时保留管道的虚拟机不要使用该参数。关于Microsoft Virtual PC:Virtual PC是微软之前搞的东西与VMare类似的东西(从来没用过!!!)
-
-
-y SRV*D:\Symbols\x86_symbols*http://msdl.microsoft.com/download/symbols
-
-y
用来指定Symbol(调试符号既pdb文件)路径 -
SRV*D:\Symbols\x86_symbols*http://msdl.microsoft.com/download/symbols
表示从http服务加载Symbol并将其存放到D:\Symbols\x86_symbols
(Windows内核调试符号以前是有离线版的,但是现在都被微软给搬到服务器上了)
-
-
2.3 Windbg测试
- 启动windbg,显示
Waiting to reconnect...
此时要开启GuestOS - 开启虚拟机并选择
Win7-双机调试模式[启用调试程序]
- 在虚拟机启动的过程中windbg会收到
int 3
指令,此时输入g
运行即可 - 待虚拟机启动后右下角会有测试模式水印
以上步骤正常完成表示配置OK文章来源:https://www.toymoban.com/news/detail-465965.html
3. 使用Virtualkd/VirtualKD-Redux进行双机调试
在使用windbg进行调试的时候会出现调试运行过慢的情况,此时就需要使用Virtualkd/VirtualKD-Redux
进行加快windbg的调试速度了,Virtualkd
和VirtualKD-Redux
的区别在于,VirtualKD-Redux
适用于VMware为15.5及以上的版本文章来源地址https://www.toymoban.com/news/detail-465965.html
3.1 Virtualkd双机调试配置
- 下载Virtualkd(官网提供下载)
- 解压下载包,并将里面的
target
文件夹拷贝被到GuestOS中,进行安装vminstall.exe
(有个win10才需要的选项没有选,笔者用的是win7),安装完后会重启,重启之敲回车就会以Virtualkd
创建的启动项进入系统 - HostOS运行
vmmon.exe
(32位机器上运行)或vmmon64.exe
- 点击
Debugger path...
选择windbg
- 选择要调试的VM项,点击
Run debugger
,之后如果正常的话就会出现windbg的界面,然后大家就可以随心所欲的操作了
3.2 VirtualKD-Redux双机调试配置
- 下载VirtualKD-Redux(Git上有安装包)
- 解压下载包,将
target32
拷贝到GuestOS中运行vminstall.exe
(有个win10才需要的选项没有选,笔者用的是win7),安装后会重启,重启后按F8
选择禁用驱动签名强制
,进入系统 - 之后就参见
3.1 Virtualkd双机调试配置
后续的相关描述
4. VS2019 调试
4.1 VS配置
- 点击
扩展(X)
->Driver
->Test
->Configure Devices...
->Add New Device
- 填写
Display name
(为调试目标起名字) - 填写
Network host name
(调试目标的主机名),可在GuestOS 中打开cmd输入hostname
进行查看 - 选择
Manually configure debuggers and do not provision
,进行手动配置,点击下一步 - 进行内核模式配置
- 连接类型选择
Serial
- 波特率设置
115200
(根据GuestOS中配置的设置) - 勾选
Pipe
,这里我没有勾选reconnect
原因参见reconnect
的相关描述 - 设置
Pipe name
为\\.\pipe\com_1
,与GuestOS设置的一样,或将com_1
替换为vmmon64.exe
界面所显示的通道名称 -
Target Port
设置为空,原因在于使用的是com:pipe
连接而不是com:port
- 连接类型选择
- 点击
下一步
,检查下内核模式的配置信息,忽略测试的状态即可 - 点击
Apply
->OK
4.2 代码编写
- 创建
WDM
空项目 - 创建
main.c
文件,不要用.cpp
后缀 - 代码
#include <ntddk.h> NTSTATUS DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("MY FIRST DEVICE:%ws Unload\n", driver->DriverName.Buffer); return STATUS_SUCCESS; } NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) { DbgPrint("MY FIRST DEVICE:%ws\n", reg_path->Buffer); driver->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
4.3 项目配置
- 选择
x86
模式 - 将警告等级设置为
/W3
- 关闭
将警告视为错误
选项 - 将Spectre Mitigation设置为
Disabled
- 将
Dirver Settings
中的Target OS Version
设置为Windows 7
- 将
Driver Signing
中的Sign Mode
设置为off
- 将
InfCat
中的Run Inf2Cat
设置为否
- 将
Dirver Files
文件过滤器下的.inf
安装文件从项目中移除 - 编译
4.4 调试
- 将
DriverMonitor
拷贝到虚拟机中 - 将编译好的驱动文件
.sys
文件拷贝到虚拟机 - 在虚拟机中打开
DriverMonitor
,点击Open Driver
并选择拷贝到虚拟机中的驱动文件 - 在VS中选择附加进程调试,连接类型选择
Windows Kernel Mode Debugger
,连接目标选择要连接的虚拟机,进程选择Kernel
,点击附加
- 在VS进入调试状态后先点击一次
全部中断
(主要是让调试器连接到虚拟机),中断之后点击继续
-
DriverEntry
函数中打一个断点 - 在虚拟机的
DriverMonitor
软件中点击Start Driver
,此时VS中的断点会被触发,触发后在VS中按F5
- 在虚拟机的
DriverMonitor
软件中点击End Driver
卸载驱动
到了这里,关于双机调试环境搭建 windbg + virtualkd的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!