当前位置: 首页 > news >正文

windows内核研究(驱动开发 第一个驱动程序和调试环境搭建)

驱动开发


第一个驱动程序

驱动的开发流程

1.编写代码 -> 生成.sys文件 -> 部署 -> 启动 -> 停止 ->卸载

// 编写我们的第一个驱动程序
#include<ntddk.h>// 卸载函数
VOID DrvUnload(PDRIVER_OBJECT DriverObject) {DbgPrint("我被卸载了\n");
}// 驱动入口函数,相当于main函数
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {// 输出调试信息DbgPrint("Hello World!\n");// 设置卸载函数DriverObject->DriverUnload = DrvUnload;return STATUS_SUCCESS;
}

接下来,我们来试着加载一下我们自己写的驱动程序

在这里插入图片描述

驱动程序的加载分为4步:

  1. Register:装载(告诉操作系统我有这么一个驱动程序)
  2. Run:运行(真正开始运行了)
  3. Stop:停止
  4. Unregister:卸载

在这里插入图片描述
当点击Run时,输出日志HelloWorld,当点击Stop时,输出日志我被卸载了


如何调试驱动程序

搭建双机调试环境

为什么要搭建双机调试环境呢?

应为当我们在调试驱动(内核)程序时,如果直接在我们物理机上进行调试,下断点时,我们的整个系统会卡死,这样以来就无法调试了(在调试驱动程序也很容易发生蓝屏),所以我们需要在另一个系统环境上用信号的方式传递调试信息进行驱动程序的调试

下载VirtualKD软件

VirtualKD官网

在这里插入图片描述

1.把上面的target32或者是64复制到被调试的系统上,是多少位的操作系统就复制对应位的target

在这里插入图片描述
这里的vmistall.exe直接双击运行

在这里插入图片描述
选择install就可以了,这个软件只用运行一次就可以了(一点安装虚拟机就会进行重启),它会在当前电脑上创建一个新的系统引导向,向我们的调试主机发送信号

在这里插入图片描述
这里会给我们把默认引导项选择为它刚刚为我们创建好的

在这里插入图片描述
按F8,选择禁用驱动程序强制签名回车(在这之前一定要先运行VirtualKD程序)

在这里插入图片描述

如果你的电脑上还没有安装windbg调试器,可以去微软的应用商店获取,这个软件是微软官方的

在这里插入图片描述

到此我们双机调试的环境就算搭建好了

那如何进行调试呢?

我们在windbg中用以下命令进行反汇编查看

u 地址 // 用u命令反汇编一个地址

在这里插入图片描述
可以看到它不仅给我们生成了汇编代码还同时给我把这段代码是在哪里方法里面的偏移也显示出来了(这个就是PDB(Program Database)文件)

这些PDB文件在我们自写的的程序,驱动,动态链接库时都会自动生成,PDB文件主要描述了程序函数地址与文件名的对应关系,在上面的示例中,我们仅通过一个地址就能知道对应的方法名和它的偏移位置,这个方法名就是在PDB文件中和地址进行关联的(内核的PDB是由微软来提供的)

使用.sympath命令就可以查看对应PDB下载获取的位置

.sympath // 获取当前的PDB下载位置
.sympath SRV*D:\MyDebugSymbols*https://msdl.microsoft.com/download/symbols // 重新设置

在这里插入图片描述

SRV*D:\MyDebugSymbols表示下载的PDB文件保存在电脑的什么地方
https://msdl.microsoft.com/download/symbols如果电脑上没有对应的PDB文件该从什么地方去获取

http://www.dtcms.com/a/284741.html

相关文章:

  • 人工智能概念之八:常见的参数调优方法(交叉验证网格搜索、随机优化、贝叶斯优化、Hyperband优化)
  • 如何优化transceiver芯片的供电
  • 进阶向:智能图像背景移除工具
  • 在CentOS7.9服务器上安装.NET 8.0 SDK
  • 嵌入式时钟系统
  • LLM探针技术有哪些
  • 【图像质量评价指标】图像熵(Image Entropy) —— 熵值饱和现象
  • PySide笔记之信号连接信号
  • AI赋能农业:基于YOLO11的苹果瑕疵检测系统实战分享
  • 在Anaconda Prompt中安装库【保姆教程】
  • lwIP WebSocket 客户端 TCP PCB 泄漏问题分析与解决
  • 时空大数据:数字时代的“时空罗盘“
  • 工业一体机在3C家电自动化生产中的实践
  • CAN总线抗干扰实战:用差分传输解决地线电压漂移问题
  • Spring 多模块配置国际化,MessageSource只能加载一个文件
  • springboot 整合spring-kafka客户端:SASL_SSL+PLAINTEXT方式
  • mongodb 入门级别操作
  • Unity VR多人手术模拟恢复2:客户端移动同步问题分析与解决方案
  • jeecgbootvue3使用封装组件注意事项
  • 学习 Flutter (四):玩安卓项目实战 - 中
  • 【WPF】WPF 自定义控件之依赖属性
  • Matlab2025a软件安装|详细安装步骤➕安装文件|附下载文件
  • Mask2Former,分割新范式
  • Kafka 控制器(Controller)详解:架构、原理与实战
  • Python23 —— 标准库(time库)
  • c++列表初始化
  • Dijkstra 算法求解多种操作
  • Stone3D教程:免编码制作在线家居生活用品展示应用
  • 【初始Java】
  • mysql中where字段的类型转换