admin 管理员组

文章数量: 887018

双机调试环境搭建

  • 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. 环境准备

  1. VMware Workstations (笔者用的版本是16)
  2. 虚拟机Win7 x86 sp1 旗舰版
  3. 主机环境
    1. Microsoft Windows 版本 10.0.19042.1083(命令行输入VERWINVER查看)
    2. Visual Studio2019 + Windows driver Kit 10.0.19041.685 + Windows Software Development Kit - Windows 10.0.19041.685(VS 2019装好后应该默认的SDK就是,可在控制面板中查看是否安装),这两的SDK最好和WDK版本一致。
    3. DriverMonitor,这个是用来在调试时加载驱动的

上述工具大家可自行百度,还是很好解决的

2. 单独的windbg双机配置

VM(虚拟机)里的OS 称为GuestOS 物理机里的OS 称为HostOS,一般情况下在安装上述环境后windbg就已经存在了,无需单独安装

2.1 设置GuestOS环境

  1. 编辑虚拟机设置,将虚拟机的软盘移除掉(在安装VMTools时不删除软盘一直无法安装)
  2. 编辑虚拟机设置,将虚拟机的打印机移除掉(打印机占了一个串口)
  3. 编辑虚拟机设置,添加一个串口设备,使用有名管道,并将管道名设置为:\\.\pipe\com_1
    1. 管道名必须唯一
    2. 轮询(Polling)I/O方式,也称作程序控制I/O方式,是让CPU以一定的周期按次序查询每一个外设,看它是否有数据输入或输出的要求,若有,则进行相应的输入/输出服务;若无,或I/O处理完毕后,CPU就接着查询下一个外设。
  4. 创建虚拟机的调试环境 (最终是创建一个Windows调试环境的启动项)
    1. 管理员运行cmd
    2. 运行 bcdedit,查看当前启动项
    3. 建立新的启动项 bcdedit /copy {current} /d "Win7-双机调试模式"
    4. 重启虚拟机并选择Win7-双机调试模式,后以管理员身份重新运行cmd
    5. 设置新的启动项
      1. 关闭强制数字签名(驱动程序正常运行时需要数字签名)
        bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS
        注意:关闭时使用bcdedit -set loadoptions DENABLE_INTEGRITY_CHECKS
      2. 开启系统的测试模式
        bcdedit /set testsigning on
        注意:关闭时使用bcdedit /set testsigning off
      3. 开启操作系统内核调试
        bcdedit /debug ON
      4. 开启应用程序调试
        bcdedit /bootdebug ON
      5. 设置启动管理器的超时值
        bcdedit /timeout 10
      6. 查看当前调试配置
        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环境

  1. 给windbg设置启动参数,给windbg创建桌面快捷方式
    在快捷方式的目标中追加参数-b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect –y SRV*D:\Symbols\x86_symbols*http://msdl.microsoft/download/symbols",参数说明如下:
    1. -b
      1. 指定启动windbg后立即连接到GuestOS中
      2. 在GuestOS重启内核初始化时,windbg将立即连接到GuestOS中
    2. -k com:pipe,port=\\.\pipe\com_1,baud=115200
      1. -k 用来指定连接的类型
      2. com:pipe 通过命名管道连接,其中port表示有名管道,baud表示波特率
      3. restart=0:当主控机和目标机重新同步时,发送给目标机的重置包个数,这包的个数没有限制。对于Microsoft Virtual PC和其他丢弃管道中多余数据的虚拟机,使用resets=0 参数。对于VMware 或其他不丢弃管道的多余数据的虚拟机,不要这样使用。
      4. reconnect:当调试器当管道读/写错误时,自动断开并重连。如windbg启动是没有找到管道名,则reconnect会使windbg一直等待正确的管道出现。对Virtual PC和其他在重起虚拟机时销毁并重建管道的虚拟机使用reconnect。对于VMWare和其他在重起计算机时保留管道的虚拟机不要使用该参数。
        关于Microsoft Virtual PC:Virtual PC是微软之前搞的东西与VMare类似的东西(从来没用过!!!)
    3. -y SRV*D:\Symbols\x86_symbols*http://msdl.microsoft/download/symbols
      1. -y 用来指定Symbol(调试符号既pdb文件)路径
      2. SRV*D:\Symbols\x86_symbols*http://msdl.microsoft/download/symbols 表示从http服务加载Symbol并将其存放到D:\Symbols\x86_symbols(Windows内核调试符号以前是有离线版的,但是现在都被微软给搬到服务器上了)

