欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows编程—Windows驱动开发环境搭建

程序员文章站 2022-07-14 10:19:59
...

前言

作为一个编写Windows程序的开发人员,对Windows驱动开发 并非必需要掌握,但是掌握 Windows驱动开发对Windows程序开发人员却有极大的好处。一个直观的感受 程序操作权限更大了,因为处在内核层了嘛。应该可以写更厉害的外挂,普通Windows程序写个辅助完全是没问题的,但是涉及到数据修改突破游戏程序的一些限制 必须用更高权限的内核驱动了。

开始学习Windows驱动开发,第一步当然是环境搭建了。因为笔者也在驱动环境搭建上也吃过亏,所以这里进行记录和分享,当然这里也是集众家之长了。

其实笔者在一开始学Windows程序开发的时候 搭过一次驱动开发环境,当时直接用vs2015还是vs2017 忘了,使用WDK10,搭了好几周 都没搭成功,最后 无奈放弃。总结下失败原因,WDK10的版本众多 而且还要和当前 操作系统一一对应,而且win10 又经常更新,当时调试机也是用的win10版本,笔者电脑配置也不行 开win10虚拟机也吃力。

这里笔者建议初学者 不要一开始 就WDK10 和 VS集成开发 调试。先使用windbg 把双机调试搞起来了 再说。其实vs集成开发调试 也是调用的windbg。这里顺带说一下 WDK版本和操作系统版本关系。WDK 7600_1 在主机最低Win7安装,编译出来的驱动 最低支持到Win XP,VS未集成。WDK8.1 在主机最低Win8上安装,编译出来的驱动最低支持Win Visa,VS2013开始集成。WDK 10具体版本 就具体细化了 编译出来的驱动最低支持到Win7。基本上做Win开发 都是以 Win XP作为 支持的最后底线,所以一般 我们用WDK7即可了

笔者这里环境是 主机Win10 + WDK7600_1 + 调试机Win XP Sp3

步骤

步骤一

在win10上安装 WDK7600_1,将GRMWDK_EN_7600_1.ISO 解压安装即可。百度云下载链接

链接:https://pan.baidu.com/s/1ldYMIIn6837iq2IYUpNSqg
提取码:3lex
或者 网上搜索,都可以找到。

步骤二

使用VMware安装Win XP Sp3虚拟机,安装完毕后,在C:\boot.ini中添加调试模式启动选项。添加后如下:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

此时如果重启,显示页面应该如下,说明boot.ini配置好了。

Windows编程—Windows驱动开发环境搭建

随后添加串行端口。用于主机与调试机通信使用的。

Windows编程—Windows驱动开发环境搭建

步骤三

配置WinDbg

File -> Kernel Debugging -> COM 进行如下配置,端口和波特率要和 虚拟机配置一样。

Windows编程—Windows驱动开发环境搭建

也可以 将windbg.exe 发送到桌面快捷方式,在快捷方式 -> 属性-> 快捷方式 -> 目标 空格后添加如下参数,这样以后 双击 就开始会连接调试机。

// 目标程序后面 添加如下参数
 -b -k com:port=\\.\pipe\com_1,baud=115200,pipe
// 下面是笔者的目标
D:\WinDDK\7600.16385.1\Debuggers\windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe

连接测试

在步骤二、三 完全配置好了就可以 测试 双机调试 是否连通通了,重启 Win Xp Sp3,可以在启动项 那里来回切,这样就停在那里了。此时 调试机 的串口已经启动了,此时可以进行步骤三 进行连接了。

Windows编程—Windows驱动开发环境搭建

此时可以点击 WinXp 调试启动了。

此时WinDbg如下:

Windows编程—Windows驱动开发环境搭建

此时,虚拟机也会被暂停,在kd> g 继续,测试虚拟机正常启动。

在虚拟机中可以加载驱动进行测试,看windbg是否有输出,调试机 连接 windbg 调试,请看步骤五。

Windows编程—Windows驱动开发环境搭建

步骤四

配置系统内核符号表。笔者用的Win XP Sp3 x86版本,下的符号表 WindowsXP-KB936929-SP3-x86-symbols-full-ENU.exe 这个,本来微软可以在线获取符号表,笔者自己测试 貌似没起效果 没有进行在线获取。百度云链接:

