Windows XP驱动编程
# 简单操作系统驱动及安全
# 一。配置和环境
-
系统 windows XP
-
安装 Windows SDK & DDK
- 下载链接:Windows DDK
-
下载 DriverMonitor.exe(将文件加载到内核)
-
下载 DirverView.exe(观察驱动运行结果)
# 二. Windows XP 平台下的驱动框架进行说明。
# 1. Windows XP 驱动框架。
Windows XP 驱动不同于普通的 C 应用态程序。C 应用态程序的入口是 main 函数,但是驱动中没有 main 函数,Windows XP 驱动入口函数称为 “DriverEntry” 的函数。在驱动加载后,第一个运行的就是 DriverEntry 函数,因此,所有需要初始化的工作都是在 DriverEntry 函数当中完成的。接下来,在初始化完成之后,DriverEntry(通过调用其他的功能函数)将控制权交给功能函数以完成必要的驱动功能。最后,当驱动工作完成之后,必须退出以释放内核空间,这是通过调用 “驱动退出函数” 实现的。与 Windows XP 驱动一定有一个固定的、称为 “DriverEntry” 的入口函数不同,“驱动退出函数” 的名称是不定的,具体名称是什么,由 “DriverEntry” 中的 “driver->DriverUnload” 语句指定函数名。具体到本实验的例子(参见如下 Encryption.c 源码),有语句 “driver->DriverUnload = DriverUnload;”,因此在本例中,驱动的退出函数名为 “DriverUnload”。
综上,Windows XP 下的驱动框架部分需要掌握以下几点:
-
首先,驱动的入口函数称为 “DriverEntry”,在 “DriverEntry” 中完成驱动的所有初始化工作;
-
之后,“DriverEntry”(通过调用其他功能函数)将控制权交给其他功能函数以完成驱动所需的功能。这个过程和用户态 C 语言的子函数调用是类似的;
-
最后,在 “DriverEntry” 使用 “driver->DriverUnload = XXXX;” 语句指定驱动退出函数。上例中 XXXX 就是驱动退出函数的函数名,由用户进行编写后指定。当驱动程序退出时,会自动调用驱动退出函数以完成必要的终止和回收工作。
# 2. Windows 驱动编译。
驱动的编译可以采用 DDK 环境,也可以采用 VC 环境。本次实验采用 DDK 环境进行编译(感兴趣的同学可以搜索如何以 VC6.0 环境编译驱动。两者编译的结果是一样的,没有差别)。利用 DDK 环境编译驱动的具体过程如下:
首先在源程序的相同目录下创建两个文本文件 makefile 和 Sources。这两个文本文件描述了 DDK 驱动程序的源文件、用到的 lib 文件、inlcude 路径名以及编译输出的目录和文件名等信息,具体示例如下。
表 1 当中,第 1 行说明驱动的名称为 Encrytion(驱动名根据需要修改);第 2 行指明此驱动的类型为 NT 型驱动;第 3 行设置编译输出目录;第 4 行指定编译原文件名为 Encryption.c(驱动源文件根据需要修改)。
Makefile 文件内容如下:
编写完这两个脚本之后,在 Windows 的开始菜单中选择 “Windows XP Checked Build Environment” 编译环境,启动运行,进入到 cmd 命令界面。实验时选择 Checked 版本,而不是 Free 版本,两者的区别类似于 Win32 程序开发的 Debug 版本和 Release 版本。
最后,在进入命令行方式的 cmd 窗口之后,用 cd 命令进入需要编译的目录,然后输入 “build” 命令,DDK 的编译环境就会自动调用编译器进行编译。如果编译出错,对应修改源文件即可;编译成功之后,会在 obj 目录中生成 Encryption.sys 文件。一旦成功生成了.sys 文件,即可使用附带的 instdrv.exe 将驱动 Encryption.sys 加载到内核运行。
综上,Windows XP 驱动编译需要掌握如下几点:
-
Windows XP 驱动可以采用 DDK 环境编译,也可以采用 VC 环境编译。两者的编译结果是一样的。
-
采用 DDK 环境编译时,需要在驱动程序所在的目录下创建 makefile 和 Sources 文件,具体的写法参见表 1。
-
l 驱动编译的结果是.sys 文件。
# 3. Windows 驱动安装与运行。
Windows 驱动编译生成.sys 文件。.sys 文件是不能直接运行的,必须要插入到内核当中。本实验当中,采用 DriverMonitor.exe 工具将其插入(当然选用其他工具也可以)。其步骤如下:
-
首先下载 DriverMonitor.exe 文件并安装到本机。
-
运行 DriverMonitor.exe。点击”Edit“,添加文件。
-
打开编译得到的.sys 文件。
# 4. 驱动信息查看。
以上完成了驱动的加载,查看驱动运行信息(驱动中可以使用 DbgPrint 来打印一些信息,方便调试)可以采用 DbgView.exe 工具,运行之后,勾选 “Capture Kernel” 捕获内核信息即可。
以下是源码:
1 |
|
# (1)将上述驱动编译成功。
使用 Windows XP x86 Checked Build Enviroment 进行编译:
编译后产生的 sys 文件(系统文件):
# (2)将编译成功的驱动插入到内核运行,并观察运行结果。
使用 DriverMonitor.exe 将 sys 文件加载到内核运行:
然后使用 DirverView.exe 观察驱动运行结果:
原文件内容:
加密后的文件: