本文将详细介绍使用 AMD CPU 的电脑如何利用 VMware Workstation 搭建 Hyper-V 的调试环境。
上一篇文章《Hyper-V on Windows 10 Notes》提到了 Hyper-V 暂时不支持 AMD CPU 的嵌套虚拟化,所以就无法使用文章《First Steps in Hyper-V Research》中介绍的 Hyper-V 嵌套虚拟化来搭建 Hyper-V 的调试环境,本文参考文章《Hyper-V #0x0 - Research setup》中介绍的方法利用 VMware Workstation 来搭建 Hyper-V 的调试环境。
0x01. 物理机设置
物理机不需要安装 Hyper-V 组件,否则 VMware Workstation 将无法运行;如果物理机安装了 Hyper-V,可以参考文章《VMware Workstation Incompatible with Device/Credential Guard》临时禁用 Hyper-V。
0x02. 虚拟机设置
物理机安装好 VMware Workstation 之后,可以新建一个虚拟机并安装好最新的 64 位 Windows 10 操作系统。
2.1 虚拟机 CPU 设置
这里需要在 VMware Workstation 中为虚拟机的 CPU 开启虚拟化引擎:
- 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V)
- 虚拟化 CPU 性能计数器(U)
同时,需要为虚拟机增加一个串口用于 Windows 内核调试(虚拟机默认有一个打印机,需要先把打印机删掉):
- 使用命名管道
\\.\pipe\com_1
- 该端是服务器
- 另一端是虚拟机
2.2 虚拟机 Hyper-V 设置
这里需要在安装好的虚拟机中安装并启用 Hyper-V 组件,同时通过 bcdedit
设置相关的调试选项。
- 内核调试设置(通过串口进行调试)
bcdedit /dbgsettings serial debugport:1 baudrate:115200 |
- Hyper-V 调试设置(通过网络进行调试)
bcdedit /hypervisorsettings NET HOSTIP:192.168.6.1 PORT:50000 |
注意这里的 IP 地址是物理机中网卡 VMware Network Adapter VMnet8
的 IP 地址,端口设置为 50000
。这条命令执行完毕之后产生的一个 Key 需要记下来,后面 WinDbg 设置将会用到。
0x03. WinDbg 设置
复制两个 64 位 WinDbg 的快捷方式,其中一个附加如下参数用于调试 Windows 内核:
-k com:port=\\.\pipe\com_1,baud=115200,pipe,reconnect |
另一个附加如下参数用于调试 Hyper-V:
-k net:port=50000,key=前面生成的Key字符串 |
0x04. Hyper-V 调试
一切准备就绪之后,先打开两个 WinDbg,然后开启虚拟机,就可以开始调试了。
在调试 Hyper-V 的 WinDbg 中,可以查看 hv
模块的相关信息:
0: kd> lmvm hv |
因为这里物理机使用的是 AMD 的 CPU,所以 hv
模块实际上是 hvax64.exe
;如果是 Intel 的 CPU,那么会是 hvix64.exe
。
在调试 Windows 内核的 WinDbg 中,可以查看 hypercall
对应的指令:
3: kd> u poi(nt!HvcallCodeVa) |
因为这里物理机使用的是 AMD 的 CPU,所以 hypercall
对应的指令为 vmmcall
;如果是 Intel 的 CPU,那么 hypercall
对应的指令为 vmcall
。
对 vmmcall
所在的位置下断点,需要使用硬件执行断点:
3: kd> ba e1 poi(nt!HvcallCodeVa) |
和系统调用一样,不同的 hypercall
对应不同的编号,编号可以用于定位对应的 Handler 函数。在地址 hv+0xC00000
处,每一个 hypercall
有一个 0x18
字节的结构体,其中结构体最前面的 8
字节便是对应的 Handler 函数的起始地址。
4: kd> dq hv+0xC00000 |
0x05. 调试符号
微软已经逐步开放了 Hyper-V 相关组件的调试符号,但是 hv
模块(即 hvax64.exe / hvix64.exe
)的调试符号暂时不对吃瓜群众开放。
微软还为 WinDbg 开发了一个调试 Hyper-V 的插件 hvexts.dll
,但目前也没有对外开放。