驱动


1.使用DebugView查看输出信息
对内核调试是做系统底层驱动开发的必修课,当然也是有兴趣才可能进行深入的挖掘。进行驱动调试可以有很多工具可以用,比如DebugView可以查看一些DbgPrint的输出的输出信息(当然它的功能还有其他)如下图(不好意思,图还在审核中):

点击菜单“Capture”,在弹出的菜单中勾选想要监控的输出信息,就可以在动态调试时看到你在程序中使用DbgPrint输出的信息!
下面我们举一个驱动的小例子,来看下效果(相关资料可以参考驱动开发的教程《寒江独钓》)。
实例1:
首 先要安装相应的工具,我们这里用到了,VMWare,WDK,DebugView,任意文本编辑工具。我这里用了VS2008作为编辑工具,感觉编写工具 都无所谓的,我机子上装我这个,而且它可以实现自动生成格式,总而言之,我对这个比较熟悉,大家根据喜好选择。其他相关的工具从网上下载即可。
(1)测试程序
为了能够在这个驱动作为服务进行添加于卸载时能够给大家一清晰的提示,这里编写MyDriver.c如下(参考《寒江独钓》)
#include   //可能大家还记得,ntddk.h貌似比ntifs.h要高级些,看其源码发现,
                                //在define的时候ntddk.h会关照 ntifs.h,但ntifs.h却不关照它,哎!好伤心呀!
//在调试时,卸载这个驱动服务时,可以在此输出调试信息
void DriverUnload( PDRIVER_OBJECT driver )
{
     //输出用于调试的信息
     DbgPrint( "My driver is unloaded!\r\n" );
}

//DriverEntry,就相当与主函数main(),很多做驱动的同僚会把这些函数用宏进行重定义,
//以适应其长期用其他工具编写调试程序和编写程序的习惯
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
    //输出相应得调试信息
    DbgPrint( "This is my driver!\r\n" );  //注意这里的"\r\n",这个我在调试时发现了点问题,下面解释
    //设置卸载函数,便于函数的退出请求的响应,当有服务停止事件时会自动调用DriverUnLoad函数
    driver->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}
(2)makefile文件与SOURCES文件
为 了能够在WDK中进行编译,另外还需要两个文件,makefile与SOURCES文件,makefile文件可以从WDK的安装目录下的src文件夹下 的一些实例中进行拷过来,当然SOURCES文件也可拷过来。不过实例这个文件夹要在安装WDK时选择完全安装,否则可能就看不到了,我装的是WDK 6001.18002,我拷出一个makefile大家可以参考一下。
#
# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)\makefile.def
最主要的是最下面的那个包含文件makefile.def,其实不同版本会有不同的makefile,这个makefile.def中会定义相应的信息。我们手工鞋一下SOURCES文件就可以了。
TARGETNAME = MyDriver
TARGETTYPE = DRIVER
SOURCES = MyDriver.c
解 释一下,TARGETNAME是要生成的.sys的名字;TARGETTYPE是要生成的驱动的类型,为DRIVER时,生成的扩展名自动为.sys

SOURCES为要编译的源文件名,有多个时以空格分隔。

注意:TARGETNAME后的名字可以起其他名字,不一定要用MyDrivers。
(3)编译生成
把上面的3个文件放到一个文件夹下,然后打开WDK编译器,方式如下:点击"开始菜单"->Windows Driver Kits->WDK 6001.18002->Build Environments->Windows 7->Launch Windows XP x86 Checked Build Environment。这个是调试版的,下划线部分选为:Launch Windows 7 x86 Free Build Environment 时,编译出的版本为发行版的。
在 弹出的编译窗口中,进入到刚新建的放置已经创建的MyDriver.c、makefile、SOURCES三个文件的目录下,然后直接输入build指令 就可以成功了。如果提示失败的话,上面会有发生错误的行号,我在VS2008下能看到,所以建议大家在编写的时候选择一个带行号的编辑器,然后根据提示找到错 误行进行修改。当然编译提示的错误行并不一定就是那一行出现的问题,调试过大一点程序的同学可能知道,这个就要看你的调试能力了,特别是很大的项目时,做 驱动开发的同学更要注意蓝屏问题,这是做驱动项目的一个致命的问题。当然避免这些异常出现也不是不可能的,比如做代码保护,也就是对自己写的代码信不过 时,或者对于容易出现异常的地方,可以做异常处理,VC调试状态下的异常抛出就是一个很好的例子。编译后就会生成.sys文件,本编译器生成的信息放到了 “.\objchk_wxp_x86\i386” 目录下,可以找到MyDriver.sys。
(4)安装驱动
在 具体解释如何安装之前,还是要考虑一些问题的。为了不使我们的系统出现很多垃圾信息,并且保证我们真实系统的稳定性,建议大家在虚拟机上测试,市面上比较 好的虚拟机有VMware,大家自由选择。我个人是做恶意程序分析平台,采用的是对开源QEMU进行模块重构(有兴趣的同 志们可以一起来做),感觉系统安全性和稳定性还是很必要的。本测试采用VMWare(不过在做恶意程序测试时,感觉这个虚拟机真的很有局限性)。
在 对驱动安装时大家往往都会看到.inf安装配置文件,也不是所有的驱动安装都需要这个,不过这个inf里面的信息对于恶意程序开发者而言还是有值得学习的 地方的,至少它会告诉你要安装一个服务应该去注册哪些信息。我们这里先不讨论它的具体内容,由于本实例比较简单,我们直接采用一个小的服务安装工具就可以 了。srvinstw.exe可以从网上下载,华军网站上有这个,下载直接运行。用这个工具安装服务时要注意三点(可以参考《寒江独钓》,不好意思,不是 为这本书打广告,只是感觉介绍的还可以)。
A、在要求输入要安装的服务的文件路径是,要手工输入,当你选择浏览时它只能选择.exe,当然这也是这个工具的一个Bug,居然只考虑到服务只有.exe形式的情况。
B、在要求输入服务名时,可以与原来的服务文件名不一致,而且后面对服务的操作以这里输入的服务名为准。
C、在选择安装类型是选择手动,以便后面好操作。
其他的按提示进行就好了。
(5)信息查看
简 单的介绍一下VMWare这个虚拟机,用Ctrl + Alt键进行主系统与虚拟系统间的切换,安装下VMWare Tools就任意实现鼠标切换了,而且可以支持文件的拖放。正常情况下都不会出现拖动与切换的问题。下载DbgView.exe,大家可以下载下来直接拖到到虚拟机中。打开后,勾选菜单”Capture"下的”Captrue Kernel“,这样才能捕获到内核信息。
在 开始菜单中,打开运行,输入"cmd",打开命令提示符窗口,输入net start MyDriver,即可看到DbgView窗口中的“Debug Print”列下打印出了“This is my driver!”;然后输入net stop MyDriver,DbgView就会打印出“My driver is unloaded!"。