Windows 内核(“.NET研究”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  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

内核的性能日志记录功能。

上海企业网站制作th="82" valign="top">

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  启动 Wind上海闵行企业网站制作ows  操作系统,这样加载内核可执行模块的就是我们由 WRK 编译所得的那个 wrkx86.exe 了。            

  总结

  上面通过很多的截图来详细介绍了 WRK 的编译以及加载由 WRK 编译所得的内核模块的过程,对于 WRK 有什么作用呢?当然其是用来学习滴,也就是通过 WRK 的学习,可以更加深入的了解到 Windows  的内核,等到那一天有实力了,你大可以通过修改 WRK 源代码,然后再编译成内核模块,然后再让操作系统加载你自个的内核模块,当然,这个不是很容易就可以达到的境界的!!!

  其实呢,对于 WRK 来说,还有一个调试环境的搭配,通过这个调试环境,你可以在外面(指的是在虚拟机以外)通过 WinDbg 来调试这个内核,但是由于这个在后面介绍驱动程序的时候我会再做说明,所以这里就不添乱了。

时间: 2024-08-21 00:35:04

Windows 内核(“.NET研究”WRK)简介的相关文章

一起谈.NET技术,Windows 内核(WRK)简介

引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,WRK(Windows Research Kernel)也就是 Windows 研究内核,在 WRK 中不仅仅只提供了 Windows 内核模块的部分代码,其还提供了编译工具, 也就是通过这个编译工具,你可以将你的 WRK 编译成一个 EXE 文件,也就是内核可执行模块,然后你可以利用这个 EXE 文件来取代操作系统本身的内核,这样的话,下次开机的时候操作系统所加载的内核就是您编译的那个 EXE 了. 工

Windows 内核(WRK)简介

引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,WRK(Windows Research Kernel)也就是 Windows 研究内核,在 WRK 中不仅仅只提供了 Windows 内核模块的部分代码,其还提供了编译工具, 也就是通过这个编译工具,你可以将你的 WRK 编译成一个 EXE 文件,也就是内核可执行模块,然后你可以利用这个 EXE 文件来取代操作系统本身的内核,这样的话,下次开机的时候操作系统所加载的内核就是您编译的那个 EXE 了. 工

[转贴]Gloomy对Windows内核的分析(研究CreateProcess)

                      (转载)Gloomy对Windows内核的分析(研究CreateProcess) 我给出一个反汇编Win32 API函数CreateProcess的例子,来演示研究子系统的技术,同时演示Win32是如何与Windows NT的执行系统协同工作的. 从MSDN中得到函数原型: BOOL CreateProcess(  LPCTSTR lpApplicationName,// pointer to name of executable module  LP

Linux 2.6.19.x 内核编译配置选项简介

Linux 2.6.19.x 内核编译配置选项简介 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件.您可以自由链接.下载.传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明. 其他作品 本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表: 金步

Windows 核心编程研究系列之一(-改变进程PTE属性-)[已补完]

  Windows 核心编程研究系列之一 -改 变 进 程 PTE 属性-              这是我研究windows 核心编程的第一篇正式文章,之所以叫核心编程而不叫内核编程,是我觉得从字面上来看核心(core)比内核(kernel)更靠近windows中心,当然只是偶本人的看法的拉.          我们知道在 win NT 中,系统把每个进程的虚拟4G空间分为两大部份,低2G归用户所有,高2G归系统所有.用户不得访问系统的空间,连读都不行,更别说写了!低2G的用户空间也并不是都能

Windows内核再次出现0Day漏洞 影响win2000到win10所有版本 反病毒软件恐成瞎子

从 windows 2000 到 windows 10 的最新版本, 所有操作系统的 PsSetLoadImageNotifyRoutine 中都发现了 Microsoft 内核漏洞.漏洞存在于 Microsoft 提供给安全供应商的 API 中, 是为了让他们知道操作系统正在加载的文件,如果这个API出现问题,防病毒软件就成了瞎子. 问题出在Windows回调机制PsSetLoadImageNotifyRoutine Microsoft 在 Windows 2000 中启动了 PsSetLoa

微软将解决Windows内核漏洞

微软工程师已经确定 新的Windows内核零日漏洞对用户产生的威胁很小.安全研究公司VUPEN在上周发布了一个关于Windows内核漏洞的安全咨文,并警告说该漏洞可被攻击者用来崩溃系统,或获得更高的权限.该漏洞影响Windows XP.Windows Vista.Windows 7.Windows Server 2008和2003.微软响应通信小组经理Jerry Bryant在微软安全响应中心博客中说,"该漏洞造成的风险不大." 据Bryant所说,微软工程师已经确定该漏洞只能在本地被

微软正在调查微软Windows内核曝漏洞

6月8日消息,据国外媒体报道,微软星期五称,它将对Windows中的一个没有修复的安全漏洞展开调查.此前,以色列的一位安全研究人员披露了Windows操作系统内核驱动程序中的一个安全漏洞. 据在以色列特拉维夫的安全研究人员Gil Dabah称,Windows内核存在一个堆溢出安全漏洞.他在自己与其他两个人共同经营的RageStorm.com网站上发表了一个简短的概念证明代码,演示了这个安全漏洞. 微软的Jerry Bryant说,微软正在对Windows内核中存在安全漏洞的报告展开调查.在完成调

linux内核符号表kallsyms简介

在使用perf排查问题时,我们经常会发现[kernel.kallsyms]这个模块.这到底是个什么东西呢? 简介: 在2.6版的内核中,为了更方便的调试内核代码,开发者考虑将内核代码中所有函数以及所有非栈变量的地址抽取出来,形成是一个简单的数据块(data blob:符号和地址对应),并将此链接进 vmlinux 中去. 在需要的时候,内核就可以将符号地址信息以及符号名称都显示出来,方便开发者对内核代码的调试.完成这一地址抽取+数据快组织封装功能的相关子系统就称之为 kallsyms. 反之,如