Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法

 想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家,

其中我主要看的是VMWare的pipe建立,而我有些分享是在vs2015中打上DDK,然后在开始菜单window kits下找见windbgx86或者是你想要用的类型,然后

发送快捷方式到桌面利于以后用。发到桌面后,在属性插入你放置的的符号的路径,让然最后别忘了在windbg检查路径是否正确。

eqera他的解述给了我很多帮助,可以耐心解读。下次我会写一些我对于调试的东西,如果对于不明白的路径设置,可以给我留言,我告诉你。

Windbg本地调试工具是驱动级调试工具,在Win10系统中调试过程涉及系统驱动,所以用WinDbg是最佳选择。一般情况下,驱动调试需要两台电脑进行配合

一台电脑作为主导进行驱动调试,另一台电脑作为目标机进行驱动安装。

内核调试主要用来调试驱动代码、分析内核结构等。 WinDbg通过两台电脑可以实现内核调试,其中一台电脑运
行WinDbg,被称为主机;另外一台电脑运行被调试的程序或系统,被称为目标机。一般情况下两台电脑都是真实机
器,这样调试最符合实际情况,两台电脑通过串口线、 1394线或USB对联线连接起来实现双机内核调试。如果没 有
两台电脑,也可以用虚拟机来模拟目标机,主机上运行WinDbg ,虚拟机中安装Windows运行被调试的程序,虚拟
机通过模拟的串口输出为主机上的一个命名管道,从而和主机上的WinDbg连接起来实现双机 内核调试。
    除双机内核调试外, WindowsXP后还引入了一种本机内核调试方式,只需要一台电脑,直接运行WinDbg就 能
查看修改系统内核结构等,不过所有和中断目标机系统相关的命令都不能执行,如断点命令。
     如果采用虚拟机模拟目标机,调试响应速度有时候是个问题,比1394线连接的真实双机调试速度要慢不少,特
别是执行操作大量内存的命令时(如搜索内存命令),感觉非常明星。所以针对这种情况还会介绍一个特殊的辅助调 试
工具vmkd ,该工具可以大大加速内核调试的速度,为咱们带来不少方便。
    下面分节详细介绍各种内核调试情景下的配置,尽量每个步骤都截图说明。

真实机双机内核调试

真实机之间的内核调试首先需要准备连接线,可以用串口线、 1394线或者USB对联线。
    串口线速度太慢,而且电脑城一般买不到可以直接使用的串口线,需要把线和接头买回来自己焊,按照WinDbg
帮助中的说明交叉焊接,就能得到一根可用来调试的串口线。用串口线把两台电脑连接上后,先用Windows自带的
超级终端工具,选择好串口和波特率连接。如果在超级终端中按键能在另外一台电脑的超级终端上显示按键,则表示
串口线连接成功。接下来就可以用WinDbg连接串口调试。某些笔记本上可能没有串口,可以买一个USB转串口的
接头,然后设置USB转换后的串口号,就能把这台笔记本当作主机使用。
   1394线速度快,价格也便宜,如果电脑上没有1394口,可以再另外买一个1394卡,价格也很便宜。 1394分
大口和小口,只需按照电脑上的接口大小购买合适的线就行。如果没有1394口,装一个1394卡又很麻烦,则也可
以买一个USB转1394口的接头,不过一样只能当作主机使用。
   USB对联线是Vista系统以后支持的内核调试连接方式,没见到哪里能买到这样的线,估计速度会更快一点吧!
   因为1394线连接调试最方便,速度也比较快,所以建议使用这种方式。
    电脑、连接线等准备好后,先设置目标机系统,启用内嵌在系统中的内核调试引擎。 Vista之前的系统,用记事 本
打开系统盘根目录下的boot.ini文件,添加新的启动项,在新的启动项上添加调试选项。如下表,红色行表示新加的
启动项, /debug表示打开内核调试引擎, /debugport=1394表示采用1394连接方式, /channel=10表示设置 通
道号为10。

