依照这个前提,我们在 APKMirror 里下载了一个 1.8.4 远古版,提取文件再次喂给 IL2CppDumper,成功跑出分析文件。
用 IDA 打开 libil2cpp.so,等分析完之后点击 File – Script File...,选择 IL2CppDumper 里的 ida_py3.py ,选择分析出的 stringliteral.json。
等脚本跑完再次执行脚本,这次选择 ida_with_struct_py3.py,选择分析出的 script.json 和 il2cpp.h,脚本运行时间比较长,让 IDA 先在后台跑。
用文本编辑器打开 stringliteral.json,搜索文件名 game.data,复制 address 中的地址。

等 IDA 跑完脚本,找到 IDA View 窗口,按 G 键,粘贴刚才复制的地址,点击 OK 跳转。

右键这个字符串的名字,点击 List cross references to… 来列出字符串的交叉引用。

我们需要知道的是,IL2Cpp 后的方法名是 Package.Class$$Method,在伪代码中,. 和 $ 都会显示成 _,例如 System.String.Contact() -> System.String$$Contact() -> System_String__Contact(),了解这个规律会对我们之后的代码分析有帮助。
交叉引用中有一个 RGSaveManager.get_Path,直觉告诉我们这个就是读取存档的方法,跳转过去按 F5 查看伪代码。

右键方法名,选择 Jump to xref…。

- 确认函数实际位置
首先需要确认这是真正的函数入口点还是只是一个符号引用:
; 按 F5 尝试反编译(如果 IDA 识别为函数)
; 或按 C 键将数据转换为代码
- 查找交叉引用
使用快捷键 X 查看对该地址的交叉引用,这可以帮助你找到实际调用该函数的地方:
; 查看哪些代码调用了 LoadLevel
; 这可能会带你到实际的函数实现
- 搜索函数体
如果当前地址不是函数开始处,可以搜索函数前缀字节:
; 在二进制中搜索常见的函数开头模式
; 例如 ARM64 架构可能以 STP X29, X30, [SP, #-0x10]! 开头
- 使用 IL2CPP 元数据(如果是 Unity 游戏)
对于 Unity IL2CPP 编译的游戏:
// 如果有 global-metadata.dat 文件,可以使用 Il2CppDumper
// 来获取准确的函数地址和符号信息
- 手动分析函数
如果找到了函数开头,可以:
按 P 键创建函数
使用 F5 查看伪代码
分析函数逻辑
- 示例分析
假设你找到了真正的函数开始处:
ROM:0000000000D85690 PlayerData.LevelDataSystem$$LoadLevel
ROM:0000000000D85690 STP X29, X30, [SP, #-0x10]!
ROM:0000000000D85694 MOV X29, SP
ROM:0000000000D85698 LDR X0, [X0, #0x10]
; ... 更多指令
建议
确认游戏架构(ARM, x86, etc.)
查看字符串引用,可能找到相关线索
使用 IDA 的函数识别功能(Create function)
如果有符号信息,确保已正确加载
如果提供更多上下文(如游戏平台、架构),我可以给出更具体的分析建议。