如何通过 WRK 来调试/学习 Windows

·

1 min read

背景

目前我们学习 Windows 内核细节,主要可以参考 ReactOS 和 WRK(Windows Research Kernel)。

前者是一个兼容 WinNT 内核的开源系统;后者 WRK 则是微软基于 Win2K3 开源出来的内核。

ReactOS 的源码调试可以参考文档。而 WRK 的源代码调试信息有点乱,这里统一整理下。

获取 WRK

这里整理了一个仓库,包含了代码、VMware 虚拟机和 WRK 随附的 NT 设计文档:

https://github.com/frendguo/WRK

这里,你可以直接拉取仓库,找到 images/vmware 打开,就是一个可选 WRK 的 Windows 2003 系统了,然后通过 Windbg 连接上,即可调试(可直接跳过中间配置环节)

当然,你也可以自己下载 win2k3 然后跟着文档一同来配置。

编译代码

方式一

WRK 中本身提供了 build.bat 的脚本,直接运行 src/Build.bat 即可完成编译

生成物在:src\\base\\ntos\\BUILD\\EXE

主要是 wrkx86.exe ,也就是 Windows 内核。约等于 ntoskrnl.exe

方式二

我们通常会在 VS 中修改代码,所以这里介绍下如何在 VS 中编译代码。

本文以最新的 VS2022 为例。

打开 src/WRK.sln ,配置一下架构:

然后直接编译即可。

生成物在:src\\base\\ntos\\BUILD\\EXE

配置 Win2k3

基于全新安装的 Win2k3 来进行配置(如果使用的是仓库中带的镜像,则无需配置此步骤)。

  1. 将生成的 wrkx86.exe 拷贝到 Win2k3 的 C:\\WINDOWS\\SYSTEM32 目录

  2. 拷贝 src/WS03SP1HALS/x86/halmacpi/halmacpi.dllC:\\WINDOWS\\SYSTEM32 目录

  3. 修改 C:\\boot.ini 文件,在文件末追加以下内容(增加一个启动项,启用 wrkx86.exe 作为内核,并开启 COM 调试模式):

multi(0)disk(0)rdisk(0)partition(1)\\WINDOWS="WRK Mode" /noexecute=optout /fastdetect /kernel=wrkx86.exe /hal=halmacpi.dll /debugport=com /baudrate=115200
  1. 将系统关闭。进入到虚拟机配置页面。增加一个串口。

  2. 配置串口,使用 named pipe,并命名为【\.\pipe\com_1

  3. 然后再开机,选择【WRK Mode】,即可进入 WRK 内核驱动的系统了。

通过 Windbg 来调试

通过 Windbg → File → Attach Kernel,根据上述配置的值来填写即可。

开启虚拟机,选择 WRK 之后,即可连接上:

然后通过添加我们的 pdb 和源代码,接口进行调试了。

注意:如果是重新编译了 wrkx86.exe,则需要切换到 Windows Server 2003 下更新 wrkx86.exe,才能匹配上 pdb