双机调试环境搭建 windbg + virtualkd
双机调试环境搭建
- 1. 环境准备
- 2. 单独的windbg双机配置
- 2.1 设置GuestOS环境
- 2.2 设置HostOS环境
- 2.3 Windbg测试
- 3. 使用Virtualkd/VirtualKD-Redux进行双机调试
- 3.1 Virtualkd双机调试配置
- 3.2 VirtualKD-Redux双机调试配置
- 4. VS2019 调试
- 4.1 VS配置
- 4.2 代码编写
- 4.3 项目配置
- 4.4 调试
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 Serialdebugport 1baudrate 115200 注意:debugport要与vmware为虚拟机添加的端口号一直,否则无法通信,可以使用bcdedit /dbgsettings serial debugport:1 baudrate:115200进行调整debugport:1对应的是虚拟机中串行端口COM1baudrate为波特率,与其相关的几个概念如下: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
3. 使用Virtualkd/VirtualKD-Redux进行双机调试
在使用windbg进行调试的时候会出现调试运行过慢的情况,此时就需要使用Virtualkd/VirtualKD-Redux进行加快windbg的调试速度了,Virtualkd和VirtualKD-Redux的区别在于,VirtualKD-Redux适用于VMware为15.5及以上的版本
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后缀 - 代码
#includeNTSTATUS 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卸载驱动
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
