2.1 驱动的运行
驱动的运行通过服务来实现,由于服务操作较为烦琐,这里首先为读者介绍以命令行的方式运行一个驱动,在本章后面将会介绍与服务相关的内容。
微软规定,驱动文件必须经过微软的数字签名后,才可以运行在64位系统上,这个规定虽然在一定程度上提高了驱动加载的门槛,拦截了一部分内核病毒,但给驱动测试带来了一点小麻烦,读者如果把一个没有签名(或者只有测试证书的签名)的驱动FirstDriver.sys直接放到64位操作系统中运行,其结果是驱动加载失败,失败原因是驱动没有签名(或签名不合法),对于这个问题,下面介绍两种解决方法。
方法1:把操作系统配置成调试模式(将在下面章节介绍),调试模式的系统,默认允许未签名的驱动运行。
方法2:临时关闭系统驱动签名校验,在开机时修改启动参数,如对于Windows 7操作系统来说,开机时可以在键盘上按下F8键,选择禁用驱动程序签名强制,如图2-1所示。
对于Windows 10系统来说,可以在高级重启中设置,具体操作为:“开始菜单”→“设置”→“更新与安全”→“恢复”,在高级启动下点击“立即重启”按钮,然后在出现的界面中选择“疑难解答”→“高级选项”→“启动设置”,点击“重启”按钮,系统开始重启,在重启过程中会显示启动选项,在键盘上输入数字7,即选择“禁用驱动程序强制签名”,如图2-2所示。
图2-1 Windows 7禁用驱动签名
图2-2 Windows 10禁用驱动签名
除了上面介绍的两种方法,还可以把系统驱动程序强制签名永久去掉,但是这样会大大降低系统的安全性,笔者并不建议采用这个做法。有兴趣的读者可以自行研究。
在本章节中,笔者选择了WDK 10版本来对第1章的FirstDriver工程代码进行编译,然后使用Vmware 14版本安装一个Windows 10操作系统,系统版本为15063,读者可以根据自身需要来部署环境。关于如何部署驱动开发环境,请参考第1章。
虚拟机安装完毕之后,首先根据上面介绍的方法2,临时禁用虚拟机系统的驱动程序签名校验,然后把FirstDriver.sys驱动放到虚拟机系统的C盘下,接着在虚拟机系统内使用管理员权限运行cmd(命令提示符),在cmd中输入注册驱动的命令:
其中sc create表示创建一个服务,binPath指驱动文件所在的磁盘位置,type表示驱动的类型,start表示该服务的启动类型,demand表示手动启动。请注意,在上面的命令中,等号(=)后面需要有一个空格。
sc命令内部也是通过服务的API对服务进行注册的,与直接通过API创建服务的效果相同,通过sc命令,可以省去编写注册服务的代码。
成功创建服务后,使用sc命令来启动服务,命令如下:
其中FirstDriver为服务名,对应sc create后面的名字,这个命令的功能等同于StartService函数,服务成功运行后,命令行上显示创建的信息,如图2-3所示。
图2-3 创建与运行服务
在第1章介绍的FirstDriver代码中,笔者在DriverEntry入口函数中通过DbgPrint函数打印了一系列日志,那这个日志应该在哪里查看呢?笔者为读者介绍一个工具:Dbgview.exe,这是一个绿色的小程序,下载地址为:https://docs.microsoft.com/en-us/sysinternals/downloads/debugview,通过这个小程序,可以很方便地观察DbgPrint的日志。
在虚拟机中以管理员权限运行Dbgview.exe,在菜单上选择Capture,依次勾选上“Capture Kernel”以及“Enable Verbose Kernel Output”,如图2-4所示。
图2-4 DbgView设置
由于FirstDriver已经运行,如果需要观察DriverEntry的日志,首先需要停止驱动服务,然后再次启动驱动服务,停止驱动服务的命令为:
成功执行停止命令后,保持DbgView不关闭,再次执行sc start FirstDriver,可以在DbgView的窗口中看到以下日志,如图2-5所示。
图2-5 DbgView中的日志
此外,还可以通过sc delete FirstDriver命令删除先前已注册和创建的服务。
关于驱动的运行,介绍到此为止,读者重点需要掌握的是本章下一节的内容。