首页 > 其他分享 >驱动开发:WinDBG 配置内核双机调试

驱动开发:WinDBG 配置内核双机调试

时间:2022-10-15 13:00:16浏览次数:57  
标签:bcdedit WinDBG kd Windows LyShark 内核 双机 调试

WinDBG 是在windows平台下,强大的用户态和内核态调试工具,相比较于Visual Studio它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大,WinDBG由于是微软的产品所以能够调试Windows系统的内核,另外一个用途是可以用来分析dump数据,本笔记用于记录如何开启Windows系统内核调试功能,并使用WinDBG调试驱动。

1.首先需要安装VmWare虚拟机,并自行安装好Windows 10系统,虚拟机关闭状态下添加一个管道虚拟串口,此处需要删除打印机,否则串口之间冲突。

操作步骤:编辑虚拟机设置 -> 添加 -> 串行端口 -> 完成 参数配置:使用命名管道 -> \\.\pipe\com_1 -> 该端是服务器,另一端是应用程序 -> 轮询时主动放弃CPU->确定

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

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

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

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

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

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

5.回到物理机上面,我们在命令行中切换到WinDBG的根目录下,并执行以下命令,即可连接虚拟机串口进行调试了。

  • 执行命令 windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe 如下图

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

kd> .sympath SRV*c:\mySymbols*http://msdl.microsoft.com/download/symbols
kd> .reload
kd> g
kd> g
kd> ed nt!Kd_SXS_Mask 0
kd> ed nt!Kd_FUSION_Mask 0
kd> u KiSystemServiceUser

这样即可完成配置操作。

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

#include <ntifs.h>

NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
  NTSTATUS status = STATUS_SUCCESS;
  pIrp->IoStatus.Status = status;
  pIrp->IoStatus.Information = 0;
  IoCompleteRequest(pIrp, IO_NO_INCREMENT);

  return status;
}

VOID UnDriver(PDRIVER_OBJECT driver)
{
  DbgPrint("驱动已卸载 \n");
}

// By: LyShark
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
  // 初始化默认派遣函数
  NTSTATUS status = STATUS_SUCCESS;
  Driver->DriverUnload = UnDriver;
  for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  {
    Driver->MajorFunction[i] = DriverDefaultHandle;
  }

  // 设置断点
  DbgBreakPoint();
  // KdBreakPoint();
  // __debugbreak();

  DbgPrint("驱动已加载 \n");
  Driver->DriverUnload = UnDriver;
  return STATUS_SUCCESS;
}

Windows系统加载完成以后,拖入我们的驱动文件WinDDK.sys,并通过驱动加载工具加载运行,此时Windows系统会卡死,回到WinDBG中发现已经可以进行调试了。

标签:bcdedit,WinDBG,kd,Windows,LyShark,内核,双机,调试
From: https://blog.51cto.com/lyshark/5759149

相关文章

  • windbg-双机调试
    使用VirtualKD-Redux 配合windbg进行虚拟机双机调试非常方便,在实体机端选择custom按钮,自定义命令使用如下命令:"D:\ProgramFiles(x86)\WindowsKits\10\Debuggers\x64......
  • 编译安装linux内核
    下载内核​​https://www.kernel.org/​​一般下载tarball,也就是.tar.xz格式的源码包。如果​​/​​​够大,可以直接解压到​​/usr/src​​,也可以解压到机械盘上。配置sudo......
  • linux内核hash
    linux内核API文档:​​​https://www.kernel.org/doc/htmldocs/kernel-api/index.html​​​带搜索的:​​https://www.kernel.org/doc/html/latest/​​参考:​​https://sec......
  • 驱动开发:内核枚举IoTimer定时器
    今天继续分享内核枚举系列知识,这次我们来学习如何通过代码的方式枚举内核IoTimer定时器,内核定时器其实就是在内核中实现的时钟,该定时器的枚举非常简单,因为在IoInitializeTi......
  • 驱动开发:内核枚举IoTimer定时器
    今天继续分享内核枚举系列知识,这次我们来学习如何通过代码的方式枚举内核IoTimer定时器,内核定时器其实就是在内核中实现的时钟,该定时器的枚举非常简单,因为在IoInitializeTim......
  • kafka进行websocket消息分发,解决双机/集群情况下客户端与服务器的连接问题
     /***websocket消息订阅处理*/@Slf4j@Component@ServerEndpoint(value="/socket/subscribe")@ToStringpublicclassSocketSubscribeEndPoint{/**......
  • 操作系统-Linux 0.11 内核学习路线
    当初一开始拿到赵炯的书时是兴奋的,代码几乎每行都有注释,心想这不手到擒来的吗。但是代码看到十几行就看不下去了,没错就是十几行,操作系统的代码跟应用层的代码完全是两回事,......
  • linux内核编译过程及配置说明解释(6)--Networking support,Device drivers
    Networkingsupport     Networkingoptions --->                                           xx Thisinterfac......
  • linux内核编译过程及配置说明解释(8)--Security options,Cryptographic API,Virtualizatio
    Securityoptionsx   -*-Enableaccesskeyretentionsupport                                  xx Thisoptionprovidess......
  • MySQL双机热备
     1.MySQL双机热备原理双机热备就是使用MySQL提供的一种主从备份机制实现。所谓双机热备其实是一个复制的过程,复制过程中一个服务器充当主服务器,一个或多个服务器充当从服......