在完成了进程和线程的学习后,我们发现,很多实验都受限于权限的限制,很难直接操纵0环的结构,然而,依靠中断门等提权方式进入0环,需要手动在Windbg中设置段描述符,就会变得很麻烦。而驱动恰恰可以解决这个问题,驱动可以直接和操作系统打交道,话不多说,开始驱动的学习吧。
环境配置搭建
环境及工具
先安装Visual Studio 2017在本机,再安装WDK到本机。DbgView和KmdManager则安装至虚拟机上。因为驱动若发生错误,则会导致系统崩溃,因而选择在虚拟机上进行实验。
项目创建
- 安装完VS2017后,要安装SDK,且版本要与WDK的版本一致,如图我的SDK版本是17763 那么安装的WDK版本,也得是17763
- 校验好版本后,来创建驱动程序,新建项目 -> Visual C++ -> 测试 -> Legacy -> Empty WDM Driver 有人可能会问了,为什么要创建WDM的驱动程序,而不创建WDF的驱动程序呢?因为如果创建了WDF的驱动程序,在xp上执行会发生系统找不到指定文件的错误 具体原因也不是很清楚,至于这俩的区别可以参考WDM和WDF之间的差异
- 接着点击确定,即可创建驱动程序项目了,但是需要注意一点,就是第一步中,SDK和WDK的版本必须要一致,否则会出现一个奇怪的错误 如果版本相同,就不会出现这样的错误啦
项目属性配置
编写第一个驱动程序
创建过程
编写驱动代码,具体如下
c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//卸载函数
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("驱动程序已停止.\r\n");
}
//驱动程序入口函数,相当于控制台的main函数
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
DbgPrint("驱动程序已运行.\r\n");
//设置一个卸载函数 便于退出
DriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
结果验证
- 将HelloDriver/Debug目录下的HelloDriver.sys复制进虚拟机Windows Xp中
- 打开DbgView,勾选Capture Kernel选项,用于捕获内核调试信息
- 打开KmdManager,导入HelloDriver.sys,注册并运行,验证结果。
总结
总体不难,但是第一次搞驱动,踩了不少坑,最终还是花了一个上午的时间才弄好。真的非常感谢Joney老大解答问题,这让我少花了很多时间,不然我可能搞到晚上都弄不出来。。。
参考文章: