Windows hypervisor&内核调试的几种常见/不常见方法
一、前言 本文主要介绍了使用调试器对Windows操作系统的内核层和hypervisor层进行双机调试的几种常见和不常见的方法。本文中使用的windbg调试器和其附带的实用调试工具都可以在windows sdk安装包中选择安装,windows sdk安装包官方的下载地址是: (https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/)。 有需要的读者可以自行下载并安装。 二、串口调试 首先我们先来介绍使用VMware虚拟机的情况下如何使用串口进行双机调试Windows内核及hypervisor。 在VMware的虚拟机设置中,添加"串行端口"设备后,并设置"串行端口"设备"使用命名的管道",这里命名管道的名称可以自己设定,并分别选择"该端是服务器"和"另一端是应用程序"。如下图。 然后我们在被调试机中设置bcdedit参数,这里的目的是在系统启动过程中添加debug参数。如下图。 在被调试机中我们分别使用bcdedit /dbgsettings serial debugport:1 baudrate:115200和 bcdedit /hypervisorsettings serial debugport:1 baudrate:115200命令将Windows内核和hypervisor的调试参数设置为串口调试,串口为com1,波特率为115200。然后再使用bcdedit /debug on和bcdedit /set hypervisordebug on命令分别开启windows内核和hypervisor层的调试。最后设置dbgtransport为kdcom.dll,这里是为了保证被调试机在系统启动过程中使用串口进行调试。 现在被调试机已经整装待发做好了被调试的准备,但调试机还需要一些配置。因为我们需要同时调试windows的内核和hypervisor,而且在被调试机的参数中使用了同一个串口(com1)作为调试串口,所以需要将不同层级的调试数据分发,根据不同层级将调试数据分发到不同的命名管道。我们可以使用& 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\vmdemux.exe' -src pipe:pipename=com2命令实现这一过程。 成功运行如上命令后,vmdemux进程会自动生成两个命名管道\\.\pipe\Vm0和\\.\pipe\Vm1。分别使用& 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe' -k com:port=\\.\pipe\Vm0,pipe,resets=0,reconnect和& 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe' -k com:port=\\.\pipe\Vm1,pipe,resets=0,reconnect命令打开windows hypervisor和内核的调试窗口。如下图。 下面我们介绍在双实体机的情况下如何使用串口进行双机调试。 双实体机进行串口调试需要被调试机的主板上保留9针串口,在10年前的电脑主板上,串口几乎是标准配置,然而随着主板厂商的革新,主板串口也渐渐退出历史舞台。 除了需要主板中保留串口外,还需要拥有一条串口调试线:Null-modem线,或者准备一条2,3交叉线。关于Null-modem调试线的线序如下图,感兴趣的读者可以自己手动做一条。 当使用串口调试线连接好调试端和被调试端,就可以使用 & 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\vmdemux.exe' -src com:port=com2命令将不同层级的数据分发到指定的层级,实现windows内核和hypervisor调试。 三、网络调试 Windows内核和hypervisor调试中,可以使用网络进行调试,不需要特殊的调试线连接两台机器,网络调试大大方便了双机调试中的准备过程。 首先,配置被调试机bcdedit配置,这里假设我们的调试机IP地址为192.168.111.1,调试hypervisor的端口为52201,调试windows内核的端口是52202。运行如下图的命令,设置网络调试,最后将dbgtransport设置为kdnet.dll。 在图中可以看到,如果成功设置了网络调试后,会返回一个key,这个key是用来给调试机中的windbg连接被调试机使用的。这里这两个key要先记下来。 重启被调试机后,在调试机端使用& "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k net:port=52202,key=rq644uvs2p16.3ked98d1isrrq.hr7oioflkdt2.37b29ko4f79yj和& "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg....