Heretek-RE/re-il2cpp

GitHub: Heretek-RE/re-il2cpp

读取 Unity IL2CPP 的 global-metadata.dat 文件并恢复被剥离的 C# 符号名称的 MCP 服务器,专为 AI 驱动的游戏逆向工程而设计。

Stars: 0 | Forks: 0

# re-il2cpp 一个读取 Unity IL2CPP `global-metadata.dat` 文件的 MCP 服务器,用于恢复被 IL2CPP 编译器从 `GameAssembly.dll` 中剥离的原始 C# 类、方法、字段和参数名称。用于驱动 Claude Code 对 Unity 游戏的逆向工程。 其格式是通过公开的 [Il2CppDumper](https://github.com/Perfare/Il2CppDumper) `MetadataLoader.cs` 逆向工程而来的。 ## 安装 ``` pip install -e ./servers/re-il2cpp[rva] # [rva] pulls in LIEF for resolve_method_rva ``` 如果没有 `[rva]` 扩展,表遍历器中的所有 12 个工具都能正常工作;只有 `resolve_method_rva` 需要 LIEF。仓库中的 `install.sh` 会自动调用带有 `[rva]` 的形式。 ## 功能说明 IL2CPP 将 Unity C# 项目编译为原生的 x86_64 / ARM64 代码。生成的 `GameAssembly.dll`(通常高达数百 MB)中的所有 C# 类名都被混淆清除了。但是,与其同处一个目录下且*未受保护*的 `global-metadata.dat`(通常为 5-15 MB)中,仍然以纯 UTF-8 字符串的形式保留着每一个原始的 C# 符号名。该服务器会读取该文件,并以 JSON 格式暴露类关系图。 ## 不支持的功能 - 不破解加密的 VM 字节码(任何商业版本)—— 请使用 `re-drm-fingerprint` 处理 `GameAssembly.dll`。 - 不恢复 C# 源代码——仅恢复类/方法/字段的名称。 方法主体位于 `GameAssembly.dll` 中,这是受加密 VM 字节码保护的 IL2CPP 运行时。 - 不解析 Unity 资源包(`level*`, `sharedassets*`)。 请使用 `re-format-decode` 处理它们。 - 不将方法和字段的 `return_type_index` / `type_index` 完全解析为 C# 类型名称。遍历器返回原始的类型索引;完整的名称解析需要从 GameAssembly.dll 中读取 `s_Il2CppMetadataRegistration::types[]`,这将在 v2.3.0 版本中跟进实现。 ## 支持的版本 Unity 2019.4 - 2022.3 LTS 系列(元数据标头版本 24, 25, 26, 27, 28, 29)。内置的测试目标(Unity 2020.3.15f2,标头 v27)是标准的集成测试样本。 ## 工具 ### 元数据标头 - `check_il2cpp(metadata_path)` —— 确认文件是否为真实的 `global-metadata.dat`,返回 Unity 版本、标头版本以及各表的计数。 ### 字符串表(快速枚举) - `list_strings(metadata_path, substring="", limit=500)` —— 从字符串表(未受保护的 C# 符号表)中返回字符串。 支持按子字符串过滤。 - `list_namespaces(metadata_path)` —— 返回从字符串表中类 FQN 提取出的、已排序的命名空间列表。 - `list_classes(metadata_path, namespace="", limit=500)` —— 返回类 FQN(可按命名空间过滤)。 - `search_strings(metadata_path, substring, limit=50)` —— 子字符串搜索;可用于在元数据中查找资源包路径、存档键(save keys)或特定的游戏术语。 ### 二进制表(结构化类图) - `get_type_definitions(metadata_path, namespace="", limit=500)` —— 遍历 `typeDefinitions` 表;返回每个类的父类、 方法/字段/属性/事件计数、类型索引和 token。 - `get_methods(metadata_path, class_fqn, limit=500)` —— 类的类型化方法,包含 token、参数计数、返回类型索引。 - `get_fields(metadata_path, class_fqn, limit=200)` —— 类的类型化字段,包含类型索引。 - `get_parameters(metadata_path, method_fqn, limit=50)` —— 方法的类型化参数,按声明顺序排列。 - `get_properties(metadata_path, class_fqn, limit=200)` —— 属性,包含 `has_getter` / `has_setter` 标志。 - `get_events(metadata_path, class_fqn, limit=200)` —— 事件,包含 `has_add` / `has_remove` / `has_raise` 标志。 - `get_images(metadata_path)` —— IL2CPP 映射(程序集)列表,包含类型范围和导出类型计数。 ### RVA 交叉引用(需执行 `pip install re-il2cpp[rva]`) - `resolve_method_rva(metadata_path, gameassembly_path, method_fqn)` —— 通过解析运行时注册结构,将 `Namespace.ClassName.MethodName` 解析为其 GameAssembly.dll 的 RVA。将返回的 `function_rva` 传给 `re-rizin.disassemble_function` 即可读取函数主体。对于被剥离的 GameAssembly.dll(发布的 Unity 游戏的默认配置),会返回结构化数据以及 IL2CPP 混淆名称,以便配合 `re-rizin.search_bytes` 使用。
标签:IL2CPP, MCP, Unity, 云资产清单, 元数据解析, 游戏安全, 逆向工具, 逆向工程