2.3 Windbg测试

  1. 启动windbg,显示Waiting to reconnect...此时要开启GuestOS
  2. 开启虚拟机并选择Win7-双机调试模式[启用调试程序]
  3. 在虚拟机启动的过程中windbg会收到int 3指令,此时输入g运行即可
  4. 待虚拟机启动后右下角会有测试模式水印

以上步骤正常完成表示配置OK

3. 使用Virtualkd/VirtualKD-Redux进行双机调试

在使用windbg进行调试的时候会出现调试运行过慢的情况,此时就需要使用Virtualkd/VirtualKD-Redux进行加快windbg的调试速度了,VirtualkdVirtualKD-Redux的区别在于,VirtualKD-Redux适用于VMware为15.5及以上的版本

3.1 Virtualkd双机调试配置

  1. 下载Virtualkd(官网提供下载)
  2. 解压下载包,并将里面的target文件夹拷贝被到GuestOS中,进行安装vminstall.exe(有个win10才需要的选项没有选,笔者用的是win7),安装完后会重启,重启之敲回车就会以Virtualkd创建的启动项进入系统
  3. HostOS运行vmmon.exe(32位机器上运行)或vmmon64.exe
  4. 点击Debugger path...选择windbg
  5. 选择要调试的VM项,点击Run debugger,之后如果正常的话就会出现windbg的界面,然后大家就可以随心所欲的操作了

3.2 VirtualKD-Redux双机调试配置

  1. 下载VirtualKD-Redux(Git上有安装包)
  2. 解压下载包,将target32拷贝到GuestOS中运行vminstall.exe(有个win10才需要的选项没有选,笔者用的是win7),安装后会重启,重启后按F8选择禁用驱动签名强制,进入系统
  3. 之后就参见3.1 Virtualkd双机调试配置后续的相关描述

4. VS2019 调试

4.1 VS配置

  1. 点击扩展(X) -> Driver -> Test -> Configure Devices... -> Add New Device
  2. 填写Display name(为调试目标起名字)
  3. 填写Network host name(调试目标的主机名),可在GuestOS 中打开cmd输入hostname进行查看
  4. 选择Manually configure debuggers and do not provision,进行手动配置,点击下一步
  5. 进行内核模式配置
    1. 连接类型选择Serial
    2. 波特率设置115200(根据GuestOS中配置的设置)
    3. 勾选Pipe,这里我没有勾选reconnect原因参见reconnect的相关描述
    4. 设置Pipe name\\.\pipe\com_1,与GuestOS设置的一样,或将com_1替换为vmmon64.exe界面所显示的通道名称
    5. Target Port设置为空,原因在于使用的是com:pipe连接而不是com:port
  6. 点击下一步,检查下内核模式的配置信息,忽略测试的状态即可
  7. 点击Apply -> OK

4.2 代码编写

  1. 创建WDM空项目
  2. 创建main.c文件,不要用.cpp后缀
  3. 代码
    #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 项目配置

  1. 选择x86模式
  2. 将警告等级设置为/W3
  3. 关闭将警告视为错误选项
  4. 将Spectre Mitigation设置为Disabled
  5. Dirver Settings中的Target OS Version设置为Windows 7
  6. Driver Signing中的Sign Mode 设置为off
  7. InfCat中的Run Inf2Cat设置为
  8. Dirver Files文件过滤器下的.inf安装文件从项目中移除
  9. 编译

4.4 调试

  1. DriverMonitor拷贝到虚拟机中
  2. 将编译好的驱动文件.sys文件拷贝到虚拟机
  3. 在虚拟机中打开DriverMonitor,点击Open Driver并选择拷贝到虚拟机中的驱动文件
  4. 在VS中选择附加进程调试,连接类型选择Windows Kernel Mode Debugger,连接目标选择要连接的虚拟机,进程选择Kernel,点击附加
  5. 在VS进入调试状态后先点击一次全部中断(主要是让调试器连接到虚拟机),中断之后点击继续
  6. DriverEntry函数中打一个断点
  7. 在虚拟机的DriverMonitor软件中点击Start Driver ,此时VS中的断点会被触发,触发后在VS中按F5
  8. 在虚拟机的DriverMonitor软件中点击End Driver 卸载驱动

本文标签: 双机 环境 virtualkd winDbg