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
恢复,重新启动服务,成功断点: