如何定位插件所需的 START_RVA 地址
如何定位插件所需的 START_RVA 地址
在 Unity IL2CPP 游戏的插件开发中,START_RVA 是符号表起始的相对虚拟地址(RVA),用于解析 IL2CPP 函数和符号。本文详细介绍如何获取这个关键地址,帮助你开发有效的插件。
什么是 START_RVA
START_RVA 是 IL2CPP 二进制文件中符号表的起始 RVA 偏移。它允许开发者定位和调用 IL2CPP API 函数,如 il2cpp_init
、il2cpp_class_from_name
等。在插件开发中,准确获取 START_RVA 是绕过混淆和定位函数的基础。
获取 PDB 文件
为了解析 UnityPlayer.dll,需要下载对应的 PDB 符号文件。
安装 Windows SDK
前往微软官方下载页面:
🔗 https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/
下载 Windows 10 SDK 或 Windows 11 SDK 安装包。
在安装选项中,仅勾选「Debugging Tools for Windows」。
设置符号路径环境变量
1 | set _NT_SYMBOL_PATH=srv*C:\Symbols*http://symbolserver.unity3d.com |
使用 cdb 打开目标 DLL
1 | "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -z "E:\Documents\umamusume\UnityPlayer.dll" |
输入:
1 | .reload /f |
这将下载并加载 PDB 文件,允许你查看函数名和符号。
分析 DLL 文件
步骤1: 加载到 IDA Pro 或 Ghidra
- 使用 IDA Pro 或 Ghidra 打开 UnityPlayer.dll。
步骤2: 定位 LoadIl2cpp 函数
- 在符号视图中搜索 “LoadIl2cpp”。
- 如果 PDB 加载成功,可以直接跳转到函数。
- 参考教程:https://katyscode.wordpress.com/2021/02/23/il2cpp-finding-obfuscated-global-metadata/
使用 IDA Pro 打开 UnityPlayer.dll
等待加载完毕后,在左侧 Functions 窗口过滤找到 Loadil2Cpp。
找到 il2cpp_init,这部分相当于:
1 | void* addr = LookupSymbol(module, "dc1f72af605f19e6b916349", 1); |
将函数返回值(函数地址)保存为全局变量 il2cpp_init。
右键选择 TextView,选中图中的 “dcf172af605f19e6b916349”,切换到 hex 视图。
取它的后四个字节,就是字符串的地址。
这里减去 180000000 的 ImageBase,拿到的就是0x782c92。
工具和脚本推荐
- IDA Pro / Ghidra: 反汇编和分析二进制文件。
- cdb / windbg: 下载和加载 PDB 符号。
- Python pefile: 解析 PE 文件头和 RVA。
- 自定义脚本: 遍历符号表,验证 RVA。
结论
获取 START_RVA 需要结合符号调试和逆向工程。通过 PDB 文件和调试工具,你可以准确定位 IL2CPP 符号表,为插件开发奠定基础。注意,不同 Unity 版本的 RVA 可能不同,建议验证后使用。