驱动开发
第一个驱动程序
驱动的开发流程
1.编写代码 -> 生成.sys文件 -> 部署 -> 启动 -> 停止 ->卸载
c
// 编写我们的第一个驱动程序
#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步:
- Register:装载(告诉操作系统我有这么一个驱动程序)
- Run:运行(真正开始运行了)
- Stop:停止
- Unregister:卸载

当点击Run
时,输出日志HelloWorld
,当点击Stop时,输出日志我被卸载了
如何调试驱动程序
搭建双机调试环境
为什么要搭建双机调试环境呢?
应为当我们在调试驱动(内核)程序时,如果直接在我们物理机上进行调试,下断点时,我们的整个系统会卡死,这样以来就无法调试了(在调试驱动程序也很容易发生蓝屏),所以我们需要在另一个系统环境上用信号的方式传递调试信息进行驱动程序的调试
下载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文件该从什么地方去获取