Windows驱动调试方法

news2024/9/25 9:13:18

单步调试驱动

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

在前面的文章里,使用了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.coloradmin.cn/o/2163133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习一下怎么用git

目录 初始化操作 设置名字&#xff1a; 设置邮箱: 查询状态 初始化本地仓库 清空git bush控制台 git的三个区域 文件提交 将会文件提交到暂存区 暂存指定文件 暂存所有改动文件 查看暂存区里面的文件 将文件提交到版本库 git文件状态查看 ​编辑 暂存区的相关指令…

2024专业U盘格式化数据恢复工具推荐榜

对于经常在不固定办公地点工作&#xff0c;且依赖U盘存储重要资料的朋友来说&#xff0c;U盘无疑成为了随身携带的“数字保险箱”。然而&#xff0c;频繁使用U盘也意味着面临数据丢失的风险。面对u盘格式化怎么恢复数据的难题&#xff0c;您或许正寻求有效的解决方案。接下来&a…

Spring源码-从源码层面讲解传播特性

传播特性:service&#xff1a;REQUIRED&#xff0c;dao:REQUIRED 两个都是required使用的是同一个事务&#xff0c;正常情况&#xff0c;在service提交commit <tx:advice id"myAdvice" transaction-manager"transactionManager"><tx:attributes&…

2024年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-阅读程序题解析

2024 CCF认证第一轮&#xff08;CSP-J&#xff09;真题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff0c;判断题正确填√错误填X;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40 分) 第一题 01 #include <iostream>…

【Python】探索 PyTorch 在机器学习中的应用

在机器学习的浪潮中&#xff0c;PyTorch 以其灵活性和易用性成为了研究者和开发者的热门选择。本文将探讨 PyTorch 在机器学习领域的应用&#xff0c;并展示如何使用 PyTorch 构建一个基本的机器学习模型。 ⭕️宇宙起点 &#x1f3ac; 机器学习简介&#x1f4a2; PyTorch 与机…

胤娲科技:AI程序员——重塑编程世界的魔法师

当魔法遇上代码 想象一下&#xff0c;一个对编程一无所知的初中生&#xff0c;在熙熙攘攘的展会现场&#xff0c;仅凭几句简单的提示词&#xff0c;就在几分钟内创造出一个功能完备的倒计时网页。 这听起来像是科幻电影中的场景&#xff0c;但如今&#xff0c;在阿里云「通义灵…

心觉:如何重塑高效学习的潜意识(1)两种方法的优缺点

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作180/1000天 你的学习习惯是什么呢 学习的时候是感到轻松吗 很多人感觉现在是知识大爆炸的时代&#xff0c;每天都会产生海量的知…

C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(2)

2.2、用析构函数释放内存 每当完成动态分配内存时&#xff0c;都应该释放。如果在一个对象中动态分配内存&#xff0c;释放内存的地方就是析构函数。编译器保证当对象被破坏时会调用析构函数。下面就是Spreadsheet类定义中的析构函数&#xff1a; export class Spreadsheet { …

秋分之际,又搭建了一款微信记账本小程序

在这个金色的季节里&#xff0c;每一粒粮食都蕴含着生命的奇迹&#xff0c;每一片叶子都在诉说着成长的故事。秋分之际&#xff0c;又搭建了一款微信记账本小程序。 产品概述 微信记账本小程序是一款便捷的个人财务管理工具&#xff0c;旨在帮助用户轻松记录、管理和分析日常…

STM32基础学习笔记-NVIC中断面试基础题4

第四章、NVIC: 外部中断_串口中断 1、按键按下后&#xff0c;GPIO 会产生一个上升/下降沿&#xff0c;G030内部是如何触发外部中断的呢&#xff1f; 配置GPIO引脚&#xff1a; 首先&#xff0c;需要将特定的GPIO引脚配置为输入模式&#xff0c;并设置为外部中断源。这通常通过…

Nexus3的妙用

nexus 3使用场景 Nexus是一个全能仓库,通过部署nexus可以实现包含yum、apt、Maven、pypi、docker等的多种仓库。以下是nexus的适用场景: 当公共仓库无法访问或缓慢时,搭建nexus。比如国内docker无法访问,需要镜像加速。可以使用海外主机部署nexus,在nexus中创建docker(p…

uniapp微信小程序遮罩层u-popup禁止底层穿透

添加 touchmove.prevent&#xff0c;遮罩层底部的页面就不会滑动了微信开发者工具不生效&#xff0c;真机生效 <u-popup :show"showEwm" close"closeEwm" mode"center" touchmove.prevent><view class"ewmshow"></vie…

宝塔部署vue项目出现的各种问题

使用宝塔面板&#xff0c;网站页面&#xff0c;构建php静态网页 问题一&#xff1a;图片等静态资源无法加载 找到真正请求的url&#xff0c; 然后在项目目录下面创建对应的目录&#xff0c;将资源放入 问题二&#xff1a;刷新出现404 在这里任意位置添加 ## 添加上这个配…

力扣【118-杨辉三角】【数组-C语言】

题目&#xff1a;力扣-118 杨辉三角&#xff1a;&#xff08;算法思路&#xff09; 1. 每行第一个数和最后一个数都是1 2. 把杨辉三角左端对齐&#xff0c;从第三行开始&#xff0c;非首尾的元素值等于上一行同列的元素与该元素之前的元素之和&#xff0c;即 t [ j ] r e t …

软考高级:需求工程- 需求获取方式 AI解读

需求获取是项目管理和产品开发中的关键步骤&#xff0c;关系到项目的成功与否。你提到的几种需求获取方式涵盖了多个维度&#xff0c;以下我将逐一解析它们的用途与优势。 生活化例子 需求获取就像你要准备一场家庭聚会&#xff0c;需要先了解每个家庭成员的喜好。你可以通过…

【OceanBase 诊断调优】—— GC问题根因分析

GC 流程涉及到 RS 的状态切换和 LS 的资源安全回收&#xff0c;流程上较长。且 GC 线程每个租户仅有一个&#xff0c;某个日志流 GC Hang 死时会卡住所有其余日志流的 GC&#xff0c;进而造成更大的影响。 本文档会帮助大家快速定位到 GC 故障的模块&#xff0c;直达问题核心。…

SQL分组聚合子查询问题

场景 订单表 t_order 有如下数据&#xff1a; 字段分别为&#xff0c; 销售订单号、 订货数量 发货表 t_order_delivery 有如下数据&#xff1a; 字段分别为&#xff0c; 销售订单号、 发货数量 问题 问题1&#xff1a;查询部分发货的 销售订单号数据 &#xff1f; 分析…

数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall

数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall 数据集-目标检测系列-海洋鱼类检测数据集 fish 数据量&#xff1a;1W 数据项目地址&#xff1a; gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/…

wpf中如何访问控件和生成使用事件?

实际上对于初次使用wpf的同学来说&#xff0c;尤其是有winform编程经验的童鞋来说&#xff0c;最需要解决的就是快速掌握访问控件的方法以及生成和使用事件。这样才能让页面具有最起码的交互性。下面我们来分别讲述。 文章原出处&#xff1a;https://blog.csdn.net/haigear/ar…

「数组」离散化 / Luogu B3694(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 Luogu B3694&#xff1a; 给定一个长度为 n 的数列 aa。定义 rank(i) 表示数列 a 中比 ai 小的不同数字个数再加一。 对 1≤i≤n&#xff0c;现在请你求出所有的 rank(i)。 输出格式 对每组数据&#xff0c;输出一行 n 个整数&a…