VMware Workstations (笔者用的版本是16)Win7 x86 sp1 旗舰版10.0.19042.1083(命令行输入VER或WINVER查看)Windows Software Development Kit - Windows 10.0.19041.685(VS 2019装好后应该默认的SDK就是,可在控制面板中查看是否安装),这两的SDK最好和WDK版本一致。DriverMonitor,这个是用来在调试时加载驱动的上述工具大家可自行百度,还是很好解决的
VM(虚拟机)里的OS 称为GuestOS 物理机里的OS 称为HostOS,一般情况下在安装上述环境后windbg就已经存在了,无需单独安装
\\.\pipe\com_1bcdedit,查看当前启动项bcdedit /copy {current} /d "Win7-双机调试模式"Win7-双机调试模式,后以管理员身份重新运行cmdbcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKSbcdedit -set loadoptions DENABLE_INTEGRITY_CHECKSbcdedit /set testsigning on注意:关闭时使用bcdedit /set testsigning offbcdedit /debug ONbcdedit /bootdebug ONbcdedit /timeout 10bcdedit /dbgsettings输出内容通常为:
debugtype Serial
debugport 1
baudrate 115200
注意:
debugport要与vmware为虚拟机添加的端口号一直,否则无法通信,可以使用bcdedit /dbgsettings serial debugport:1 baudrate:115200进行调整
debugport:1对应的是虚拟机中串行端口COM1
baudrate为波特率,与其相关的几个概念如下:
1. 码元
2. 码元速率
3. 比特率
4. 波特率
-b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect –y SRV*D:\Symbols\x86_symbols*http://msdl.microsoft.com/download/symbols",参数说明如下:
-b
-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内核调试符号以前是有离线版的,但是现在都被微软给搬到服务器上了)Waiting to reconnect...此时要开启GuestOSWin7-双机调试模式[启用调试程序]int 3指令,此时输入g运行即可以上步骤正常完成表示配置OK
在使用windbg进行调试的时候会出现调试运行过慢的情况,此时就需要使用Virtualkd/VirtualKD-Redux进行加快windbg的调试速度了,Virtualkd和VirtualKD-Redux的区别在于,VirtualKD-Redux适用于VMware为15.5及以上的版本
target文件夹拷贝被到GuestOS中,进行安装vminstall.exe(有个win10才需要的选项没有选,笔者用的是win7),安装完后会重启,重启之敲回车就会以Virtualkd创建的启动项进入系统vmmon.exe(32位机器上运行)或vmmon64.exeDebugger path...选择windbgRun debugger,之后如果正常的话就会出现windbg的界面,然后大家就可以随心所欲的操作了target32拷贝到GuestOS中运行vminstall.exe(有个win10才需要的选项没有选,笔者用的是win7),安装后会重启,重启后按F8选择禁用驱动签名强制,进入系统3.1 Virtualkd双机调试配置后续的相关描述扩展(X) -> Driver -> Test -> Configure Devices... -> Add New DeviceDisplay name(为调试目标起名字)Network host name(调试目标的主机名),可在GuestOS 中打开cmd输入hostname进行查看Manually configure debuggers and do not provision,进行手动配置,点击下一步Serial115200(根据GuestOS中配置的设置)Pipe,这里我没有勾选reconnect原因参见reconnect的相关描述Pipe name为\\.\pipe\com_1,与GuestOS设置的一样,或将com_1替换为vmmon64.exe界面所显示的通道名称Target Port设置为空,原因在于使用的是com:pipe连接而不是com:port下一步,检查下内核模式的配置信息,忽略测试的状态即可Apply -> OKWDM空项目main.c文件,不要用.cpp后缀#include
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;
}
x86模式/W3将警告视为错误选项DisabledDirver Settings中的Target OS Version设置为Windows 7Driver Signing中的Sign Mode 设置为offInfCat中的Run Inf2Cat设置为否Dirver Files文件过滤器下的.inf安装文件从项目中移除DriverMonitor拷贝到虚拟机中.sys文件拷贝到虚拟机DriverMonitor,点击Open Driver并选择拷贝到虚拟机中的驱动文件Windows Kernel Mode Debugger,连接目标选择要连接的虚拟机,进程选择Kernel,点击附加全部中断(主要是让调试器连接到虚拟机),中断之后点击继续DriverEntry函数中打一个断点DriverMonitor软件中点击Start Driver ,此时VS中的断点会被触发,触发后在VS中按F5DriverMonitor软件中点击End Driver 卸载驱动