如何通过 WRK 来调试/学习 Windows
背景
目前我们学习 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 来进行配置(如果使用的是仓库中带的镜像,则无需配置此步骤)。
将生成的
wrkx86.exe
拷贝到 Win2k3 的C:\\WINDOWS\\SYSTEM32
目录拷贝
src/WS03SP1HALS/x86/halmacpi/halmacpi.dll
到C:\\WINDOWS\\SYSTEM32
目录修改
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
将系统关闭。进入到虚拟机配置页面。增加一个串口。
配置串口,使用 named pipe,并命名为【\.\pipe\com_1】
然后再开机,选择【WRK Mode】,即可进入 WRK 内核驱动的系统了。
通过 Windbg 来调试
通过 Windbg → File → Attach Kernel,根据上述配置的值来填写即可。
开启虚拟机,选择 WRK 之后,即可连接上:
然后通过添加我们的 pdb 和源代码,接口进行调试了。
注意:如果是重新编译了 wrkx86.exe,则需要切换到 Windows Server 2003 下更新 wrkx86.exe,才能匹配上 pdb