REA 据说已经禁用,这是几天前自己尝鲜 Claude Code + REA 做的事情,写个文章记录下。
一个 3MB 的 exe 能告诉我们什么
手上有一个 2006 年的老游戏主程序 Raiden3.exe(街机射击游戏《雷电 III》的 PC 移植版),3.2 MB,32 位原生 PE。这次不运行它、不上调试器,只用纯静态手段——PE 头解析加字符串提取——看看能挖出多少东西。
结论先说:即使是被商业保护壳加密的程序,光看穿外衣也足以还原出它的身份、技术栈和功能边界。
第一步:PE 头里的身份证
PE 头是信息量最大的免费午餐。这个文件的头部字段直接给出了:
| 项目 | 值 |
|---|---|
| 文件大小 | 3,252,208 字节 |
| 格式 | PE32,Intel x86(32 位),Windows GUI 子系统 |
| 编译时间戳 | 2006-02-08 |
| 链接器版本 | 7.10(对应 MSVC++ 7.1 / Visual Studio .NET 2003) |
| 托管代码 | 否,原生 PE |
链接器版本 7.10 是个很有年代感的信号——VS .NET 2003 时代的工具链,和 2006 年初的编译时间戳完全吻合。
再看二进制里的明文字符串:COPYRIGHT(C) 2005-2006 MOSS LTD ALL RIGHTS RESERVED.,资源语言代码 1041(日语),内嵌资源文件名清一色是 RAIDEN*.MMO、TITLE*.DDS、BGM*.WAV。身份基本坐实:日本 MOSS 株式会社开发的《雷电 III》,编译时间与 PC 版发售期(2006 年)吻合。发行商是谁二进制里没有直接证据,属于推断,不硬下结论。
第二步:段表暴露了保护壳
真正有意思的是段表。除了标准段之外,出现了两个非标准段:stxt774 和 stxt371,权限都是可执行 + 可读 + 可写三件套全开。
更关键的是:入口点 RVA 0x3E609E 落在 stxt371 里,而不是正常的 .text 段。
配合另一个异常——导入表小得离谱,只有 9 个 DLL——结论很清晰:这个 exe 被商业保护壳加密了。stxt* 段名组合是这类保护器的典型签名,那个年代日版 PC 游戏常用 StarForce 一类的保护方案。
这意味着什么?真实的游戏代码运行时才解密展开,静态能看到的只是壳的装载器。壳内的关卡逻辑、弹幕系统、碰撞检测,静态分析够不着,这是本次分析的硬边界。
第三步:导入表画出功能边界
虽然只有壳的导入表,但 9 个 DLL 依然说出了技术栈:
| 类别 | DLL | 用途 |
|---|---|---|
| 图形 | D3D9 | Direct3D 9 渲染 |
| 音频 | DSOUND、WINMM | DirectSound 音频输出、多媒体定时 |
| 输入 | DINPUT | DirectInput(手柄/键盘) |
| 系统 | KERNEL32、USER32、GDI32、ADVAPI32、VERSION | 基础 Win32 API |
最有价值的发现是缺失的东西:没有任何网络相关导入——没有 WSOCK32、没有 WS2_32、没有 WININET。这是一个纯单机游戏,不具备联网功能。看到”私服”之类的说法时,至少可以确认与本程序本体无关。
第四步:字符串里的渲染细节
字符串提取继续给料。二进制里躺着一串 D3D9 时代的关键词:
D3DX9 Shader Assembler、D3DX9 Shader CompilerPIXELSHADER、VERTEXBLEND、FOGVERTEXMODE- HLSL 编译器的错误信息文本
说明游戏用的是 Direct3D 9 可编程管线(顶点着色器 + 像素着色器),靠 D3DX 工具库在运行时汇编/编译着色器——2006 年 PC 游戏的标准姿势。
还有 GeForce MODE、DISPLAY MODE 这样的字符串,说明设置菜单里有针对 NVIDIA GeForce 显卡的显示模式选项。
第五步:资源命名体系还原数据结构
内嵌资源文件的引用呈现出一套清晰的命名体系,即使不解密也能看出数据组织方式:
- 纹理:
*.DDS(DirectX 标准纹理),如BG00.DDS、TITLE0.DDS。 - 模型/动画:
*.MMO、*.MMS(推断为 MOSS 私有格式),按关卡分层:BG01_LAYER01.MMO~BG01_LAYER10.MMO,玩家机体动画帧如RAIDEN01_F_MV0.MMS。 - 数据:
*.BIN,如FONT.BIN(字体)、PLAYER.BIN(玩家数据)、MATCHLESS.BIN。 - 音乐:
BGM01.WAV~BGM18KO.WAV,PCM WAV,部分带S/KO后缀变体,推断是音轨替换或编曲版本。
PE 资源节本身只有个 32x32 的游戏图标,没有 VERSIONINFO,也没有 manifest(没声明 UAC 权限级别——2006 年还没有 UAC 这回事)。
一个意外收获:街机血统的证据
字符串里藏着这么一条:
1 | Apassword checksum error <score:%d,name:%s,round:%d,mode:%d,rate:%d pass:%s> |
这说明 PC 版完整保留了街机版的分数排行榜密码系统——当年官方排行活动用的分数密码校验机制。一个字符串,直接把这款游戏的街机血统钉死了。
另外字符串里有 .NET Runtime 相关报错文本,但前面已经确认程序是非托管原生 PE——这是静态链接 CRT 运行时模板自带的文本,不代表程序依赖 .NET。静态分析里这种”假信号”很常见,得结合 PE 头交叉验证。
本次分析的边界
诚实交代没做到的部分:
- 壳内真实代码未展开,游戏主逻辑(关卡、弹幕、碰撞)未分析——要做就得运行时脱壳或上 Ghidra/IDA。
.MMO/.MMS私有格式的具体结构未解析。- 发行商身份只是推断,没有 VERSIONINFO 直接证实。
收个尾
纯静态分析的天花板很明显:遇到壳就止步于壳。但即便这样,PE 头 + 段表 + 导入表 + 字符串这四板斧下来,目标程序的身份(MOSS《雷电 III》2006 PC 版)、工具链(VS .NET 2003)、技术栈(D3D9 + DirectSound + DirectInput)、功能边界(纯单机无网络)、数据组织(DDS/MMO/MMS/WAV)全部清晰可见,还顺带挖出了街机分数密码这种彩蛋级的细节。