[csharp] view plain copy

  1. [bootloader]
  2. timeout=30
  3. default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
  4. [operatingsystems]
  5. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindowsXPProfessional"
  6. /noexecute=optin/fastdetect
  7. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WINXP-Debug"/noexecute=optin/debug
  8. /debugport=1394/channel=10

Vista之后的系统需要修改BCD数据库,利用bcdedit工具添加启动项,设置调试选项。如下表,以管理员方 式

运行命令行程序,先复制当前项生成新的启动项,然后在新的启动项上操作,打开内核调试、设置调试连接方式、设
置1394通道号。

[csharp] view plain copy

  1. C:\>bcdedit/copy{default}/d"Vista-RemoteDebug"
  2. 已将该项成功复制到{13fbbedc-756a-11dc-aed8-0016e68bceb3} 。
  3. C:\>bcdedit/set{13fbbedc-756a-11dc-aed8-0016e68bceb3}debugtype1394
  4. 操作成功完成。
  5. C:\>bcdedit/set{13fbbedc-756a-11dc-aed8-0016e68bceb3}channel10
  6. 操作成功完成。
  7. C:\>bcdedit/debug{13fbbedc-756a-11dc-aed8-0016e68bceb3}on
  8. 操作成功完成

设置完目标系统后重启,在选择启动菜单时停下来,在主机上通过如下命令行运行WinDbg准备连接到目标机

[csharp] view plain copy

  1. D:\WinDbg>windbg-d-k1394:channel=10

-d表示在连接上目标系统后马上中断下来,这个也是最早的断点,该选项主要是为了在目标系统初始化早期就断下 来
查看系统状态,当前情况下可以不要,1394:channel=10表示连接方式和通道号。第一次采用1394内核调试时,
WinDbg可能会显示启动驱动失败,再次运行WinDbg应该就好了。运行WinDbg后,显示如下界面:

表示WinDbg已经准备好,正在等待1394连接。然后返回目标机,选择前面添加的启动项(也就是打开了内核调 试
选项的启动项),如下图,真实机器无法截图,这里用虚拟机截图代替。

选择该启动项后,系统就会加载内核,初始化内核调试引擎,不一会(几秒钟)就能在主机的WinDbg上看到输出信
息,接着中断在WinDbg中,如下图(写这篇文章时还是用的虚拟机截图,呵呵):

可以看到WinDbg显示已经连接到WindowsXP系统上,并显示了符号路径、内核基址等信息,然后中断下来得到 控
制权,输入k命令可以看到当前调用栈,输入g命令让目标系统继续启动。开始调试后,在WinDbg中可以随时按

Ctrl+Break组合键或通过工具栏按钮中断目标系统。

如果前面运行WinDbg时不习惯命令行方式,也可以先打开WinDbg ,然后选择菜单File/KernelDebug打开
内核调试连接对话框,切换到第二个 “ 1394” 选项卡,在channel下面的编辑框中输入通道号10,点击 “ 确定 ” 按
钮开始连接目标机。

这样和前面命令行运行WinDbg的效果一样,就是没了 -d选项,可以在等待连接的界面上按两次Ctrl+Alt+k组合 键
达到相同的效果

真实机采用1394调试时,如果目标机系统是Windows2003 (未安装ServicePack )或者WindowsXPSP 1,
则连接调试前,需要先在目标机上的 “ 设备管理器” 中禁用1394控制器。如果目标机上是Vista、 Windows2003SP1
或者WindowsXPSP2等系统之后的系统,则不要禁用1394控制器。另外,如果主机是Vista之前的系统,用1 394
调试时连接有问题,则可以尝试在主机的 “ 设备管理器” 中禁用1394网络适配器。

虚拟机双机内核调试

