首页
论坛
专栏
课程

[原创]Hyper-V安全从0到1(2)

2017-11-8 23:19 5902
ifyou
4

[原创]Hyper-V安全从0到1(2)

2017-11-8 23:19
5902

3. Hyper-V的调试

        下面我们介绍Hyper-V的调试方法。在前面,我们简单介绍了Hyper-V的结构,它的虚拟机和宿主机运行在同一个权限下,并且,由Windows系统中的驱动虚拟出对应的虚拟设备。所以,在调试方面,Hyper-V便显得略繁琐。如果要调试Hyper-V在宿主机中的驱动的话,不得不要进行Windows内核的调试。

         而且,由于Hypervisor层的权限要高于Windows内核权限,所以当需要调试Hypervisor层代码时,仅仅调试Windows内核并不能满足这一要求。

         下面,我们介绍两种不同的方法来调试Hyper-V。一种是实体机双机调试,一种是VMware调试Hyper-V,并且我们会分别介绍两种方法的优缺点。

3.1. 需要准备的工具

         在介绍两种调试方法之前,我们需要做一些准备。首先,我们要确定以哪种方式进行调试。如果你使用的机器是笔记本或者电脑主机没有串口接口,并且确定主机的CPU支持Intel VT-X和VT-d技术(如果您的CPU是AMD,请确认是否支持AMD-V和AMD-Vi)。拿笔者主机的CPU为例,如图1-20,支持Intel VT-x & VT-d。那么,您可以优先选择使用VMware双机调试Hyper-V。


图1-20 CPU型号为Intel i7- 4790

         如果您的机器不支持Intel VT-d(AMD-Vi)的话,只能使用双实体机双机调试的办法调试Hyper-V。

         如果调试方法采用VMware双机调试,那么在下面准备过程中,只需要准备软件工具即可。如果采用双实体机双机调试方法,则在软件工具基础上还需要准备硬件上的工具。

         在调试方法上,一般情况下,无论是实体机双机调试还是VMware双机调试,笔者还是优先选择使用网络调试的办法。因为网络调试的速度快,配置容易,调试效率极高。但是,在网络调试的调试底层代码过程中,可能因为网络调试引入新的问题,影响调试的结果。但串口调试不会产生这种“干扰”,但随着而来的是调试效率的极度下降。所以一般来说,笔者会使用网络调试作为一般情况下调试的方法。如果发现问题,会再在串口调试的环境下重新调试一遍,以排除干扰。而且,一般来说比较旧的机型保留串口的几率要大些,可以充分利用身边淘汰下来的旧机器作为串口调试机器。除此之外,也有1394线的调试办法,介于1394接口已经在现在的主机上消失了,现在使用1394线调试还需要自行安装1394 PCI板载卡。过程比较麻烦,所以在此不做考虑。

那么下面介绍一下我们所需要的软件和硬件上的工具。

硬件工具

         首先,需要确定您的主机后面板是否有串口接口,如果没有,那只能通过网络调试的办法进行双机调试。这需要您将两台主机连接在一个局域网内,并且能保证双方的正常通信。

         如果主机后面板有串口接口,那么您可以使用串口进行双机调试。那么您需要一根RS232 Null- modem线。Null-modem线的接线见表1-4。


表1-4 Null-modem接线方式

         Null-modem线一般在商场中是买不到的,所以可能需要你自己做或者找能定做线缆的商家定做。事实上,笔者在调试时,只需要将9针串口线两端的2,3脚对调,其他线路直连便可正常进行双机的通信和调试。


图1-21 9针串口管脚定义(左公右母)

图1-21为9针串口管脚定义,左边为公头,右边为母头。



