当前位置: 首页 > 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.lryc.cn/news/591820.html

相关文章:

  • VSCODE常规设置
  • 删除百度同步空间桌面图标
  • Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】
  • 全桥LLC 分立电感变压器计算
  • Docker实战:使用Docker部署IT工具箱Team·IDE
  • vuex的理解以及应用
  • Spring中事务失效的情况深度分析
  • 深入理解 SemaphoreSlim 在.NET Core API 开发中的应用
  • ROS1/Linux——Launch文件使用
  • 三、CV_VGGnet
  • 从零开始学 Linux 系统安全:基础防护与实战应用
  • git merge 和 git rebase 的区别
  • Python获取网页乱码问题终极解决方案 | Python爬虫编码处理指南
  • C++中,不能声明为虚函数的函数类型
  • Redis红锁中的看门狗机制
  • FreeRTOS—中断管理
  • Pytorch深度学习框架实战教程03:Tensor 的创建、属性、操作与转换详解
  • 网络安全基础操作2
  • 【初始Java】
  • C语言---动态内存管理
  • mingw 编译 assimp v6.0.2 解决编译报错
  • Vue3 + WebSocket
  • 云徙科技----一面(全栈开发)
  • 使用 docker 安装 openldap
  • 腾讯会议本地录屏转存失败解决办法
  • 【数据结构】链表(linked list)
  • BI Agent vs. 传统BI工具:衡石科技视角下的效率与智能跃迁
  • 算法讲解-移动零
  • properties中文乱码
  • 深入解析Linux进程创建与fork机制