真实机毕竟硬件成本高,需要两台电脑,还得买连接线。如果调试要求不高,很多情况下可以用虚拟机模拟目标
机,实现双机内核调试。当前常用的虚拟机有两种: VMWare和VirtualPC ,都提供了免费版本,运行速度相当于主
机的一半左右。估计现在大家都是双核的电脑,运行虚拟机还是没问题的。 VMWare似乎速度要快一点点,而且提 供
的快照功能非常方便,可以随时把系统还原到以前保存的状态。 VirtualPC似乎兼容性要好一点,有时候在VMWare
上安装系统蓝屏,用VirtualPC就没问题。
    首先也是选择连接方式,用虚拟机只有一种串口方式,通过虚拟机模拟的串口输出到主机上的命名管道,然后
WinDbg连接这个命名管道,从而实现主机和虚拟机的连接。
   在虚拟机中安装好系统后,关闭虚拟机系统,打开虚拟机系统的设置框, VMWare中如下图:

选择Editvirtualmachinesettings ,打开设置对话框:

首先选择Add... 按钮添加Serial设备,然后按照上图设置Serial属性。命名管道名称为WinDbg连接时需要用到的
管道名, \\.\pipe\前缀不可少,后面接一个容易理解的名称即可。
VirtualPC虚拟机也差不多,先安装好系统,选择系统,点击Settings按钮:

打开虚拟机系统设置对话框,选择左边的COM1项,在右边设置输出的命名管道名称。

设置好硬件连接方式后(这里是虚拟硬件),启动虚拟机中的系统,添加调试启动项。因为虚拟机只是虚拟了串 口,
所以设置系统启动项时只能使用串口方式。 Vista之前的系统通过修改boot.ini文件实现,如下表。红色项表示新添
加的启动项, /debug表示打开内核调试引擎, /debugport=com1表示采用串口1通信, /baudrate=115200设
置串口1的波特率为115200 。

[csharp] view plain copy

  1. [bootloader]
  2. timeout=30
  3. default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
  4. [operatingsystems]
  5. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindowsXPProfessional"
  6. /noexecute=optin/fastdetect
  7. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WINXP-Debug"/noexecute=optin/debug
  8. /debugport=com1/baudrate=115200

Vista之后的系统,以管理员权限打开命令行窗口,通过bcdedit工具修改BCD数据添加启动项。

[csharp] view plain copy

  1. C:\>bcdedit/copy{default}/d"Vista-RemoteDebug-1394"
  2. 已将该项成功复制到{13fbbedc-756a-11dc-aed8-0016e68bceb3} 。
  3. C:\>bcdedit/set{13fbbedc-756a-11dc-aed8-0016e68bceb3}debugtypeSERIALDEBUGPORT:1
  4. BAUDRATE:115200
  5. 操作成功完成。
  6. C:\>bcdedit/debug{13fbbedc-756a-11dc-aed8-0016e68bceb3}on
  7. 操作成功完成

设置好启动项后,重启虚拟机中的系统,在选择启动菜单项时停下来,返回主机,通过命令行启动WinDbg。

[csharp] view plain copy

  1. D:\WinDbg>windbg-d-kcom:pipe,port= \\.\pipe\vmdbg_winxpen,baud=115200

注意红色字表示的管道名称,需要和虚拟机中的设置一样。这里照样可以通过菜单打开内核调试连接对话框来操作。

注意管道名称要一致,选中Pipe项,然后确定,WinDbg则会开始等待连接。

此时返回虚拟机中选择调试启动项,一会就能看到WinDbg中显示连接上虚拟机的信息

建立连接后,就和调试真实机一样,操作也一样。只有当调试某些和特殊硬件相关的驱动,或者调试和3D游戏

相关的程序时,还是得用到真实机。另外,运行虚拟机毕竟影响主机速度,特别是读取硬盘时感觉比较明显。而且当
WinDbg中断下目标系统后,虚拟机基本上就把CPU给占满了,双核时还好,单核时搞的主机都没办法动。当然调试
速度也是个问题,照理说都是一台电脑(虚拟机也还是运行在主机上),传输速度应该很快。但因为串口是完全模拟 的,
串口设计决定了速度不可能快,所以下面介绍一个用于虚拟机调试时的加速工具: vmkd 。

Vmkd是内核调试高手Skywing推出的一个工具,主要用于加快VMWare内核调试的速度,官方网站在:
http://www.nynaeve.net/?page_id=168 。 vmkd相当于接管了内核调试引擎传输通道,以前是:虚拟机系统内
核 <->模拟串口 <->命名管道 <->WinDbg,使用vmkd后变成:虚拟机系统内核<->vmkd内核模块kdvmware <->vmkd注入模块vmxpatch<->新的命名管道 <->WinDbg,因为不走虚拟机的模拟串口传输数据,而是虚拟机端
的kdvmware和主机端的vmxpath直接复制内存,所以传输速度大大加快。

详细使用步骤如下:
1.在虚拟机中安装好系统,并按照前一节所述设置好串口调试。
2.把vmkd带的kdvmware.sys复制到虚拟机中C:\WINDOWS\system32\drivers目录下,在虚拟机中使
用 命 令 行sccreatekdvmwarestart=demandtype=kernelbinPath=
c:\windows\system32\drivers\kdvmware.sysDisplayName=kdvmware安装驱动。

3.重新启动虚拟机中的系统,选择调试启动项进系统。

4.在主机上找到启动虚拟机的vmware-vmx.exe进程的pid ,利用vmxinject.exepid命令把vmxpatch. dll
注入到vmware-vmx.exe进程

[csharp] view plain copy

  1. D:\DbgTools\vmkd>tlist-mvmware-vmx.exe
  2. D:\ProgramFiles\VMware\VMwareServer\bin\vmware-vmx.exe-6096vmware-vmx.exe
  3. OleMainThreadWndName
  4. D:\DbgTools\vmkd>vmxinject6096
  5. OK

5.在虚拟机中通过netstartkdvmware命令启动驱动。

6.在主机上启动WinDbg连接虚拟机中的系统开始调试,命名管道名称中的winxpen是虚拟机系统的安装文
件夹(比如: d:\VMs\winxpen )。

[csharp] view plain copy

  1. windbg-kcom:pipe,port=\\.\pipe\kdvmware_winxpen,baud=115200

命名管道名称如果不确定,可用WinObjEx工具查看系统中的所有命名管道名,如下图,最下面的就是vm kd
使用的管道名。

连接后如下图:

此时再调试会发现单步速度非常快,运行一下搜索命令s就能感觉出来,甚至.dump命令也很快能执行完。

本机内核调试

本机内核调试是WindowsXP之后的系统引入的一种内核调试方式,说调试其实有点不准确,因为没有单步、 断
点等调试必备的功能,只能读写内存。不过用来查看系统内核信息时还是非常方便的,不需要两台电脑(连虚拟机也
不需要,完全在本机运行),能够利用大部分WinDbg自带的扩展命令,在XP以后的系统上都能使用,包括32/64
系统。

在Windows2003SP1之前的系统上,系统通过ntdll!ZwSystemDebugControl函数提供本机内核调试支 持。
之后的系统通过WinDbg自带的kldbgdrv.sys驱动调用nt!KdSystemDebugControl函数提供本机内核调试支持 。
官方文档建议在启动项中添加 /Debug选项启动系统,然后使用本机内核调试功能。但一般情况下不需要这么做, Vista
之前的系统上,可以直接运行WinDbg打开本机内核调试;Vista及之后的32位系统,可以利用笔者写的一个小工
具VistaLKD开启本机内核调试功能,再运行WinDbg打开本机内核调试;Vista及之后的64位系统暂时只能修改
启动项添加 /Debug选项来开启本机内核调试功能。
     启动本机内核调试非常简单,加上 -kl命令行启动WinDbg即可

[csharp] view plain copy

  1. D:\WinDbg>windbg-kl

显示界面如下:

也可以运行WinDbg后打开内核调试连接对话框,选择Local选项页,点击 “ 确定 ” 按钮打开本机内核调试功能

Vista及以后的系统,记得先以管理员权限运行VistaLKD工具,点击Enablelocalkerneldebug按钮开启本
机内核调试功能,然后再以管理员权限运行WinDbg打开本机内核调试。

本机内核调试下可以做很多事情,比如查看内核结构定义、反汇编内核函数、显示内核Hook等。

时间: 08-05

Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法的相关文章

MVC中利用ViewBag传递Json数据时的前端处理方法

用viewBag传递Json字符串到前端时,json字符串中的“会被转义为& quot,前端处理方法为@Html.Raw(Json.Encode(ViewBag.Data)),再用eval()函数解析得到json对象:var data=eval("(" + @Html.Raw(Json.Encode(ViewBag.Data)) + “)”); 如何传递的是json对象则前端使用用 jsonData=eval( @Html.Raw(ViewBag.jsonData)); 原文地

CentOS7中利用Xshell6向虚拟机本地上传文件

环境交代 Linux系统:CentOS7, Xshell版本:6 操作步骤 下面我们以一个文件上传来演示用法 第一步 在Xshell中点击如下图标,或者直接按 Alt+Ctrl+F来新建文件传输 出现弹窗直接关闭即可 然后会出现以下界面 输入help 查看可用命令 我们主要用到的命令有put, cd, ls, lls, pwd, lpwd 第二步 选择文件夹 第三步 上传文件 命令行输入put 上传完成. 注意 上传文件时,本地路径最好不要修改,否则可能会出现 sftp: cannot open

我的双系统中linux下的虚拟机建搭建(快照的方法)

Device Boot      Start         End      Blocks   Id  System/dev/sda1   *           1          13      102400    7  HPFS/NTFS                     //100M,win7的保留分区Partition 1 does not end on cylinder boundary./dev/sda2              13        7600    60

MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR(20) NOT NULL,pnum VARCHAR(50) NOT NULL); 然后插入带有逗号分隔的测试数据 INSERT INTO test(pname,pnum) VALUES('产品1','1,2,4'); INSERT INTO test(pname,pnum) VALUES('产

设置 VMware 中的 Mac OS 虚拟机进入 Recovery 模式

?  简介 本文主要介绍 VMware 中的 Mac OS 虚拟机如何进入 Recovery 模式的方法,具体步骤如下: 1.   选择 Mac OS 虚拟机,点击"打开电源是进入固件" 2.   选择"Enter setup" 3.   选择"Boot from a file" 4.   选择"Recovery" 5.   选择如图: 6.   选择"boot.efi" 7.   运行效果 原文地址:ht

初识运维3--在虚拟机中安装Linux发行版系统(CentOS)的方法

在讲Linux系统发行版本的安装过程之前,先大略说明一下虚拟化. 虚拟化:将底层硬件资源抽象为用户更容易读懂和使用的逻辑抽象层的技术. 最早由IBM提出,现使用率较高的虚拟化软件平台有三类:VMware workstation.VirtualBOX.HyperV.在这里使用VMware workstation作为例子讲解说明安装过程. 虚拟化网络: 桥接模式:让物理机和虚拟机利用物理网络接口完成通信.虚拟机可以访问互联网. 仅主机模式:让虚拟机和物理机利用被虚拟出来的VMnet1网络接口完成通信

ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而采用不同的数学模型对本不是椭球体的地球进行椭球体化.而投影坐标系,是对地理坐标系按照某种方式投影到平面上的,所以可以认为它是一个平面坐标系,单位自然是米或千米. 我们在做开发的时候,尤其

CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

SQL中利用脚本恢复数据库

SQL中利用脚本恢复数据库   编写人:CC阿爸 2014-6-15 在日常SQL数据库的操作中,如何恢复数据库 use master drop database SCS1 RESTORE DATABASE SCS1 from disk='C:\Documents and Settings\kevinzhang\桌面\eee.bak' USE master RESTORE DATABASE SCS1 from disk='C:\Documents and Settings\kevinzhang\