Windows 内核(WRK)简介
引子
WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,WRK(Windows Research
Kernel)也就是 Windows 研究内核,在 WRK 中不仅仅只提供了 Windows 内核模块的部分代码,其还提供了编译
工具,也就是通过这个编译工具,你可以将你的 WRK 编译成一个 EXE 文件,也就是内核可执行模块,然后你可
以利用这个 EXE 文件来取代操作系统本身的内核,这样的话,下次开机的时候操作系统所加载的内核就是您编译
的那个 EXE 了。
工具软件
Intel x86 CPU;
VMware 6.5;
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 Server2003 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 复制进
系统盘,然后将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 来调试这个内核,但是由于这个在后面介
绍驱动程序的时候我会再做说明,所以这里就不添乱了。
Windows 内核(WRK)简介的更多相关文章
- Windows 内核(WRK)编译
引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
- Windows Kernel Way 1:Windows内核调试技术
掌握Windows内核调试技术是学习与研究Windows内核的基础,调试Windows内核的方式大致分为两种: (1)通过Windbg工具在Windows系统运行之初连接到Windows内核,连接成功 ...
- [7] Windows内核情景分析---线程同步
基于同步对象的等待.唤醒机制: 一个线程可以等待一个对象或多个对象而进入等待状态(也叫睡眠状态),另一个线程可以触发那个等待对象,唤醒在那个对象上等待的所有线程. 一个线程可以等待一个对象或多个对象, ...
- Windows内核执行体对象管理器的操作过程与分析
我之前写过一个有关于对象管理的读书笔记.但是这篇文章与前面的不同,这是我个人对对象管理器到底是什么的一个分析,而且也是直接对WRK代码进行的阅读. 执行体对象即我们通常所言的内核对象,我们知道Wind ...
- windows内核代码之进程操作
[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...
- Windows内核驱动开发入门学习资料
声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...
- Windows内核遍历驱动模块源码分析
要获取windows 内核中所有驱动模块信息,调用 系统服务函数 NtQuerySystemInformation,参数SystemInformationClass 传入SystemModuleInf ...
- Windows内核原理系列01 - 基本概念
1.Windows API Windows 应用编程接口(API)是针对WIndwos操作系统用户模式的系统编程接口,包含在WindwosSDK中. 2.关于.NET .NET由一个被称为FCL的类库 ...
随机推荐
- postgres--流复制
配置 master 192.168.2.21 5432 slave 192.168.2.22 5432 目录 /var/lib/pgsql/10/data/ 配置主库 配置用户 psql create ...
- jQuery中,子页面与父页面之间的调用方法
在jQuery中, 子页面查找父页面的元素 parent.$("#元素Id") 父页面调用子页面的元素 $("#子页面iframe的Id").contents( ...
- [转载]Delphi事件的广播
https://blog.csdn.net/dropme/article/details/975736 明天就是五一节了,辛苦了好几个月,借此机会应该尽情放松一番.可是想到Blog好久没有写文章,似乎 ...
- python开发者常犯的10个错误(转)
常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情 ...
- 一起talk C栗子吧(第二十七回:C语言实例--插入排序)
各位看官们,大家好.上一回中咱们说的是冒泡排序的样例.这一回咱们说的样例是:插入排序. 闲话休 提,言归正转.让我们一起talk C栗子吧. 看官们,我们这回说的插入排序和前一回说的冒泡排序一样.也是 ...
- hive的rownumber()的使用
举个简单的栗子: 找到最小日期的那一条记录 select * from ( select *,row_number() over (partition by id order by cast(date ...
- LINUX 下编译不通过解答
在linux下编译android源码或者webkit等程序源码时,不论在源码下加什么错误,编译器都默认正确,检索不到错误,此时,可能是之前编译的生成文件默认编译器不再检索编译新修改过的文件,只是发现修 ...
- mysql多实例介绍及配置
mysql多实例介绍及配置 1.mysql多实例介绍 1.1 什么是mysql多实例 mysql多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过 ...
- 再说rocketmq消息存储
两篇精彩的文章: <RocketMQ源码 — 三. Producer消息发送过程> <RocketMQ源码解析:Message存储> rocketmq通过netty获取到消息请 ...
- 转: 学ppt的网址与素材
转:http://www.jianshu.com/p/89b261e0b8f6 你说你要学ppt,可你知道这些吗? 之前身边的同学总说做PPT很难,每次做ppt都头疼,我都对此很不屑,直到前一段开 ...