0%

静态逆向实战:不运行一步,看穿《雷电 III》PC 版的底细

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 Compiler
  • PIXELSHADER、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 头交叉验证。

本次分析的边界

诚实交代没做到的部分:

  1. 壳内真实代码未展开,游戏主逻辑(关卡、弹幕、碰撞)未分析——要做就得运行时脱壳或上 Ghidra/IDA。
  2. .MMO/.MMS 私有格式的具体结构未解析。
  3. 发行商身份只是推断,没有 VERSIONINFO 直接证实。

收个尾

纯静态分析的天花板很明显:遇到壳就止步于壳。但即便这样,PE 头 + 段表 + 导入表 + 字符串这四板斧下来,目标程序的身份(MOSS《雷电 III》2006 PC 版)、工具链(VS .NET 2003)、技术栈(D3D9 + DirectSound + DirectInput)、功能边界(纯单机无网络)、数据组织(DDS/MMO/MMS/WAV)全部清晰可见,还顺带挖出了街机分数密码这种彩蛋级的细节。