首页 > 系统相关 >Windows驱动调试方法

Windows驱动调试方法

时间:2024-09-24 15:52:09浏览次数:9  
标签:WinDbg Windows 虚拟机 参数 驱动 NULL 连接 调试

单步调试驱动

驱动的调试不能直接在本机上进行,而是要放在虚拟机(或其它设备)中。这是因为在内核模式下,一个断点的触发将会停下整个系统而不只是单个进程。

在前面的文章里,使用了DbgPrint函数来进行日志的输出,但这种方法不能进行单步调试。下面介绍两种调试方法。

基于Visual Studio的调试方法

参数配置前准备

在第一篇文章的末尾指出需要准备一台虚拟机,现在就能够派上用场了。

说明:在Vmware中,使用NAT模式,虚拟机可以直接跟物理机通信。

我这里的配置如下:

说明版本IP虚拟机版本
调试机器 (本机)Windows 10 x64 1903192.168.109.1   NULL
被调试机器 (虚拟机)Windows 11 x64 21H2192.168.109.128Vmware 17

最初我在虚拟机里装Windows 11只是为了测试其它的程序,这里也懒得重新装了,直接用Windows11测试。

建议还是选择同版本系统进行测试,以免影响驱动运行及测试。

如果在本机ping虚拟机,发现ping不通,应该是防火墙的问题

 可以关闭虚拟机防火墙,如下

 关闭后就可以ping得通了。

参数配置

接下来我们在虚拟机中进行配置:

以管理员运行命令提示符,完成以下操作

说明:bcdedit用于修改启动配置数据存储,这里不做详细介绍,感兴趣的可以参考以下链接

1、开启调试模式

1 bcdedit /debug on

参数 /debug: 启用或禁用指定启动项的内核调试程序

参数 on:  启用内核调试

2、配置调试模式参数

1 bcdedit /dbgsettings net hostip:192.168.109.1 port:50000

参数/dbgsettings:设置或显示系统的全局调试程序设置

参数 net :使用网络进行调试的连接方式,

参数 hostip:调试机器的IP,即上面表格中列出的192.168.109.1

参数 port:表示所使用网络的端口,这里使用的50000(建议范围是49152至65535,这样能最大程度的避免与已使用的端口有冲突)

命令执行成功后,会输出一个Key,这个Key会在Visual Studio中配置时用到,需要保留下来

切换到调试机器,打开Visual Studio,在工具栏中选择Configure target devices,如下所示

如果未在工具栏中找到这个按钮,可以在工具栏右键,钩选Driver,就可以看到Driver工具栏

 在Configure Devices界面,选择添加新设备(Add New Device)

输入设备名称hostname(或IP),这里我们直接使用被调试机器的IP:192.168.109.128

Provisioning Options这里选择Manual configure debuggers and do not provision(手动配置被调试机器以及手动分发驱动文件)

 单击下一步,在这里配置端口、Key、及IP

说明:端口要保持跟前面在被调试机器中设置的一致,即50000。Key就是前面生成的Key。IP是被调试机器的IP

 单击下一步,可以看到如下界面

 此时已经完成了Visual Studio中的全部配置。

在代码中添加断点函数

在上一篇文章中,我们创建了一个基本的驱动程序,代码如下:

 1 #include<ntddk.h>
 2 
 3 VOID DriverUnload(PDRIVER_OBJECT DriverObject)
 4 {
 5     if (DriverObject != NULL)
 6     {
 7         DbgPrint("Driver Unload...Driver Object Address: %p\n", DriverObject);
 8     }
 9 
10     return;
11 }
12 
13 extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
14 {
15     KdBreakPoint();
16     DbgPrint("Hello World\n");
17 
18     if (RegistryPath != NULL)
19     {
20         DbgPrint("Driver RegistryPath: %wZ\n", RegistryPath);
21     }
22 
23     if (DriverObject != NULL)
24     {
25         DbgPrint("Driver Object Address: %p\n", DriverObject);
26         DriverObject->DriverUnload = DriverUnload;
27     }
28 
29     KeBugCheckEx(INVALID_DATA_ACCESS_TRAP, NULL, NULL, NULL, NULL);
30 
31     //return STATUS_FAILED_DRIVER_ENTRY;
32 }

