/ Debug,Windows / 109浏览

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

背景

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

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

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

获取 WRK

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

这里,你可以直接拉取仓库,找到 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. 将系统关闭。进入到虚拟机配置页面。增加一个串口。
  1. 配置串口,使用 named pipe,并命名为【\\.\pipe\com_1
  1. 然后再开机,选择【WRK Mode】,即可进入 WRK 内核驱动的系统了。

通过 Windbg 来调试

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

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

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

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

如何通过 C++ 实时监听 ETW 事件
如何通过 C++ 实时监听 ETW 事件
【译】调查并确定 Windows 运行速度变慢问题
【译】调查并确定 Windows 运行速度变慢问题
【译】丢失的 WPA 文档 —— 磁盘使用
【译】丢失的 WPA 文档 —— 磁盘使用
【译】丢失的 WPA 文档 —— CPU 调度
【译】丢失的 WPA 文档 —— CPU 调度
【译】丢失的 WPA 文档 —— CPU 采样
【译】丢失的 WPA 文档 —— CPU 采样
如何通过 PDH(Performance Data Helper) 获取性能计数器的值

0

  1. This post has no comment yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注