第一个驱动程序

第一个驱动程序

创建空项目

删除.inf文件

关闭将警告视为错误

设置驱动在什么操作系统运行

代码:

cpp 复制代码
#include<ntifs.h>
//卸载函数
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("(mydriver)驱动程序停止运行了。\n");
}


NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING RegistryPath)
{


	DbgPrint("(mydriver)驱动开始运行了。\n");
	

	pDriver->DriverUnload = DriverUnload;
	return 0;

}

调试技巧

勾选view ->options->evaluate on hover选项,当你把鼠标移动到某个寄存器、变量、内存地址、表达式上时,windbg会自动对这个内容求值并弹出气泡显示它的值。

使win10驱动在win7下运行

测试发现,在driver setting选项中选择win10,编译生成的sys文件运行在win7下直接蓝屏。我们的代码只是DbgPrint输出了一下,并没有和win10强关联的代码,为什么会蓝屏呢?

接下来分析一下.win10版本的sys和win7版本的.sys

win10和win7的入口函数都是GSDriverEntry,都同样先执行一个___security_init_cookie函数,然后再跳入我们代码里写的DriverEntry函数。

__security_init_cookie 是vs编译器在编译内核驱动或用户态程序时自动插入的一个安全初始化函数,用于设置 GS 安全 Cookie(Security Cookie)。

win7和win10的__security_init_cookie 函数区别很大,下面分析一下:

win7:

cpp 复制代码
win7:
1.	Cookie 未初始化 → 自动用 RDTSC 生成一个随机值
2.	若生成的值为 0 → 使用默认 Cookie
3.	最终写入 complement
4.	完全不会 FailFast
5.	驱动允许自行初始化 Cookie

总结:无论cookie是什么值,都不会蓝屏

win10:

cpp 复制代码
1.	Cookie == 0 → FailFast(蓝屏)
2.	Cookie == 默认弱 cookie(0x0BB40E64E) → FailFast(蓝屏)
3.	不允许用 RDTSC 生成新的 cookie
4.	只在 cookie 合法时写 complement
5.	任何非法 cookie 都导致 int 29h(RtlFailFast)

可以看到win10的sys代码逻辑无论如何都会蓝屏,但 Win10 在加载驱动前,会自动覆盖___security_cookie这个值。但是win7不会写___security_cookie,所以在win7上执行肯定会蓝屏

只要满足:

cpp 复制代码
__security_cookie != 0
__security_cookie != 0xBB40E64E

那么在win7上执行 Win10驱动文件, __security_init_cookie 就不会进入 FailFast(蓝屏)。

因此我尝试:

cpp 复制代码
将 __security_cookie 从 0xBB40E64E 修改为 0xBB40E64F

修改步骤
IDAPRO: file->patch program->changebyte
修改值,最后保存
file->patch program->Apply patches to input file

于是 __security_init_cookie 会顺利进入:

cpp 复制代码
not eax
mov __security_cookie_complement, eax
retn

并成功执行 DriverEntry

但是需要注意的是:修改了Cookie导致改变了 PE Checksum(optional_header.Checksum),所以还需要修复Checksum

cpp 复制代码
PE 的 Checksum 是一个 32 位加法校验和,其算法非常简单粗暴:
把整个文件按 16-bit(WORD)累加,加到 32 位整数里,溢出自动回卷,然后加上文件长度。
所以:
0x00005992改为0x00005992+1=0x00005993

最终成功使win10驱动在win7运行!

相关推荐
万物智能信息科技6 小时前
六轴传感器Motion驱动框架开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·华为·开源·harmonyos·鸿蒙
AMASENSYS艾马斯1 天前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
沃普天科技1 天前
100W 氮化镓充电器充电头扩展坞一体化设计,实用性翻倍
驱动开发·计算机外设·音视频·硬件工程·pcb工艺
lisw052 天前
算法与软件的本质区别
驱动开发·算法·数学建模
泡海椒2 天前
JQuick-SQL “数据源 SPI”辨析:应用适配器与 Function SPI 的正确边界
数据库·驱动开发·sql
万物智能信息科技2 天前
Zigbee透传驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·华为·开源·harmonyos·鸿蒙
AMASENSYS艾马斯2 天前
低压变频器输入输出电抗器选型指南
驱动开发·单片机·机器学习·硬件工程·精益工程
软件工程师文艺4 天前
AI 编程新范式:Spec Kit 的规格驱动开发到底在解决什么
人工智能·驱动开发
AMASENSYS艾马斯4 天前
变频器过载能力参数解读与工程应用
驱动开发·嵌入式硬件·其他·硬件工程·精益工程
万物智能信息科技4 天前
LoRa串口透传驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·嵌入式硬件·华为·开源·harmonyos