Windows双机调试是Windows驱动开发、内核分析中常用的内核调试方式,一般双机调试方式是使用VMware创建Win10调试虚拟机,通过串行端口或者网络进行调试,由于目前我的主力机是使用ProxmoxVE搭建的,因此这里尝试使用ProxmoxVE构建双机调试环境。
0x00 前言
首先为不了解的朋友简单介绍一下ProxmoxVE(简称pve),pve是一块开源的服务器虚拟环境,pve基于Debian系统,使用kvm虚拟化,与Vmware的ESXI类似,可以通过网页远程创建虚拟机,当然你可以理解为运行在裸主机上的Vmware Workstation Pro或Virtualbox,下图为pve的管理主页:
由于Windows双机调试需要使用到一台Windows调试机(debuger),一台Windiws被调试机(debugee),而pve只是一台linux的虚拟机管理程序,因此我们需要在pve中创建两台Windows虚拟机,并将其串口相互连接,剩下的操作与使用Vmware双机调试类似。
0x01 单机调试
pve正常安装Windows10环境,首先尝试一下本机调试调试是否能够正常运行,此种方式可以查看内核中的各项数据;但本地内核调试不能影响系统的运行,所以不能打断点、单步调试等等。
下载安装Windows调试工具。可以在微软官网直接下载WindowsDbg,也可以在应用商店里下载WinDbg Preview:
设置symbol file path
环境变量。symbol file path
指明Windows符号文件所在位置,虽然symbol file path
不设置也可以正常使用,但是每次有需要重新下载symbol file
,受网络影响很大,通过设置symbol file path
可以将下载后的symbol file
存储在该位置,下一次使用时将直接使用下载完成的symbol file
。symbol file path
还有一个好处就是其他编译器例如visual studio也可以直接使用下载完成的符号文件symbol file
,symbol file path
格式如下:
srv*{cache path}*{symbol server}
样例:
_NT_SYMBOL_PATH
srv*C:Symbols*https://msdl.microsoft.com/download/symbols
启动Windows调试模式。如果需要进行kernel debug,需要使用bcdedit
修改windows的启动配置数据文件,使用管理员权限打开powershell:
# 开启debug模式
bcdedit /debug on
# 查看bcdedit配置
bcdedit
# 配置dbgsettiongs为local模式
bcdedit /dbgsettings local
使用
bcdedit
修改是永久修改的,每次开机都会进入调试模式,如果不想影响当前配置,可以使用bcdedit
复制一份当前配置,重新进行修改即可,这样开始时会有不同的引导选项进行选择。
开始调试。使用管理员权限打开WinDbg,在File-Kernel Debug
或者File-Attach to kernel
,选择Local
本地调试标签,
之后便可以进行单机调试,但是此种方式无法进行断点调试,只能查看内核数据。例如,在WinDbg命令窗口键入!drvobj ACPI
,表示查看ACPI.sys
驱动程序的物理设备对象,输出结果中Physical Device Object
列出了与该驱动程序关联的所有物理设备对象:
输入!devobj ffffba08e661cdf0
,则显示出该设备的一些基础信息。
0x02 双机网络调试调试
双机调试一般都是使用串口进行调试,从Windows8开始微软提供了网络调试内核的方法,其简称为kdnet
,是目前微软推荐的内核调试方法。
创建Win10调试机。双机调试需要两台Windows虚拟机,因此我们需要创建一个Win10调试机(debuger),同样需要重新配置该调试机的symbol file path
环境变量。。而上一步创建的Win10还是作为被调试机使用,不过需要修改一些配置:操作系统类型时应选择 Other
类型,如果选择 windows
类型,ProxmoxVE 在虚拟化时会提供 Hyper-V 的各项支持,以此来提高虚拟机的性能,但这些选项可能会导致网络调试无法正常运行,修改位置如下:
除此之外,Windows网络调试对网卡有一定的要求,因此debugee机需要选择Intel E1000
,其他网卡可能需要安装特定驱动程序才能使用。
配置Win10被调试机。可以使用官方的kdnet
工具进行自动配置,但是微软应用商店里的Windbg
是不完整的,并不包含kdnet
工具,因此我们需要使用Windows SDK所所安装的Windbg
,kdnet
位于C:Program Files (x86)Windows Kits10Debuggersx64
。自动配置需要将kdnet.exe
和*VerifiedNICList.xml* 文件
复制到目标计算器中C:KDNET
目录下,运行.kdnet.exe
查看网卡是否支持,虽然Intel E1000
是支持网络调试的,但是kdnet
并未识别成功,可能存在bug。
因此我们使用官方手动配置教程,进行配置:
# 开启debug模式
bcdedit /debug on
# 配置调试机的ip地址和端口,将会自动生成随机keyy
bcdedit /dbgsettings net hostip:192.168.121.11 port:50000
# 配置调试所使用的网络适配器适配器的 PCI 总线、设备和功能编号。
bcdedit /set "{dbgsettings}" busparams x.y.z
可在设备管理器中获取用于调试的网络适配器的PCI总线x、设备编号y、功能编号z,如下图所示,当然只有一个网卡的时候,不需要进行配置,默认使用该网卡。
连接Win10被调试机。在Windbg输入被调试机的ip地址和上一步生成的key,调试器连接并等待连接后,重启目标服务器即可,重启后Windbg将自动连接上。
shutdown -r -t 0
0x03 参考
[微软官方]本地内核模式调试.https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/performing-local-kernel-debugging
ProxmoxVE 下的 Windows 内核调试环境配置.https://paper.seebug.org/2052/
Windows Kernel Debug.https://144.one/windows-kernel-debug.html
原文始发于微信公众号(Bits):[学习笔记]ProxmoxVE环境下的Windows双机调试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论