引子html
WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,缓存
WRK(Windows Research Kernel)也就是 Windows 研究内核,安全
在 WRK 中不只仅只提供了 Windows 内核模块的部分代码,其还提供了编译工具,函数
也就是经过这个编译工具,你能够将你的 WRK 编译成一个 EXE 文件,工具
也就是内核可执行模块,而后你能够利用这个 EXE 文件来取代操做系统自己的内核,性能
这样的话,下次开机的时候操做系统所加载的内核就是您编译的那个 EXE 了。学习
工具软件测试
Intel x86 CPU;动画
VMware 6.5;ui
Windows Server 2003 SP1(用于测试 WRK 编译结果);
Windows 7(用来编译 WRK);
WRK 1.2 ;
概览 WRK
首先咱们来找到当前 Windows 操做系统下的内核模块文件,
所谓的内核模块文件呢,其实就能够看作是 Windows 的内核,
其由执行体和微内核组成,该文件名为 ntoskrnl.exe ,即一个二进制模块,
该文件位于:C:\Windows\System32 ;
而咱们的 WRK 编译后所得的结果应该也是一个内核模块文件,
也就是说咱们编译所得的结果应该就是这个 ntoskrnl.exe ,
固然编译后的名称是能够不一样的,
默认编译所得为 wrkx86.exe (这是 x86 环境下的默认编译结果名称),
下面来分析 WRK 中目录结构:
首先来看 WS03SP1HALS 目录:
WS03SP1HALS 表明的意思即 Windows Server 2003 SP1 HALS,
也就是在 Windows Server 2003 SP1 下的 HAL (硬件抽象层)。
在 Windows 操做系统中,HAL 实际上是一个独立的 DLL (在这里你就能够简单的将 HAL 看作一个 DLL) ,
经过 HAL 能够实现隔离掉硬件的差别,也就是上层的模块无需考虑下层真实硬件之间的差别性,
由于上层模块不可以直接访问硬件,而是经过 HAL 来访问硬件的,
因此对于硬件的差别性,在 HAL 中便可以解决掉,而不须要上层模块来解决,
这样作的好处是很显然的,那就是咱们的上层模块都是同样的,也就是当硬件改动时不须要变,
只要提供针对不一样的硬件的 HAL 便可以实如今不一样的硬件上运转咱们的上层模块。
因为咱们的 PC 上的硬件不一致,因此必须有多个 HAL 。
好比个人 PC 的处理器为 Intel 的,而你的 PC 的处理器为 AMD 的,
个人处理器为单核的,而你的处理器为四核的,
那么这就会形成硬件上的不一致,为了解决这种不一致呢,
Windows 在打包的时候会打包多个 HAL 进来,好比一个 HAL 针对单核,一个 HAL 针对多核,
Windows 在安装的时候就会自动的识别出你的处理器是 AMD 仍是 Intel ,是多核仍是单核处理器,
而后 Windows 就会自动选择一个合适的 HAL 给你安装,同时,将 HAL 名字修改成 HAL.DLL,
而在 WS03SP1HALS 目录下的也就是这些个 HAL ,
好比个人 PC 的处理器为 Intel x86 系列的双核处理器,
天然在安装 Windows 的时候,就会自动选择合适的 HAL ,好比 halmps.dll 做为 HAL ,
而后在安装 Windows 的时候将这个 HAL 复制进个人 C 盘指定目录下后,
就将这个 halmps.dll 更名为 hal.dll(为了统一因此更名),
这样就能够获得咱们下面看到的在 C:\Windows\System32\hal.dll 了。
再来看 Public 目录:
在这个目录下包含的是一些头文件,也就是 .h 文件,并且这些文件都是被各个组件所共享使用的,也就是公用的,
其中含有 ddk , internal 等等,其中 internal 表示为内部使用的,也就是内核自身须要使用到的头文件。
再来看 Tools 目录:
前面提到,WRK 中不只仅包含了微软公开的关于 Windows 内核的部分源代码,
还包括了用来编译这部分源代码的工具,而这些编译工具天然就在这个 Tools 目录下了。
在后面咱们编译这个 WRK 源代码的时候就会用到这个 Tools 目录下的工具了。
最后看 Base 目录,其中 Base 目录下的 ntos 目录为 Windows 内核模块的主目录:
下面就来逐一的介绍这些个目录中的文件的含义:
build |
WRK 只公开了部分源代码,那些未公开的则以二进制目标代码的形式存在于这个目录下。 |
cache |
缓存管理器的实现的源文件。 |
config |
注册表的实现的源文件。 |
dbgk |
调试子系统的内核模式部分的源文件。 |
ex |
执行体层函数(内核堆 , 同步 , 定时器等)的源文件。 |
fsrtl |
文件系统运行库的源文件。 |
fstub |
文件系统引导接口。 |
io |
I/O 管理器,不包括即插即用管理器和电源管理器部分。 |
ke |
(微)内核,包括线程调度器,CPU 管理以及底层的同步语义 |
lpc |
本地过程调用 (LPC) 机制的实现。 |
mm |
内存管理器。 |
ob |
内核对象管理器。 |
perf |
内核的性能日志记录功能。 |
ps |
进程和线程。 |
se |
安全引用监视器。 |
wmi |
Windows 管理规范。 |
inc |
仅适用于 NTOS 部分的包含文件。 |
raw |
RAW 文件系统驱动程序的实现的源文件。 |
rtl |
内核运行时库支持。 |
init |
内核启动部分的代码。 |
vdm |
虚拟 DOS 机。 |
verifier |
驱动程序检验器。 |
编译 WRK
首先是设置 WRK 根目录下的 Tools 子目录中的 x86 子目录到 Path 环境变量中,
首先在控制台下进入到 WRK 根目录下的 Base 目录下的 Ntos 目录下,
而后输入命令:nmake –nologo x86= ;
(若是是 AMD 的 CPU 的话命令会有所不一样,并且环境变量的设置也不一样)
而后就开始编译整个 WRK 了。
编译完成:
此时就能够在目录:WRK-v1.2\base\ntos\build 下面找到编译好的 EXE 文件了。
至此编译完成。
加载 WRK 编译所得的内核模块
前面咱们已经由 WRK 编译获得了内核可执行模块,
下面咱们就要让操做系统启动的时候加载上编译所得的这个内核可执行模块。
咱们使用的环境是在 VMware 6.5 中安装好 Windows Server 2003 SP1 。
首先,咱们将由 WRK 编译所得的 wrkx86.exe 拷贝到虚拟机中,
而且将这个文件放置到目录(也就是 ntoskrnl.exe 所在目录):
而后再在其系统安装目录下(通常为 C: 盘)下面找到 boot.ini 文件(默认为隐藏)。
首先须要将这个文件的只读属性去掉,即将该文件改成可读写文件,
而后用记事本打开这个 boot.ini 文件
修改前的 boot.ini 文件:
再在 boot.ini 中添加以下行:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, WRK" /kernel=wrkx86.exe /hal=hal.dll
修改后的 boot.ini 文件:
将上面的都设置好之后就从新启动 Windows Server 2003 SP1 。
而后在启动画面中便可以看到以下画面:
咱们选择 Windows Server 2003 , WRK 启动 Windows 操做系统,
这样加载内核可执行模块的就是咱们由 WRK 编译所得的那个 wrkx86.exe 了。
总结
上面经过不少的截图来详细介绍了 WRK 的编译以及加载由 WRK 编译所得的内核模块的过程,
对于 WRK 有什么做用呢?固然其是用来学习滴,也就是经过 WRK 的学习,
能够更加深刻的了解到 Windows 的内核,等到那一天有实力了,
你大能够经过修改 WRK 源代码,而后再编译成内核模块,
而后再让操做系统加载你自个的内核模块,固然,这个不是很容易就能够达到的境界的!!!
其实呢,对于 WRK 来讲,还有一个调试环境的搭配,经过这个调试环境,
你能够在外面(指的是在虚拟机之外)经过 WinDbg 来调试这个内核,
可是因为这个在后面介绍驱动程序的时候我会再作说明,因此这里就不添乱了。
http://www.cnblogs.com/BoyXiao/archive/2011/01/08/1930904.html