环境配置与工具安装

写在前面:本篇文章记录内核学习中环境的配置与工具的安装,主要涉及Win 2003虚拟机安装、WRK编译执行、各种分析工具的安装。

win sever2003安装

选择使用VMWare安装Windows Server 2003作为基本实验环境,参考如下(含系统镜像):

[Windows Server 2003 安装教程 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/475627925#:~:text=1、打开VMware Workstation虚拟机选择CD%2FDVD选项。 2、选择使用ISO映像文件,点击浏览选择Windows Server,2003 镜像。 3、确定使用镜像后点击开启虚拟机。 4、进入到安装界面后稍等系统加载。 5、按回车键进入安装。)

WRK介绍与编译执行

参考【精选】Windows 内核(WRK)编译-CSDN博客

什么是WRK

WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码WRK(Windows Research Kernel)也就是 Windows 研究内核。

Windows Research Kernel(WRK)是一个微软公司开发的用于研究和学术目的的操作系统内核。它是Windows操作系统的一个分支,旨在提供一个可用于实验和深入研究的内核代码库。

在 WRK 中不仅仅只提供了 Windows 内核模块的部分代码,其还提供了编译工具,也就是通过这个编译工具,你可以将 WRK 编译成一个 EXE 文件,也就是内核可执行模块,然后你可以利用这个 EXE 文件来取代操作系统本身的内核,这样的话,下次开机的时候操作系统所加载的内核就是您编译的那个 EXE 了。

下载地址:链接:https://pan.baidu.com/s/1B7AcR-Nwt5Fjl3dxgY7nFQ 提取码:xhxh

:我在github上找了好多wrk资源,但是都在编译时出错了。所以现在上传一个可以成功编译的资源。(笔者编译环境:win11,2023-11-10)

目录概述

在看WRK的目录之前,可以先去自己的主机上找一个文件:ntoskrnl.exe,这是一个内核模块文件,可以看做是 Windows 的内核,由执行体和微内核组成。我们的 WRK 编译后所得的结果应该也是一个内核模块文件,编译后的名称为wrkx86.exe

image-20231109105102577

WRK项目的目录内容如下:

image-20231109105948788

WS03SP1HALS目录:

WS03SP1HALS代表的意思即 Windows Server 2003 SP1 HALS,也就是在 Windows Server 2003 SP1 下的 HAL(硬件抽象层)

通过 HAL 可以实现隔离掉硬件的差异,也就是上层的模块无需考虑下层真实硬件之间的差异性,因为上层模块不能够直接访问硬件,而是通过 HAL 来访问硬件的,所以对于硬件的差异性,在 HAL 中即可以解决掉,而不需要上层模块来解决。

只要提供针对不同的硬件的 HAL 即可以实现在不同的硬件上运转我们的上层模块。可以简单的将HAL 看作是DLL。

当系统安装时会根据实际环境选择适配的HAL,并改名为hal.dll,这个文件也在系统目录下,如图:

image-20231109110644024

PUBLIC目录

该目录下包含了公共的接口和头文件,用于与WRK内核进行交互和开发。


Base目录

其中的ntos目录是内核模块的主目录,包含以下子目录:

  • 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:驱动程序检验器。


Tools目录:

存放一些源码编译工具,后续编译WRK就会使用这里的工具。

WRK编译

先将tools下的x86目录写入环境变量:

image-20231109112451891

base\ntos目录下打开终端,执行:nmake -nologo x86=

image-20231110104940125

最后在base\ntos\BUILD\EXE目录下看到编译后的文件:wrkx86.exe,这就是到 WRK 的内核可执行模块。

image-20231110105102220

WRK启动

得到 WRK 的内核可执行模块以后,可以在一台安装 了 Windows Server 2003 SP1(x86)Windows XP Professional(AMD64)的机器上启动 WRK。

第一步已经安装完毕虚拟机,进行后续操作。


首先将wrkx86.exe文件复制到windows\system32目录之下。

打开c:\windows\repair\setup.log 文件,然后搜索Hal.dll,获取HAL类型。将WS03SP1HALS\x86\halmacpi 目录中将halmacpi.dll 文件复制到 WINDOWS\system32目录下。

通过工具->文件夹选项->查看,取消隐藏受保护的操作系统文件

image-20231110145731900

打开虚拟机系统的c盘下的boot.ini文件,记得取消只读,然后修改如下:在最后添加下述内容然后重新启动即可。

1
2
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WRK V1.2" /kernel=wrkx86.exe /hal=halmacpi.dll
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WRK V1.2" /kernel=wrkx86.exe /hal=halmacpi.dll /debug /debugport=com1 /baudrate=115200

img

使用WINVER查看版本:

image-20231110151505255

WRK调试

调试内核使用的调试器时windbg,一般配置有如下三种模式,其中第一种模式是在系统内部启动windbg,这种方式无法完全调试一个系统;第二种模式是使用两台物理主机,可以全面发挥windbg的调试能力,但是比较复杂;所以我们选择第三种模式,即物理主机运行windbg,通过命名管道的方式调试虚拟环境WRK。

image-20231110154331052

还记得前面配置boot.ini时添加的语句吗,其中一条是:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WRK V1.2" /kernel=wrkx86.exe /hal=halmacpi.dll /debug /debugport=com2 /baudrate=115200

这句指令是:指定了在虚拟机中以调试模式引导 WRK 内核,并且还指定了引导参数“/debug /debugport=com1”,这说明一旦选择了此引导选项,内核模式的调试功能将被打开,并且允许远程内核调试器连接到 COM1 端口上

具体配置:在VMWare界面修改虚拟机设置,添加一个串行端口并命名管道。这样宿主系统中的 windbg 可以通过命名管道连接到该 WRK 虚拟机的内核调试组件。

image-20231110165920120

安装Windbg自行安装

配置符号路径:通过文件->setting配置symbol path,为C:\Symbols; SRV\*C:\mysymbols\*http://msdl.microsoft.com/download/symbols,同时把wrkx86.pdb,halmacpi.pdb符号文件放到笔记本中C:\Symbols目录下。

image-20231110172717930

配置管道连接:通过文件->Attach to kernel配置下图选项

image-20231110173030930

开始连接:先运行虚拟机,在点击OK,即可得到下图

image-20231110172548632

到这里环境配置就基本over了,后续具体调试见其他博客。

WRK相关工具

除了要适用windbg这个内核调试器之外,还要用到以下工具:

  • ProcMon:进程和线程监视工具。老熟人了,在恶意代码分析中很常用,可以查看当前系统正在执行哪些进程线程,也可以自己过滤具体选项。在第三章Windows进程与线程会具体介绍

  • MemMon:内存监视工具,查看系统内存空间和每一个进程的用户空间的内存布局。在第四章内存管理会具体介绍。

  • DPerLite:一个揭示线程间同步关系的工具,可以在一个图形化界面观察这些与同步相关的内核操作。在第五章Windows并发与同步会介绍。

  • IRPMon:IRP完成情况的监视工具,在内核中记录下每一个IO请求的完成操作,以列表形式查看。在第六章WindowsIO请求会具体介绍。

  • SdtViewer:SDT(Servce Description Table,服务描述符表),工具会访问系统的服务描述符表(SDT)数组,并解析系统SDT中的系统服务项。在第八章windows系统服务会具体介绍。

  • KInjectToolKit:一个学生项目,提供了一种不同于设备驱动程序的内核代码注入方案。

写在最后:前文介绍了WRK的编译、执行与windbg这个重要工具的配置与启动。现在万事俱备,只欠东风,开始进入神秘而又朴素的内核世界吧。