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

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

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

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

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

image.png

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

image.png

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

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}标志,如下所示。

image.png

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

image.png

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

image.png

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

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

image.png

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

这样即可完成配置操作。

image.png

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中发现已经可以进行调试了。

image.png

目录
相关文章
|
3月前
|
小程序 存储控制器 Android开发
OPENJTAG调试学习(二):OpenOCD、OpenJTAG 烧写程序、调试程序
OPENJTAG调试学习(二):OpenOCD、OpenJTAG 烧写程序、调试程序
150 0
|
17天前
|
监控 安全 API
7.3 Windows驱动开发:内核监视LoadImage映像回调
在笔者上一篇文章`《内核注册并监控对象回调》`介绍了如何运用`ObRegisterCallbacks`注册`进程与线程`回调,并通过该回调实现了`拦截`指定进行运行的效果,本章`LyShark`将带大家继续探索一个新的回调注册函数,`PsSetLoadImageNotifyRoutine`常用于注册`LoadImage`映像监视,当有模块被系统加载时则可以第一时间获取到加载模块信息,需要注意的是该回调函数内无法进行拦截,如需要拦截则需写入返回指令这部分内容将在下一章进行讲解,本章将主要实现对模块的监视功能。
33 0
7.3 Windows驱动开发:内核监视LoadImage映像回调
|
7月前
|
虚拟化
双机内核调试 101
双机内核调试 101
驱动开发:WinDBG 常用调试命令总结
Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。Windbg不仅可以调试应用程序,还可以进行Kernel Debug。结合Microsoft的Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。Windbg支持的平台包括X86、IA64、AMD64。
416 0
|
Linux Android开发
RK3399平台开发系列讲解(内核调试篇)2.51、什么是硬件断点
RK3399平台开发系列讲解(内核调试篇)2.51、什么是硬件断点
120 0
RK3399平台开发系列讲解(内核调试篇)2.51、什么是硬件断点
|
Windows
vxworks环境下反汇编工具使用技巧
vxworks环境下反汇编工具使用技巧
274 0
vxworks环境下反汇编工具使用技巧
|
开发工具 内存技术
zynq程序固化补充篇: 不切换启动模式强制烧写
使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)
1453 1
zynq程序固化补充篇: 不切换启动模式强制烧写
|
Linux Shell 网络安全
【开发/调试工具】【Linux】嵌入式Linux环境下如何自动化执行操作
【开发/调试工具】【Linux】嵌入式Linux环境下如何自动化执行操作
228 0
【开发/调试工具】【Linux】嵌入式Linux环境下如何自动化执行操作
|
消息中间件 网络协议 Shell
VxWorks操作系统shell命令与调试方法总结
<div><p><br></p></div> <p align="center"><strong>VxWorks下的调试手段</strong></p> <p>主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤、思路。<strong></strong></p> <h1> <a target="_blank" name="_Toc80412618">1         To
18256 0
|
NoSQL 前端开发 Linux
【调试】SystemTap调试网卡状态一例
调试其实不仅仅是针对内核或者进程崩溃的情况,很多时候我们需要跟踪的问题并不是通过分析一个core dump能够解决的,比如类似一些状态信息输出不对,或者内核或程序行为不符合预期。此时我们经常需要依赖于日志,尤其是内核层面的问题。
【调试】SystemTap调试网卡状态一例

热门文章

最新文章