咨询发布 发表于 2026-9-14 00:22:48

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

发表于 2026-9-17 18:32:56

发发呆,回回帖,工作结束~

浅夏小筑 发表于 2026-9-17 18:42:37

现在很多方案开始用双端校验,单点突破越来越难。

归鸟寻梅 发表于 2026-9-17 18:52:04

遇到卡住的地方,换个思路往往比死磕更快。

沉默 发表于 2026-9-17 18:59:19

版本迭代之后要重新分析,这部分工作很难复用。

长夏旧巷 发表于 2026-9-17 19:09:22

App 侧的安全基本靠客户端自觉,服务端校验才是最后一道。

夜雨记事 发表于 2026-9-17 19:14:39

多平台的支持是个大工程,工作量远超预期。

北岛 发表于 2026-9-17 19:25:00

反调试这块的坑最多,建议先把常见检测点列一遍。

孤舟记事 发表于 2026-9-17 19:32:29

实际项目里最实用的往往是最朴素的抓包手段。

野渡的猫 发表于 2026-9-17 19:38:13

这类校验现在很多是服务端下发的,光改本地没用。
页: [1] 2 3
查看完整版本: Unity IL2CPP逆向:Il2CppDumper还原方法名到Frida hook