第一个驱动程序
创建空项目
删除.inf文件
关闭将警告视为错误
设置驱动在什么操作系统运行
代码:
#include<ntifs.h>//卸载函数VOIDDriverUnload(PDRIVER_OBJECT pDriver){DbgPrint("(mydriver)驱动程序停止运行了。\n");}NTSTATUSDriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING RegistryPath){DbgPrint("(mydriver)驱动开始运行了。\n");pDriver->DriverUnload=DriverUnload;return0;}调试技巧
勾选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:
win7:1.Cookie 未初始化 → 自动用 RDTSC 生成一个随机值2.若生成的值为0→ 使用默认 Cookie3.最终写入 complement4.完全不会 FailFast5.驱动允许自行初始化 Cookie 总结:无论cookie是什么值,都不会蓝屏win10:
1.Cookie==0→ FailFast(蓝屏)2.Cookie==默认弱cookie(0x0BB40E64E)→ FailFast(蓝屏)3.不允许用 RDTSC 生成新的 cookie4.只在 cookie 合法时写 complement5.任何非法 cookie 都导致int29h(RtlFailFast)可以看到win10的sys代码逻辑无论如何都会蓝屏,但 Win10 在加载驱动前,会自动覆盖
___security_cookie这个值。但是win7不会写___security_cookie,所以在win7上执行肯定会蓝屏
解决方案思路:修改驱动的 __security_cookie
只要满足:
__security_cookie!=0__security_cookie!=0xBB40E64E那么在win7上执行 Win10驱动文件, __security_init_cookie 就不会进入 FailFast(蓝屏)。
因此我尝试:
将 __security_cookie 从0xBB40E64E修改为0xBB40E64F修改步骤 IDAPRO:file->patch program->changebyte 修改值,最后保存 file->patch program->Apply patches to input file于是 __security_init_cookie 会顺利进入:
noteax mov __security_cookie_complement,eax retn 并成功执行 DriverEntry但是需要注意的是:修改了Cookie导致改变了 PE Checksum(optional_header.Checksum),所以还需要修复Checksum
PE 的 Checksum 是一个32位加法校验和,其算法非常简单粗暴: 把整个文件按16-bit(WORD)累加,加到32位整数里,溢出自动回卷,然后加上文件长度。 所以:0x00005992改为0x00005992+1=0x00005993最终成功使win10驱动在win7运行!