开始调试前,首先修改一下MyFirstDriver驱动的入口函数,在DriverEntry入口函数中加入一个断点KdBreakPoint(),这样当MyFirstDriver运行的时候,就会在DriverEntry触发这个断点而停止下来。
说明:KdBreakPoint只对Debug版的驱动有效,如果需要对Release版本的驱动放置断点代码,请使用DbgBreakPoint

编译通过后,将.sys文件复制到被调试机器中。

开始调试

在Visual Studio中,选择附加到进程

连接类型选择Windows Kernel Mode Debugger 

 连接目标选择前面创建的设备,即DriverTestVM

单击附加按钮后,Visual Studio会弹出 “Debugger Immediate Window”,窗口输出内容如下

这表示当前调试器使用网络连接方式,正在等待被连接。

此时我们切换到被调试机器 ,将系统重启,让被调试机器的调试设置生效。

在重启过程中,被调试机器会主动连接设置的50000端口,连接成功后,界面会输出以下内容

我们按照上一篇文章中的步骤,在被调试机中运行驱动,可以看到Visual Studio就中断在了KdBreakPoint()函数处,此时可以进行单步调试。

说明:可以使用VMWare的挂起功能,这次就可以不用每次都去设置禁用驱动程序强制签名 。

基于WinDbg的调试方法

说明:WinDbg是Windows开发经常用到的一个调试工具,包括用户层和内核层,在后面会进行详细的介绍

在WDK安装时,会自动安装WinDbg,路径为%programfiles(x86)%\Windows Kits\10\Debuggers\x64

使用WinDbg调试时,以串口(COM口)作为连接介质

参数配置

切换到被调试机,以管理员打开cmd,执行以下操作

1、开启调试模式

1 bcdedit /debug on

参数 /debug: 启用或禁用指定启动项的内核调试程序

参数 on:  启用内核调试

2、配置调试模式参数

1 bcdedit /dbgsettings serial baudrate:115200 debugport:2

参数/dbgsettings:设置或显示系统的全局调试程序设置

参数serial:表示使用串口作为连接介质

参数baudrate:表示串口使用的波特率,这里使用的是115200

参数debugport:表示 用来调试的串口号,这里表示 使用串口2作为连接介质

配置完成后,关闭被调试机,在Vmware的配置中,新增加一个串口设备

串口配置如下:

设备连接使用命名管道,名字为\\.\pipe\com_2

Windbg启动参数配置

切换到调试机,打开WinDbg的安装路径"%programfiles(x86)%\Windows Kits\10\Debuggers\x64\windbg.exe",将WinDbg发送到桌面快捷方式

在快捷方式上右键-》属性-》快捷方式-》目标

在路径的后面填入如下参数(注意,-b前需要加入一个空格)

1  -b -k com:pipe,port=\\.\pipe\com_2,resets=0

如下所示

开始调试

切换到调试机,双击桌面的WinDbg快捷方式,WinDbg启动后会连接\\.\pipe\com_2管道,如下所示

此时我们将被调试机重启,可以看到WinDbg已经连接上被调试机,输出 如下所示

 说明:可能由于我的被调试机是Windows11,所以运行WinDbg后,不能直接连接上,需要重启才能连接。而且重启后,需要在WinDbg中按下F5才能正常开机,不然会卡在开机界面。

我们按照上一篇文章中的步骤,在被调试机中运行驱动 ,WinDbg中断在了KdBreakPoint()函数处,此时可以进行单步调试。

标签:WinDbg,Windows,虚拟机,参数,驱动,NULL,连接,调试
From: https://blog.csdn.net/zhaotianff/article/details/142492202

