WinDbg

在Microsoft Store中搜索WinDbg,安装WinDbg Preview:

接下来按照官方的教程一步一步走。

双机调试

教程:(回显内核模式调试 Windows 驱动程序分步实验室) - Windows drivers | Microsoft Learn

虚拟机(被调试机)

首先确定自己的宿主机的IP地址,并且从虚拟机要能够ping到宿主机:

接着管理员打开CMD,需要编辑调试选项:

bcdedit /set {default} DEBUG YES
 
bcdedit /set TESTSIGNING ON 
 
bcdedit /dbgsettings net hostip:100.98.212.46 port:50000 key:2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

设置完成后查看一下选项是否正确:

C:\Windows\system32>bcdedit /dbgsettings
key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
debugtype               NET
hostip                  100.98.212.46
port                    50000
dhcp                    Yes
操作成功完成。

如果没有问题,那么继续;否则重新执行错误选项的命令。

暂时不要重启虚拟机,待后面设置完成后再重启。

宿主机(调试机)

在宿主机上打开WinDbg Preview,然后选择Attach To Kernel,填入端口以及密钥:

然后点击OK,会进入等待状态:

接下来重启虚拟机,没有意外的话,应该已经连接上了:

调试过程

开机过程默认断点

注意在重启时,可能会遇到系统的默认断点,需要在WinDbg里进行操作才能使操作系统恢复运行,否则会一直卡在断点处:

此时在命令框里输入g或者直接点击Go的按钮都可以恢复。

这类默认断点有两个,一直恢复即可。

驱动调试

先写一个最简单的驱动程序:

#include <ntddk.h>
 
void DriverUnload(PDRIVER_OBJECT pDriverObject);
 
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
	UNREFERENCED_PARAMETER(pRegPath);
	KdPrint(("DriverEntry ok\n"));
	NTSTATUS status = STATUS_SUCCESS;
	pDriverObject->DriverUnload = DriverUnload;
	return status;
}
 
void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	UNREFERENCED_PARAMETER(pDriverObject);
	KdPrint(("DriverUnload ok\n"));
 
	return;
}

编译后产生一个sys文件,然后装载这个驱动:

C:\Users\0\Desktop>sc create DriverTest type= kernel binPath= C:\Users\0\Desktop\MyDriver.sys start= demand error= ignore
[SC] CreateService 成功
 
C:\Users\0\Desktop>sc query DriverTest
 
SERVICE_NAME: DriverTest
        TYPE               : 1  KERNEL_DRIVER
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

IDA分析一下,随便找个地方断下来,就0x502C吧:

在WinDbg里点击Break,然后输入命令:bu MyDriver+0x502C,然后g恢复,重新启动服务,成功断点: