因环境限制,只能使用 VS2012 开发项目,环境为 Windows 7 x64,所以选择了 WDK7.1.
WDK7.1 在这里下载
下载完成以后,我们找到这个 .iso 文件,用解压工具把它解压到某个文件夹内:
找到这个安装文件,无脑安装就好了(路径建议选择默认路径):
安装完成后我们在 C 盘的根目录就看到了这个文件夹:
然后打开 VS2012,新建一个 win32 控制台项目,注意这里要创建空项目,之后新建一个 main.cpp 文件,复制以下代码:
#include "ntddk.h"
NTSTATUS unload(PDRIVER_OBJECT driver)
{
DbgPrint("driver: %ws unload", driver->DriverName);
DbgPrint("Driver unload success..");
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
driver->DriverUnload = (PDRIVER_UNLOAD)unload;
DbgPrint("%ws", reg_path->Buffer);
DbgPrint("Driver load success..");
return STATUS_SUCCESS;
}
最后根据以下要求配置项目属性:
//VS2010+WDK7.1,编译32位和64位的驱动配置
//到微软官网下载WDK7.1,安装到默认的C盘根目录即可
//编译出32位驱动
VS2010里新建一个空项目,新建一个配置名:DriverWDK32 //自行定义名字
VS++目录-》可执行文件目录:C:\WinDDK\7600.16385.1\bin\x86;$(ExecutablePath) //其实这里都是32位的编译器,链接器,只是通过传参,调用X86或者AMD64的编译连接器,生成32位或者64位的驱动
常规-》目标文件扩展名:.sys
C/C++-》常规-》附加包含目录:C:\WinDDK\7600.16385.1\inc\ddk;C:\WinDDK\7600.16385.1\inc;C:\WinDDK\7600.16385.1\inc\crt;C:\WinDDK\7600.16385.1\inc\api;%(AdditionalIncludeDirectories)
C/C++-》常规-》调试信息格式:C7 兼容 (/Z7)
C/C++-》优化-》优化:已禁用 (/Od)
C/C++-》预处理器-》预处理器定义:WIN32=100;_X86_=1;WINVER=0x500;DBG=1;%(PreprocessorDefinitions)
C/C++-》代码生成-》运行库:多线程调试 (/MTd)
C/C++-》代码生成-》缓冲区安全检查:否 (/GS-)
C/C++-》高级-》调用约定:__stdcall (/Gz)
C/C++-》高级-》编译为:编译为 C++ 代码 (/TP)
链接器-》常规-》启用增量链接:否 (/INCREMENTAL:NO)
链接器-》常规-》附加库目录:C:\WinDDK\7600.16385.1\lib\win7\i386;%(AdditionalLibraryDirectories)
链接器-》输入-》附加依赖项:ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB;%(AdditionalDependencies)
链接器-》输入-》忽略所有默认库:是 (/NODEFAULTLIB)
链接器-》清单文件-》启用用户账户控制(UAC):否 (/MANIFESTUAC:NO)
链接器-》调试-》生成调试信息:是 (/DEBUG)
链接器-》调试-》生成映射文件名:是 (/MAP)
链接器-》系统-》子系统:控制台 (/SUBSYSTEM:CONSOLE)
链接器-》系统-》堆栈保留大小:4194304
链接器-》系统-》堆栈提交大小:4096
链接器-》系统-》驱动程序:驱动程序 (/Driver)
链接器-》高级-》入口点:DriverEntry
链接器-》高级-》设置校验和:是 (/RELEASE)
链接器-》高级-》基址:0x10000
链接器-》高级-》随机地址:空
链接器-》高级-》数据执行保护(EDP):空
链接器-》高级-》目标计算机:MachineX86 (/MACHINE:X86)
//编译64位驱动,稍微改动下边的几个,其他跟上边相同即可:
VS2010里新建一个空项目,新建一个配置名:DriverWDK64 //自行定义名字
链接器-》常规-》附加库目录:C:\WinDDK\7600.16385.1\lib\win7\amd64;$(LibraryPath)
C/C++-》预处理器-》预处理器定义:WIN32=100;_AMD64_=1;WINVER=0x501;DBG=1;%(PreprocessorDefinitions) //这里用到的估计也就只有_AMD64_,DBG,因为剩下的都不是64位的定义,没用到也就能编译过去了
链接器-》高级-》目标计算机:MachineX64 (/MACHINE:X64)
我这里是win7 x64 环境,所以最后编译的时候还要在这里选择 x64:
编译运行,没有错误,找打文件所在目录:
使用 Driver Monitor 加载这个驱动,显示签名无效:
因为 windows 在 vista 以后就加入了 “禁止没有签名的驱动加载” 这个功能,这里我们需要伪造一个驱动签名,用到了 “亚洲诚信数字签名” 这个工具。不再介绍使用方法,感兴趣可以自己百度找个破解版的。
最后签名成功的效果是这样的:
再次打开 Driver Monitor ,加载这个驱动,已经加载成功,如果想看打印的内容,可以开一个 DbgView。
但是我写的驱动代码应该有些问题,导致加载了以后电脑很容易卡死,不确定是哪里的问题,之后有时间再研究。