链接:https://pan.baidu.com/s/1ABA8qcealpBKr_Op2QF_Pw
提取码:wmi3

笔者这里选择的安装目录时在 C:\symbols。这里一定要注意,我们配置符号表路径 不能直接是根目录,一定得 具体到下面的子目录 才是 pdb路径。

Windows编程—Windows驱动开发环境搭建

在 系统环境路径配置如下:

Windows编程—Windows驱动开发环境搭建

_NT_SYMBOL_PATH
F:\Book\Windows\Windows内核安全与驱动开发随书源代码\first\objchk_wxp_x86\i386;C:\Symbols\acm;C:\Symbols\ax;C:\Symbols\cnv;C:\Symbols\com;C:\Symbols\cpl;C:\Symbols\dic;C:\Symbols\dll;C:\Symbols\drv;C:\Symbols\ds;C:\Symbols\exe;C:\Symbols\iec;C:\Symbols\ime;C:\Symbols\ocx;C:\Symbols\scr;C:\Symbols\sys;C:\Symbols\tpl;C:\Symbols\tsp;C:\Symbols\wpc;SRV*C:\Symbols_cache*http://msdl.microsoft.com/download/symbols;

笔者这里是 把测试的sys驱动的 pdb路径配置上,然后再才是本地Win XP Sp3系统符号表,最后再才是 在线获取符号表配置(笔者这里测试貌似不起效果)。

配置完了后,可以重写进行连接测试,走到 kd> 命令行处,或者如果在运行时直接 Debug -> Break 也会进行中断到 kd> 命令行处,我们进行一些简单测试。

// 1、查看设置的符号表路径,如果查找出来不是签名配置的路径,可以在WinDbg->File->Symbol File Path 将路径路径拷贝进入勾上Reload框 然后点击OK。 就会重新加载符号文件路径了。
kd> .sympath	
// 2、查看相应的模块信息,如果能查找系统模块pdb说明 我们配置系统符号表没问题
kd> !lmi ntkrpamp

Windows编程—Windows驱动开发环境搭建

步骤五

我们准备一个 测试用的sys,看能否进入断点调试。我们只需要找一个可以加载装载驱动的软件就可以了。这里笔者用 Driver Monitor软件来加载驱动。

这里准备一个sys文件,这里笔者直接用<< Windows内核安全与驱动开发 >> 随书源代码中的 first例子。使用 x86 Free Build Environment(安装好wdk后,在启动菜单可以找到) 进行编译,cd 切换到first.sys目录,然后build。会生成如下的 first.pdb和first.sys。

first.c

///
/// @file first.c
/// @author crazy_chu
/// @date2008-11-1
/// 

#include <ntddk.h>
	
// 提供一个Unload函数只是为了
VOID DriverUnload(PDRIVER_OBJECT driver)
{
	// 但是实际上我们什么都不做,只打印一句话:
	DbgPrint("first: Our driver is unloading…\r\n");
}

// DriverEntry,入口函数。相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
#if DBG
       _asm int 3
#endif
	// 这是我们的内核模块的入口,可以在这里写入我们想写的东西。
	// 我在这里打印一句话。因为”Hello,world” 常常被高手耻笑,所以
	// 我们打印一点别的。
	DbgPrint("first: Hello, my salary!\r\n");

	// 设置一个卸载函数便于这个函数能退出。
	driver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}

Windows编程—Windows驱动开发环境搭建

这个路径 要添加到 环境变量_NT_SYMBOL_PATH 或者 WDK中的 sympath中去。

我们把first.sys 拷贝到 虚拟机中,然后使用 monitor,File ->Open Driver first.sys ,然后再File->Start Driver 这时会去装载驱动,然后再File->Stop Driver 这时会去 卸载驱动。

Windows编程—Windows驱动开发环境搭建
Windows编程—Windows驱动开发环境搭建
Windows编程—Windows驱动开发环境搭建
Windows编程—Windows驱动开发环境搭建

总结

作为初学者,建议先把 windbg双机调试模式 搞起来这才是王道,vs集成驱动开发可以后面再搞。笔者认为 win10 + wdk7 + win xp sp3 双机调试也是最省配置的。