登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 97|回复: 0

WinDBG 配置内核双机调试

[复制链接]

68

主题

2

回帖

91

积分

网站编辑

积分
91
发表于 2025-1-5 22:23:08 | 显示全部楼层 |阅读模式

WinDBG 是在 windows 平台下,强大的用户态和内核态调试工具,相比较于 Visual Studio 它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大,WinDBG由于是微软的产品所以能够调试 Windows 系统的内核,另外一个用途是可以用来分析 dump 数据,本笔记用于记录如何开启 Windows 系统内核调试功能,并使用 WinDBG 调试驱动。
1.首先需要安装 VmWare 虚拟机,并自行安装好 Windows 10 系统,虚拟机关闭状态下添加一个 管道虚拟串口 ,此处需要删除打印机,否则串口之间冲突。
操作步骤: 编辑虚拟机设置 -> 添加 -> 串行端口 -> 完成参数配置: 使用命名管道 -> \\.\pipe\com_1 -> 该端是服务器,另一端是应用程序 -> 轮询时主动放弃CPU -> 确定
1.png

2.开启虚拟机中的 Windows 系统,然后以管理员身份运行CMD命令行,输入 bcdedit 命令,可以查看到系统的当前启动项,如果是新的系统,则只会有 {current} 启动项以及一个 {bootmgr} 项。

2.png

连续执行下方的三条命令,依次建立启动项,并激活调试模式。

  1. C:\LyShark > bcdedit /set testsigning on
  2. C:\LyShark > bcdedit -debug on
  3. C:\LyShark > bcdedit /bootdebug on
  4. C:\LyShark > bcdedit /set "{current}" bootmenupolicy Legacy // 修改启
  5. 动方式为Legacy
  6. C:\LyShark > bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200 // 设置串
  7. 口1为调试端口波特率为115200
  8. C:\LyShark > bcdedit /copy "{current}" /d "Debug" // 将当前
  9. 配置复制到Debug启动配置
  10. C:\LyShark > bcdedit /debug "{<新建的启动配置的标识符>}" on // 打开调试
  11. 开关
复制代码



一气呵成,但需要注意 {<新建的启动配置的标识符>} 需替换成 {bdb0b3b6-3f21-11ed-9931-d46011246f28} 标志,如下所示。

3.png

3.最后查看一下当前调试配置选项,执行命令 bcdedit /dbgsettings ,显示出使用的第一个串口,波特率为 115200bps ,保持默认不需要修改。

4.png

4.配置完成后,重新启动系统,在开机的时候选择 Windows10 [启用调试程序] 则系统会黑屏,说明已经正常进入调试模式了。

5.png

5.回到物理机上面,我们在命令行中切换到 WinDBG 的根目录下,并执行以下命令,即可连接虚拟机串口进行调试了。
执行命令 windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe 如下图

6.png

6.至此我们还需要加载符号,在命令行下依次执行以下命令,配置好符号加载并启动系统。

  1. kd> .sympath SRV*c:\mySymbols*http://msdl.microsoft.com/download/symbols
  2. kd> .reload
  3. kd> g
  4. kd> g
  5. kd> ed nt!Kd_SXS_Mask 0
  6. kd> ed nt!Kd_FUSION_Mask 0
  7. kd> u KiSystemServiceUser
复制代码
这样即可完成配置操作
7.png

7.最后我们配置测试一下调试功能,首先编写以下代码,代码中使用 DbgBreakPoint() 设置断点,将会在入口处中断。

  1. #include <ntifs.h>
  2. NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp)
  3. {
  4. NTSTATUS status = STATUS_SUCCESS;
  5. pIrp->IoStatus.Status = status;
  6. pIrp->IoStatus.Information = 0;
  7. IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  8. return status;
  9. }
  10. VOID UnDriver(PDRIVER_OBJECT driver)
  11. {
  12. DbgPrint("驱动已卸载 \n");
  13. }
  14. // By: LyShark
  15. NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
  16. {
  17. // 初始化默认派遣函数
  18. NTSTATUS status = STATUS_SUCCESS;
  19. Driver->DriverUnload = UnDriver;
  20. for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  21. {
  22. Driver->MajorFunction[i] = DriverDefaultHandle;
  23. }
  24. // 设置断点
  25. DbgBreakPoint();
  26. // KdBreakPoint();
  27. // __debugbreak();
  28. DbgPrint("驱动已加载 \n");
  29. Driver->DriverUnload = UnDriver;
  30. return STATUS_SUCCESS;
  31. }
复制代码

8.png

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-1-18 09:57 , Processed in 0.078101 second(s), 29 queries .

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表