软件工具

         软件方面需要安装好WinDbg,最新版的SDK安装包可以到微软官方下载(https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit)。除此之外,我们还需要微软的符号文件,请根据你被调试的系统到微软官方下载符合您被调试系统的符号文件包(https://developer.microsoft.com/en-us/windows/hardware/download-symbols)。

         如果使用双实体机串口调试,那么还需要安装好HyperTerminal(http://www.hilgraeve.com/hyperterminal-trial/),或者其他串口通信的软件,用于检测串口是否正常通信。

         下面我们配置WinDbg符号文件地址。我们需要新建一个环境变量,如图1-22所示。


图1-22 添加系统环境变量

         在“环境变量”对话框中,点击“新建”按钮来新建一个系统环境变量。在“新建用户变量”对话框中,在“变量名”中填入“_NT_SYMBOL_PATH”,在“变量值”中填入“SRV*d:\symbols*http://msdl.microsoft.com/download/symbols”,然后确定保存。其中,“变量值”一栏中“d:\symbols”代表你安装符号文件包时选择的安装位置;“http://msdl.microsoft.com/download/symbols”代表微软的符号文件服务器,如果本地符号文件中没有匹配的符号文件时,便会从微软符号文件服务器上下载所需的符号文件。这个新建的环境变量用于配置全局符号文件地址,由于我们添加在了系统环境变量中,所以不用每次启动WinDbg再去重新设置符号文件地址。。由于笔者之前配置过环境变量,所以图中显示的是“编译用户变量”对话框。

         如果您用WinDbg附加到任意一个进程时,输入命令“.sympath”如图1-23所示,那么说明符号已经设置成功了。


图1-23


3.2. 实体机双机调试环境搭建

         下面我们介绍实体机的双机调试,这部分只介绍使用串口进行双机调试的方法。通过网络双机调试方法和下面“VMware双机调试环境搭建”大部分是一样的,只不过实体机双机网络调试用的是真实的网络设备而已。

         首先,用Null-modem线或者2,3口交叉的RS232线将两台实体机连接起来。然后开机,分别在“设备管理器”中查看“端口”。如图1-24所示,左边是调试机,已经把另一端的被调试机主机串口识别为COM2;右边是被调试机,把调试机主机的串口识别为COM1。

图1-24

         下面,设备双方串口的波特率,我们以调试机为例。在“设备管理器”的“端口”项中右键单击“通信端口”,“属性”,然后选择“端口设置”选项卡,如图1-25。


图1-25

         然后将选项卡中的内容选择和图1-25一样,单击确定后保存退出。被调试机也是这样设置,并且一定要和调试机设置成一样的配置。然后两台实体机分别打开HyperTerminal,选择对方的端口进行通信,如果双方信息的收发都没有问题,那么恭喜您,串口已经能正常通信了。

         如果两台实体机之间能稳定通过串口通信,那么下面还需要配置被调试机。笔者被调试机系统版本是Windows 10 14393 rs1,我们需要修改系统的BCD来完成被调试机一端的配置。下面的配置过程都是在命令提示符中操作的。

         首先,先设置被调试机的Root Partition(Windows 内核)部分的配置。输入以下命令。

$bcdedit /set dbgtransport kdhvcom.dll   
$bcdedit /dbgsettings serial DEBUGPORT:1   BAUDRATE:115200   
$bcdedit /debug on

        上面三句分别为:设置调试中用于通信的文件;设置调试方法为串口调试,并且使用com1口(这里的com1端口,便是上文中被调试机识别出的调试机端口号)作为调试端口,波特率为115200;设置调试开关为开启。

       下面是设置Hypervisor层代码调试的配置。命令如下。

$bcdedit /hypervisorsettings serial DEBUGPORT:1 BAUDRATE:115200
$bcdedit /set hypervisordebug on
$bcdedit /set hypervisorlaunchtype auto

        上面语句用来设置Hypervisor层代码由com1口作为调试端口,设备波特率为115200,并开启Hypervisor层代码的调试开关。

如果上面的命令都成功的执行,便可以开始设置调试机配置了。

        首先,在调试机上新建一个connect.bat文件,打开编辑器,输入下面代码。

 
    vmdemux.exe -src com:port=com2  

然后保存退出编辑器。

         这个命令的意思是,打开串口号为com2的串口,并且自动设置波特率,然后创建两个管道文件,分别供Hypervisor代码和Windows内核代码调试用。

         下面新建一个快捷方式,在“请键入对象的位置”中填入“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k com:port=\\.\pipe\vm0,baud=115200,pipe,reconnect”。“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe"”部分是WinDbg的地址,然后跟的是参数。这些参数意思是,开始内核调试,并通过端口“\\.\pipe\vm0”,波特率为115200。这里面“\\.\pipe\vm0”便是vmdemux.exe创建的管道文件,vm0用于调试Hypervisor层代码用。最后将快捷方式重命名为“hypervisor”。

         再新建一个快捷方式,和上面一样,但是这次在“请键入对象的位置”中填入“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k com:port=\\.\pipe\vm1,baud=115200,pipe,reconnect”。这个用来调试Windows内核代码,并将快捷方法重命名为“kernelroot”。

       到此,双机调试的准备已经完成了。下面要先运行connect.bat然后在运行两个快捷方式“hypervisor”和“kernelroot”。开启被调试机电源,观察WinDbg的回显。

         如图1-26所示,双机环境便搭建完成了,调试机可以随时中断被调试机的运行。

图1-26


3.3. VMware双机调试环境搭建

         下面我们介绍VMware双机调试环境的搭建。这一部分也适用于实体机双机网络调试,只不过我们使用的网络环境是VMware虚拟出来的。在开始搭建环境之前,先确保您的主机CPU支持Intel VT-d 和 VT-x(AMD-V AMD-Vi)特性,并且拥有足够大的内存,至少要大于8G,否则之后嵌套运行虚拟机时性能会非常低下。

         第一步,修改VMware配置文件和虚拟机配置。

        由于我们要在VMware虚拟出来的Windows系统中安装并运行Hyper-V虚拟机,所以需要一些特殊的配置来“欺骗”Windows系统,让它认为自己是一台真实的机器,并得以安装和运行Hyper-V虚拟机。


图1-27

        下面先在VMware中新建一个虚拟机,并分配不少于4G的内存,使用“NAT网络地址转换”作为网络方面的配置。然后安装Windows系统,笔者这里安装的虚拟机系统版本是Windows 10 14393 RS1。安装好系统后,关机,下面需要更改一些配置。

         打开VMware的“虚拟机设置”面板,在“硬件”选项卡中,选择“处理器”选项,如图1-27。图1-27中,在“虚拟化引擎”中的“首选模式”选择“Intel VT-x/EPT 或 AMD-V/RVI”,并勾选上“虚拟化Intel VT-x/EPT 或 AMD-V/RVI(V)”和“虚拟化CPU性能计数器”两项。点击确定保存配置并退出。

         然后修改创建的虚拟机的配置文件,找到创建的虚拟机文件位置,在虚拟机目录下,找到Windows 10 x64.vmx文件(这里以笔者机器为例,你的机器上应该是:你的虚拟机名称.vmx)。然后用编辑器打开这个文件,在文件的末尾加上:

hypervisor.cpuid.v0 = “FALSE” 
mce.enable = “TRUE” 
vhv.enable = “TRUE”  

         在vmx文件中可能会存在上面中的配置语句,那么先要检查下原有的配置是否和上面语句相同,若不相同需要修改,然后把vmx文件中未出现的配置语句加到文件末尾,保存文件退出。

         “hypervisor.cpuid.v0”设置成FALSE的意义为欺骗虚拟Windows系统没有运行在虚拟机中;“mce.enable”设置成TRUE意义为启用Machine Check Exception(MCE);“vhv.enable”设置成TRUE意义为启动嵌套虚拟化。

         下面启动修改好配置的虚拟机,然后就可以按照6.1.2章节的方法安装和配置Hyper-V了。

         第二步,配置虚拟Windows主机的调试环境。

         现在我们已经成功在VMware虚拟机中安装好Windows系统并且可以运行Hyper-V虚拟机了。下面还要对Windows虚拟机进行配置,实现网络双机调试。

         由于我们在创建虚拟机时网络配置选择的是“NAT网络地址转换”,所以虚拟机的IP是192.168.230.175。那么宿主机便是192.168.230.1。如图1-28。如果宿主机和VMware虚拟的Windows系统之间能互相ping通对方,说明网络配置正常,可以继续下面的配置。


图1-28

         同样的,在打开的命令提示符中,我们输入如下的命令:

$bcdedit /set dbgtransport kdnet.dll
$bcdedit /dbgsettings NET HOSTIP:192.168.230.1 PORT:50000
$bcdedit /debug on
$bcdedit /hypervisorsettings NET HOSTIP:192.168.230.1 PORT:50001
$bcdedit /set hypervisordebug on
$bcdedit /set hypervisorlaunchtype auto

         上面的命令已经在3.2章节中做过介绍了,不同的是第2个命令和第4个命令。这两个命令作用分别是:在被调试机系统启动过程中连接到IP为192.168.230.1,端口为50000的调试机,用于调试被调试机的Windows内核代码;在被调试机系统启动过程中连接到IP为192.168.230.1,端口为50001的调试机,用于调试被调试机的Hypervisor层代码。

         以上命令执行完成后,查看配置信息。输入如下命令:

$bcdedit /dbgsettings
$bcdedit /hypervisorsettings

         结果如图1-29所示,这两个命令分别显示出了刚才设置的配置。其中,“key”字段十分重要的,它相当于调试的凭证,如果凭证不对是无法调试目标主机的,所以它需要我们记录下来,并且妥善保存。注意,其中的key值因不同的机器而异。

图1-29

         上面的配置见表1-5。


         这张表中的数据需要保存下来,因为在下面的配置中会用到。

         第三步,配置调试机的调试环境。

         现在我们开始配置调试机端。还是和3.2章节中介绍的一样,新建一个快捷方式,在“请键入对象的位置”中填入“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windb

g.exe" -k net:port=50000,key=1alb1q6593i2s.1k6o4ts8tzv39.1w72krxwkrv11.3bqw9vhvl5uth”,并命名为“kernelroot”,用于调试Windows内核代码。同样的,再新建一个快捷方式,在“请键入对象的位置”中填入“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k net:port=50001,key=n05t1fb0wyf0.137txzjv7e9ze.1srubjv5hkoo9.1iw56k4pkn6a3”,并命名为“hypervisor”,用于调试Hypervisor层代码。

         和3.2章节不同的是,网络双机调试不需要运行vmdemux命令,不同的端口对应不同的调试目标。下面我们双击运行两个快捷方式,然后开启虚拟机电源,等待被调试机主动连上调试机的WinDbg。

         如图1-30,调试机中的WinDbg分别捕获到了Hypervisor层和Windows内核的调试信息,并且可以随时中断被调试机的运行。通过WinDbg对被调试机简单的调试操作,会明显的发现在调试速度上有了明显的提升,基本和调试用户态下的程序速度相同。这对我们对Hyper-V进行安全研究提供了非常有利的条件。

         所以,综上所述,在硬件条件允许的情况下,还是优先选择使用VMware进行双机调试的办法去调试Hyper-V,这样做确实很省时省力。笔者曾经使用串口进行双机调试,一条汇编指令运行2-3秒都是很常见的情况,在调试中浪费了大量的时间。


图1-30


______________________________________________________________________________________________
本文如需引用转载请联系本文作者,看雪ID:ifyou


[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上传的附件:
上一主题 下一主题
最新回复 (8)
yangya 2017-11-9 11:09
2
0
vmware调试的时候开启调试模式命令是在虚拟Windows里面运行的?
yangya 2017-11-9 11:25
3
0
楼主用过USB双机调试hyper-V没有?
z许 2017-11-9 12:58
4
0
顶个。这个系列好系列啊。支持。
ifyou 4 2017-11-10 08:15
5
0
yangya 楼主用过USB双机调试hyper-V没有?
自己没有亲自试过USB调试  不过你可以看看这个http://advdbg.org/blogs/advdbg_system/articles/5954.aspx
hackyzh 3 2017-11-10 15:18
6
0
虚拟化CPU性能计数器  这个Inter  i7-7700HQ  CPU无法启用?,还有vhv.enable这个加入之后报错。。。
yangya 2017-11-17 10:42
7
0
ifyou 自己没有亲自试过USB调试 不过你可以看看这个http://advdbg.org/blogs/advdbg_system/articles/5954.aspx
这个我弄过,我经常用windbg双机实体机调试。  但是没试过用USB调试Hyper-V(双机,非虚拟机)。
聖blue 2017-11-18 20:31
8
0
不错!!
murkfox 2018-8-29 16:17
9
0
还是很尴尬的。。。。
游客
登录 | 注册 方可回帖
返回