相关文章

  • Windows内核编程基础(1)
    在前面的文章中,介绍了如何配置开发环境以及如何进行调试。接下来的几篇文章,将会重点介绍内核编程中所需要了解的一些理论基础。我写这个系列文章的主要目的是方便以后自己查阅,同时也给正在学习内核开发的小伙伴一些参考,所以我会尽可能地以最简单的方式进行描述。如果在阅读......
  • 构建SpringBoot驱动的文档管理平台
    第1章绪论1.1背景及意义随着社会的快速发展,计算机的影响是全面且深入的。员工生活水平的不断提高,日常生活中员工对在线文档方面的要求也在不断提高,在线文档管理受到广大员工的关注,使得在线文档管理系统的开发成为必需而且紧迫的事情。在线文档管理系统主要是借助计算机,通......
  • 数据驱动再升级:从数据仓库到数据中台,再到制造业数据飞轮
    在当今的数据驱动时代,制造业已经经历了从初级数据采集到利用数据驱动决策的转变。数据仓库、数据中台、和数据飞轮的概念顺序演进,反映了对数据价值深层次挖掘的追求和实践。本文将探讨这些技术是如何在制造业中被应用,以及它们对业务模式带来的革命性变化。数据仓库:基础数据聚合的......
  • Windows 11设置柯能卡打印机通过SMB扫描到电脑
    1、查看打印机扫描仪的网络IP。2、在“网络和Internet访问”中打开网络发现,并通过”计算机管理“将Guest帐户的禁用选项取消。3、设置共享目录的来宾访问权限已开启。4、在添加windows功能中增加SMB服务,并开启之。5、建立共享扫描文件夹并设置其具有Guest及Everyone用户有可读......
  • 唤醒数据中台潜力,加速数据飞轮转动:分享我的数据驱动秘籍!让你受益匪浅!
    前言在数字化转型的大背景下,数据已经成为企业最重要的资产之一。然而,很多企业在构建了数据中台后,面临的一个常见问题是数据“沉睡”。企业虽然拥有了海量的数据,但由于缺乏有效的利用机制,数据中台常常沦为一个庞大的数据存储库,而未能真正为业务创造价值。近年来,数据飞轮的概念成为......
  • VMWare安装Ubuntu之后与Windows系统共享文件夹的设置步骤
    1.首先在Windows系统中新建一个需要共享的文件夹,并设置文件夹的共享属性,如下图: 2.VMWare软件开启【共享文件夹】功能,如图所示3.进入Ubuntu系统,查看是否存在/mnt/hgfs目录,若是没有,先要以root权限建立该目录sudomkdir/mnt/hgfs4.挂载目录sudovmhgfs-fuse.host:......
  • Google Photos 利用 AI 驱动的视频预设重新设计视频编辑器
    在更新了“收藏”标签和搜索功能后,GooglePhotos现在正在推出其手机视频编辑器的重新设计。目标是让用户“比以往更容易地编辑喜欢的视频,制作成精彩片段分享。”GooglePhotos将主要的编辑工具放在“视频”标签的显眼位置。时间轴下方可以看到以下工具:静音增强:“一键增强颜......
  • 数据飞轮效应:激活数据中台,揭秘数据驱动的商业奥义
    在当今数据爆炸的时代,掌握并合理运用数据资源已成为企业持续成长和竞争的关键。数据飞轮,作为一种概念和实践模式,正在逐渐成为推动企业走向数据驱动业务模式的核心动力。本文将通过具体的业务场景探讨数据飞轮如何唤醒数据,给数据中台带来活力,并揭示一些关键的技术实践。数据飞轮与......
  • EFK安装调试及使用
    elasticsearch安装参考官方文档,安装包下载位置https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html#install-rpm如果单机部署,需要修改配置文件,注释掉集群配置/etc/elasticsearch/elasticsearch.yml#cluster.initial_master_nodes:["localho......
  • 数据飞轮:从数据中台到驱动未来的必经之路
    在数据世界中,数据中台的概念已经成为众多企业数据策略的核心。作为集数据整合、管理及分析功能于一体的架构,数据中台支持了信息的集中化管理和更高效的数据操作。然而,数据中台的建设往往停留在存储和管理层面,缺乏进一步的动态利用,而这正是数据飞轮能力发挥的舞台。数据飞轮的概念,......