Windows驱动调试方法

单步调试驱动

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

在前面的文章里,使用了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()函数处,此时可以进行单步调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Elasticsearch 分片迁移与移除集群节点操作

Elasticsearch 分片迁移与移除集群节点操作 问题背景 在单台服务器上部署了 7 个 Elasticsearch 节点&#xff0c;分别为 es-node1 到 es-node7&#xff0c;端口从 9201 到 9207。每个节点都承载大量数据&#xff0c;但没有设置副本分片。由于多个节点共享同一台服务器的硬件…

论文阅读 - SWATTING Spambots: Real-time Detection of Malicious Bots on X

https://web.archive.org/web/20240523035749id_/https://dl.acm.org/doi/pdf/10.1145/3589335.3651564 目录 ABSTRACT INTRODUCTION METHODOLOGY 3 RESULTS ABSTRACT 在 X&#xff08;前身为 Twitter&#xff09;等社交网络平台上&#xff0c;垃圾邮件机器人的活动日益…

【SpringBoot整合Redis测试Redis集群案例】

1、第一步&#xff0c;创建springboot项目&#xff0c;并导入依赖 如图&#xff0c;创建项目遇到的第一个问题就是&#xff0c;当type选择maven&#xff0c;jdk选择1.8时&#xff0c;java部分没办法选择1.8的版本&#xff0c;这怎么办呢&#xff1f; 原因&#xff1a;搜了一下…

【windows 11 安装maven】

从下载网址下载maven 解压&#xff08;路径无中文&#xff09; 配置本地仓库&#xff0c;用来存储jar包 配置仓库路径 配置文件路径&#xff1a;./conf/settings.xml(conf文件夹中的settings.xml文件中&#xff09; 定位到53行修改 <!-- localRepository| The path to the l…

第 1 章:Vue 核心

1. Vue 简介 1.1. 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/&#xff1a;中文官网里面【教程】和【API】是比较重要的。用到api就去查询&#xff0c;实践当中记忆更牢靠。 风格指南&#xff1a;官方推荐写的一个代码风格cookbook&#xff1a;编写v…

从更底层的角度理解网站的访问过程

文章目录 1.示例&#xff0c;访问www.baidu.com是如何返回数据的1.输入www.baidu.com回车2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件夹下有没有这个域名对应的映射&#xff1a; 1.示例&#xff0c;访问www.baidu.com是如何返回数据的 1.输入www.baidu.com回车…

光伏开发:一分钟生成光伏项目报告

传统光伏项目报告的编制往往需要收集大量数据、进行复杂计算与分析&#xff0c;耗时长且易受人为因素影响。自动生成光伏项目报告&#xff0c;依托大数据、云计算、人工智能等先进信息技术&#xff0c;实现了对光伏项目关键参数的快速分析、评估与预测。 一、核心功能与流程 1…

【C++笔试强训】如何成为算法糕手Day2

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;牛牛的快递 第二题&#xff1a;最小花费爬楼梯 第三题&#xff1a;数组中两个字符串的最小距离 补充0x3f3f3f3f 第一题…

9/24作业

1. 分文件编译 分什么要分文件编译&#xff1f; 防止主文件过大&#xff0c;不好修改&#xff0c;简化编译流程 1) 分那些文件 头文件&#xff1a;所有需要提前导入的库文件&#xff0c;函数声明 功能函数&#xff1a;所有功能函数的定义 主函数&#xff1a;main函数&…

springboot实战学习(8)(登录接口中使用“JWT令牌“完成登录认证)(拦截器的创建与注册)

接着上篇博客学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上。也提到了"JWT令牌"的组成与使用。具体往回看了解的链接如下。springboot实战学习&#xff08;7&#xff09;(JWT令牌的…

TCP网络编程概述、相关函数、及实现超详解

文章目录 TCP网络编程概述1. TCP协议的特点2. TCP与UDP的差异3. TCP编程流程 TCP网络编程相关函数详解1. socket()&#xff1a;创建套接字参数说明&#xff1a;返回值&#xff1a;示例&#xff1a; 2. connect()&#xff1a;客户端连接服务器参数说明&#xff1a;返回值&#x…

【CubeMX学习笔记】关于CAN通信协议

目录 一、CAN通信简介 二、CAN数据帧类型 三、格式帧 四、位同步 传输数据时可能遇到的问题 最小时间单位 硬同步 再同步 波特率的计算 STM32中的CAN外设 一、原理图 二、标识符筛选 三、配置单个邮箱&#xff08;正常模式或自发自收只需要修改模式&#xff09; …

【动态规划-多重背包】【hard】力扣2585. 获得分数的方法数

考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types &#xff0c;其中 types[i] [counti, marksi] 表示第 i 种类型的题目有 counti 道&#xff0c;每道题目对应 marksi 分。 返回你在考试中恰好得到 target 分的方法数。由于答案可能很…

基于yolov5滑块识别破解(二)

通过上一篇文章基于yolov5滑块识别破解&#xff08;一&#xff09;-CSDN博客&#xff0c;我们已经完成了yolov5的部署和训练&#xff0c;接下来我们将对源码进行改动&#xff0c;来实现滑块的自动滑动破解。 1.获取坐标 修改detect中for循环的内容&#xff0c;获取目标的左上角…

SAP 利润分配-未分配利润的年初余额和年末余额不一致的问题

SAP OB53 本年利润科目的年初余额和年末余额不一致的问题 关于OB53科目的问题 OB53维护的本年利润科目 现象&#xff1a;为何去年年末的本年利润金额和今年年初的本年利润金额不一致。 解释原因&#xff1a; 本年利润科目的这种现象归根结底是“表结法”产生的&#xff0c;换…

如何在Mac上查看剪贴板历史记录

重点摘要 macOS 内建的剪贴簿查看器可以透过 Finder 存取,但只能显示最近一次复制的内容,而且重新开机后就会清除。若要更进阶的剪贴簿管理,第三方 app 像是 CleanClip 提供了强大的功能和更好的组织方式。CleanClip 提供了全方位的剪贴簿历史管理解决方案,支援各种内容类型和…

开源 AI 智能名片与 S2B2C 商城小程序:嫁接权威实现信任与增长

摘要&#xff1a;本文探讨了嫁接权威在产品营销中的重要性&#xff0c;并结合开源 AI 智能名片与 S2B2C 商城小程序&#xff0c;阐述了如何通过与权威关联来建立客户信任&#xff0c;提升产品竞争力。强调了在当今商业环境中&#xff0c;巧妙运用嫁接权威的方法&#xff0c;能够…

栈的深度解析:链式队列的实现

引言 队列是一种广泛应用于计算机科学的数据结构&#xff0c;具有先进先出&#xff08;FIFO&#xff09;的特性。在许多实际应用中&#xff0c;例如任务调度、缓冲区管理等&#xff0c;队列扮演着重要角色。本文将详细介绍队列的基本概念&#xff0c;并通过链表实现一个简单的…

进程间通信 (一)【管道通信(上)】

目录 1. 概况2. 管道通信的原理2.1 初步理解2.2 深入理解 1. 概况 是什么&#xff1a;两个及以上的进程实现数据层面的交互&#xff0c;称为进程间的通信。 因为进程独立性的存在&#xff0c;所以一个进程无法直接访问另一个进程的数据&#xff0c;即便是父子进程&#xff0c;子…