Unity IL2CPP逆向:Il2CppDumper还原方法名到Frida hook
Unity 游戏用 IL2CPP 编译后,C# 代码被转成 C++ 再编译成 native 二进制。逆向时看不到 C# 源码,只能看 ARM 汇编。这篇讲怎么还原。一、IL2CPP 原理
Unity 编译流程:C# → IL (中间语言) → C++ 代码 → native binary (ARM64)。同时生成 global-metadata.dat 文件,包含所有类名、方法名、字段名的字符串。native 二进制里只有地址,需要从 metadata 里还原名字。
二、Il2CppDumper
GitHub 上的 Il2CppDumper 工具,输入二进制和 metadata 文件,输出:
[*]dump.cs:还原的 C# 伪代码,包含类名方法名字段名
[*]script.json:方法地址到方法名的映射表
[*]ida.py/script.py:IDA/Ghidra 脚本,自动重命名函数
用法:
Il2CppDumper.exe game_binary.so global-metadata.dat output_dir/
三、IDA 中还原
# 在 IDA Python 控制台运行
import json
mapping = json.load(open("script.json"))
for entry in mapping["ScriptString"]:
ida_name.set_name(entry["Address"], entry["Value"], ida_name.SN_NOWARN)
# 或者直接运行 script.py
还原后 IDA 里的函数名从 sub_12345 变成 PlayerController_UpdateHealth,可读性大幅提升。
四、Frida hook IL2CPP 方法
// 通过 script.json 找到方法地址
var addr = ptr("0x1234567"); // PlayerController.UpdateHealth
Interceptor.attach(addr, {
onEnter: function(args) {
console.log("UpdateHealth called");
// args = this (PlayerController实例)
// args = 第一个参数
},
onLeave: function(retval) {
console.log("UpdateHealth returned: " + retval);
}
});
五、常见问题
[*]IL2CPP 版本不同,metadata 格式可能变化。用对应版本的 Il2CppDumper
[*]有些游戏加密了 metadata 文件。需要先脱壳解密
[*]inline 模式编译的 IL2CPP 方法可能被内联,找不到独立函数地址
https://www.metk.cn/img/posts/unity_il2cpp.jpg 发发呆,回回帖,工作结束~ 现在很多方案开始用双端校验,单点突破越来越难。 遇到卡住的地方,换个思路往往比死磕更快。 版本迭代之后要重新分析,这部分工作很难复用。 App 侧的安全基本靠客户端自觉,服务端校验才是最后一道。 多平台的支持是个大工程,工作量远超预期。 反调试这块的坑最多,建议先把常见检测点列一遍。 实际项目里最实用的往往是最朴素的抓包手段。 这类校验现在很多是服务端下发的,光改本地没用。