Skip to content

Latest commit

 

History

History
73 lines (48 loc) · 2.66 KB

File metadata and controls

73 lines (48 loc) · 2.66 KB

Unity/IL2CPP(WASM)完整还原流水线

场景:微信小游戏采用 Unity 导出(WebGL/小游戏适配),核心逻辑在 WASM + metadata 中。目标是最大化恢复 C# 结构与函数名,辅助阅读与静态/动态分析。


1. 识别 Unity/IL2CPP 产物

  • 解包结果中存在以下文件通常意味着Unity WebGL/小游戏导出
    • *.wasm.code.unityweb(WASM 主体)
    • *.wasm.framework.unityweb(运行时/插件)
    • *.data.unityweb(资源/内存映像)
    • 对应的 *.json 配置
  • 目录下还可能出现引擎适配/加载脚本(适配到微信小游戏 API 的封装)。

这些 .unityweb 文件是 Brotli 压缩,需解压得到 .wasm 和关联文件才能进入逆向。


2. 解压与准备

# 安装 brotli(macOS)
brew install brotli

# 解压 *.unityweb
brotli -d Game.wasm.code.unityweb -o Game.wasm
brotli -d Game.wasm.framework.unityweb -o Game.wasm.framework
# 如有 *.data.unityweb 同理

确认并收集:

  • Game.wasm(或类似命名的 wasm 主体)
  • global-metadata.dat(在缓存/运行目录/模拟器中)

3. Il2CppDumper 导出

./Il2CppDumper Game.wasm global-metadata.dat ./out
# 关键产物:DummyDll/, script.json, ghidra_wasm.py, ida.py 等
  • DummyDll/ 可用 ILSpy/dnSpyEx 查看,近似还原 C# 类/方法签名;
  • script.json + ghidra_wasm.py 用于在 Ghidra 中恢复符号/函数名;
  • 若需 IDA,可使用 ida.py(注意 WASM 支持插件/处理器)。

4. Ghidra/IDA 应用符号

  • Ghidra:导入 Game.wasm → 运行 ghidra_wasm.py(或手动导入 script.json)→ 刷新函数列表与反编译视图;
  • IDA:导入 WASM(二进制支持视版本/插件)→ 运行 ida.py 应用符号与结构。

应用符号后,原本 sub_xxx/jxxxx 的函数会被替换为含类名/方法签名的可读名称,大幅提升分析效率。


5. 与 JS 层的衔接

Unity 导出的小游戏通常仍有少量 JS:如加载器、平台适配、资源定位与版本校验等。建议:

  • 阅读 game.js / 入口加载脚本,理解资源加载与初始化流程;
  • 识别是否存在 引擎插件/适配库(例如 weapp-adapter)以及小游戏平台特有 API 的封装。

6. 注意事项

  • 某些项目会对 global-metadata.dat简单混淆/加密或内嵌,需要从运行时定位/解密;
  • WebGL/WASM 的链接方式会影响函数索引/重定位,务必使用 ghidra_wasm.py 与配套插件;
  • DummyDll 仅提供结构与签名(不包含方法体 C# 代码),需结合反编译器与静态分析做进一步推断。