admin 管理员组

文章数量: 887019

环境:

真实机windows10

windows10内安装winDbg

windows10内安装VMware

VMware内安装windows7

步骤:

1.windows内安装windbg,不知道什么原因microsoft store中的windbgpreview安装不上,于是就用了老版本的windbg。

2.vmware添加串口

 不知道为什么,创建的串口叫串行端口2,这个数字很重要,要记住,使用命名的管道要\\.\pipe\前缀,后面的名字可以自己写一个短的好记的

3.Windows7内配置调试参数

bcdedit根据default生成一个新的启动项,用来调试,其实通过bcdedit /enum并没有看到default这个名字

bcdedit /copy {default} /d "vmdebug"
已将该项成功复制到 {7985b4ec-581d-11ec-bee9-8214e8b021aa}。

复制一下这个id,粘贴到真实机的文档里面。

此时重启的话会有多一个启动项选择,但是看不到,需要设置timeout,让系统停留在启动项的选择界面

bcdedit /timeout 10

设置timeout会在启动项选择界面停留10秒钟,超过10秒钟则进入默认启动项,

重启后从vmdebug选项进入,设置vmdebug为调试模式,以免影响默认启动方式的系统环境,

bcdedit /dbgsettings serial baudrate:115200 debugport:2

注意这个debugport,就是创建虚拟机串口的端口号,从创建时的截图看,串行端口2,debugport应该就是2,如果不知道。那只能先设置一个,然后连不上的时候再重新输入命令修改串口

bcdedit /debug {ID} ON

ID是从bcdedit /copy创建出vmdebug后生成的id,也可以通过bcdedit /enum查询

重启,停在开机启动项

4.启动windbg

直接启动windbg的话连不上虚拟机,需要添加参数,用命令行启动windbg

windbg.exe -b -k com:pipe,port=\\.\pipe\vmdbg_win7,resets=0

或者新建一个windbg的快捷方式,然后编辑目标,把参数加到目标中去

windbg启动会卡住,等待管道对应的虚拟机中的系统启动

 此时vmware启动到启动项选择界面

 焦点停留在vmdebug,此时可以直接敲回车进系统,也可以按F8,禁用驱动的数字签名

此时windbg就会连接上

 windows7系统也会卡住,按g表示继续执行,系统会继续走开机流程,

如果提示找不到符号,可以在 File->symbol file path中添加url

SRV*c:\mysymbol*http://msdl.microsoft/download/symbols

勾选reload

点击确定

如果有源码的话,可以在File->source file path中添加,便于添加断点

系统走开机流程后windbg进入busy状态,此时不接受命令输入,除非按ctrl+break,或者菜单中debug->break,break之后系统会再次卡住,接受命令行调试

常用命令

lm查看当前加载了哪些模块

 系统启动的不同阶段加载的模块不一样,比如此时系统还没加载abc.sys,可以提前设置abc.sys的driverEntry处设置断点

bp+address/符号地址       在address指令处加断点,但是这个地址所在的模块必须已经被加载

bu+address/符号地址       在address指令处加断点,但是这个地址所在的模块可以没有被加载,即延迟加载的模块。

此时应该用bu命令,如果模块加载了就过了DriveEntry

bu abc!DriverEntry

abc驱动加载起来之后就会断点停在DriverEntry,这个时候输入dv命令是没用的,

kd> dv
   DriverObject = 0xffff0010`03ecc8d3
   RegistryPath = 0xffff0040`00000030 
uszDeviceString = struct _UNICODE_STRING "䆰Ȑ婢???"
  pDeviceObject = 0xfffff880`00000000
uszDriverString = struct _UNICODE_STRING ""

此时可以(step over)F10往下面运行几行代码
或者(Run to cursor)Ctrl+F10,或者F7
然后执行dv,
比如看到变量DriverObject
再往下执行几行

kd> dv
   DriverObject = 0xfffffa80`021041b0
   RegistryPath = 0x00000000`00000000
uszDeviceString = struct _UNICODE_STRING "\DosDevices\abc"
  pDeviceObject = 0xfffffa80`02106200
uszDriverString = struct _UNICODE_STRING "\Device\abc"


dt DriverObject
查看变量的值,如果变量的值看不到,可以往下运行几行

kd> dt DriverObject
Local var @ 0xfffff880009ae5a0 Type _DRIVER_OBJECT*
0xfffffa80`021041b0 
   +0x000 Type             : 0n4
   +0x002 Size             : 0n336
   +0x008 DeviceObject     : 0xfffffa80`02106200 _DEVICE_OBJECT
   +0x010 Flags            : 2
   +0x018 DriverStart      : 0xfffff880`04468000 Void
   +0x020 DriverSize       : 0xf000
   +0x028 DriverSection    : 0xfffffa80`02104b20 Void
   +0x030 DriverExtension  : 0xfffffa80`02104300 _DRIVER_EXTENSION
   +0x038 DriverName       : _UNICODE_STRING "\Driver\abc"
   +0x048 HardwareDatabase : 0xfffff800`04393558 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
   +0x050 FastIoDispatch   : (null) 
   +0x058 DriverInit       : 0xfffff880`044744f8     long  abc!GsDriverEntry+0
   +0x060 DriverStartIo    : (null) 
   +0x068 DriverUnload     : (null) 
   +0x070 MajorFunction    : [28] 0xfffff800`03eb31d4     long  nt!IopInvalidDeviceRequest+0

代码其他函数设置断点方式也是如此,如果要取消断点,需要用bl命令先看看有哪些断点

kd> bl
 0 e fffff880`04474008 [f:\xx.c @ 370]    0001 (0001) abc!DriverEntry
 1 e fffff880`04474008 [f:\xx.c @ 370]    0001 (0001) abc!DriverEntry
 2 e fffff880`0446a5c4 [f:\xx.c @ 1885]   0001 (0001) abc!MyDeviceIoControl

0,1,2表示断点,e表示enable状态,d表示disable状态

假如现在要关闭MyDeviceIocontrol断点,需要执行bd 2


kd> bd 2
kd> bl
 0 e fffff880`04474008 [f:\xx.c @ 370]    0001 (0001) abc!DriverEntry
 1 e fffff880`04474008 [f:\xx.c @ 370]    0001 (0001) abc!DriverEntry
 2 d fffff880`0446a5c4 [f:\xx.c @ 1885]    0001 (0001) abc!MyDeviceIoControl

此时2的状态就变为d了

bc是清除断点,执行bc 2之后就看不到2了

本文标签: 双机 winDbg VMware