如何定位插件所需的 START_RVA 地址

如何定位插件所需的 START_RVA 地址

在 Unity IL2CPP 游戏的插件开发中,START_RVA 是符号表起始的相对虚拟地址(RVA),用于解析 IL2CPP 函数和符号。本文详细介绍如何获取这个关键地址,帮助你开发有效的插件。

什么是 START_RVA

START_RVA 是 IL2CPP 二进制文件中符号表的起始 RVA 偏移。它允许开发者定位和调用 IL2CPP API 函数,如 il2cpp_initil2cpp_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 函数

使用 IDA Pro 打开 UnityPlayer.dll

等待加载完毕后,在左侧 Functions 窗口过滤找到 Loadil2Cpp。

找到 il2cpp_init,这部分相当于:

1
2
void* addr = LookupSymbol(module, "dc1f72af605f19e6b916349", 1);
il2cpp_init = addr;

将函数返回值(函数地址)保存为全局变量 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 可能不同,建议验证后使用。