场景:微信小游戏采用 Unity 导出(WebGL/小游戏适配),核心逻辑在 WASM + metadata 中。目标是最大化恢复 C# 结构与函数名,辅助阅读与静态/动态分析。
- 解包结果中存在以下文件通常意味着Unity WebGL/小游戏导出:
*.wasm.code.unityweb(WASM 主体)*.wasm.framework.unityweb(运行时/插件)*.data.unityweb(资源/内存映像)- 对应的
*.json配置
- 目录下还可能出现引擎适配/加载脚本(适配到微信小游戏 API 的封装)。
这些
.unityweb文件是 Brotli 压缩,需解压得到.wasm和关联文件才能进入逆向。
# 安装 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(在缓存/运行目录/模拟器中)
./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 支持插件/处理器)。
- Ghidra:导入
Game.wasm→ 运行ghidra_wasm.py(或手动导入script.json)→ 刷新函数列表与反编译视图; - IDA:导入 WASM(二进制支持视版本/插件)→ 运行
ida.py应用符号与结构。
应用符号后,原本
sub_xxx/jxxxx的函数会被替换为含类名/方法签名的可读名称,大幅提升分析效率。
Unity 导出的小游戏通常仍有少量 JS:如加载器、平台适配、资源定位与版本校验等。建议:
- 阅读
game.js/ 入口加载脚本,理解资源加载与初始化流程; - 识别是否存在 引擎插件/适配库(例如
weapp-adapter)以及小游戏平台特有 API 的封装。
- 某些项目会对
global-metadata.dat做简单混淆/加密或内嵌,需要从运行时定位/解密; - WebGL/WASM 的链接方式会影响函数索引/重定位,务必使用
ghidra_wasm.py与配套插件; - DummyDll 仅提供结构与签名(不包含方法体 C# 代码),需结合反编译器与静态分析做进一步推断。