Unity IL2CPP 逆向实战:5 步把安装包还原成可读的 DLL 结构

📅 2026/8/21 16:47:31
Unity IL2CPP 逆向实战:5 步把安装包还原成可读的 DLL 结构
Unity IL2CPP 逆向实战5 步把安装包还原成可读的 DLL 结构【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper假设你刚接到一个 Unity 手游的逆向分析任务把 APK 拆开之后的第一反应往往是代码到底藏在哪这并非你不够熟练而是 IL2CPP 编译模式导致的必然结果——C# 源码早已被翻译成原生机器码类型信息也被单独抽离进元数据文件。好消息是借助 Il2CppDumper 这样的专用工具我们可以把两个二进制文件重新还原成可读的 DLL 结构再交给 dnSpy、IDA、Ghidra 接力分析让黑盒重新变得透明。一、先弄明白黑盒里装的到底是什么1. 一条代码的两次变形在常规 Mono 模式下Unity 游戏的 C# 代码会编译成托管 DLL比如大家熟悉的 Assembly-CSharp.dll解包后可以直接用反编译工具查看。但 IL2CPP 模式走的是另一条路第一次变形C# 源码先被编译成中间语言IL第二次变形IL 再被转译为 C 代码最终编译成各平台的原生二进制。结果就是安装包里再也找不到 Assembly-CSharp.dll取而代之的是二进制文件Android 上是libil2cpp.so用常规反编译工具打开只能看到密密麻麻的机器码。2. 打开黑盒的两把钥匙 ️IL2CPP 虽然把代码藏进了原生二进制但类型信息并没有被销毁而是集中存放在另一个文件里。想要还原结构必须同时拿到这两样东西文件位置以 Android APK 为例装了什么libil2cpp.solib/arm64-v8a/等架构目录所有方法编译后的原生指令global-metadata.datassets/bin/Data/类型、字段、方法签名、字符串字面量等元数据可以把libil2cpp.so理解为一本只有正文的书而global-metadata.dat是它的目录和索引。Il2CppDumper 的核心工作就是把两者对应起来重建出可读的类型结构。二、开工前的三件准备1. 工具清单 一套完整的 IL2CPP 逆向流程通常由多个工具配合完成新手不必一次配齐按需增补即可工具职责新手友好度Il2CppDumper解析二进制与元数据还原类型信息★★★★☆dnSpy浏览、搜索还原出的 DLL 类结构★★★★★IDA Pro原生指令反汇编、函数逻辑分析★★☆☆☆Ghidra开源反汇编与反编译适合大文件★★★☆☆x64dbg动态调试、运行时内存数据提取★★☆☆☆7-Zip 等解压工具解包 APK / IPA 等安装包★★★★★2. 获取 Il2CppDumper在准备环境时先通过以下命令把项目克隆到本地git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper3. 提前认识 config.jsonIl2CppDumper 的行为由运行目录下的config.json控制源码见Il2CppDumper/config.json。不必全记重点掌握这几个开关配置项作用GenerateDummyDll是否生成还原的 DLL 文件夹DummyDllAddToken是否在 DLL 中附加 token 信息配合 dnSpy 定位更准GenerateStruct是否生成il2cpp.h结构体头文件ForceIl2CppVersion/ForceVersion是否强制按指定 IL2CPP 版本解析二进制ForceDump是否强制把输入文件当作内存 dump 处理NoRedirectedPointer部分设备 dump 出的指针未重定向时设为trueRequireAnyKey程序结束后是否等待按键三、五步实操从 APK 到分析文件第 1 步解包 APK定位两个目标文件用 7-Zip 或命令行把 APK 解开APK 本质是 zip 包7z x game.apk -oextracted_apk解压后按前文表格的位置寻找两个文件顺便确认架构目录arm64-v8a、armeabi-v7a等它会决定你后续分析的是 64 位还是 32 位二进制。第 2 步把两个文件交给 Il2CppDumperIl2CppDumper 提供命令行和图形界面两种用法。命令行格式为Il2CppDumper.exe 可执行文件 global-metadata 输出目录即Il2CppDumper.exe libil2cpp.so global-metadata.dat output如果直接运行 exe则会依次弹出文件选择窗口按提示分别选中libil2cpp.so和global-metadata.dat即可。程序会先打印检测到的元数据版本与 IL2CPP 版本随后开始搜索并还原这部分逻辑在Il2CppDumper/Program.cs中入口很清晰感兴趣可以跟读一遍。第 3 步清点输出文件夹运行完成后输出目录里会出现一组文件各有用处DummyDll/还原出的 DLL 集合是后续分析的主力dump.cs类、字段、方法、偏移量等信息的文字清单il2cpp.h结构体头文件ida.py、ida_with_struct.py给 IDA 用的自动化脚本ghidra.py、ghidra_wasm.py给 Ghidra 用的脚本后者配合 wasm 插件使用script.json、stringliteral.json脚本地址数据与字符串字面量信息。第 4 步用 dnSpy 浏览类结构打开 dnSpy加载output/DummyDll文件夹下的 DLL即可在左侧导航树里按命名空间逐层浏览类、字段、方法签名。想快速定位某个逻辑比如玩家控制直接使用搜索功能输入类名即可整个过程和查看普通 .NET 程序集几乎没有区别。第 5 步IDA / Ghidra 接力深入函数逻辑Dummy DLL 只告诉我们有哪些类型和方法具体逻辑还要回到原生二进制中。此时把生成的脚本导入反汇编器能事半功倍在 IDA 中打开libil2cpp.so通过脚本命令执行ida_with_struct.py脚本会读取il2cpp.h并应用结构体信息让晦涩的汇编自动挂上函数名与参数类型Ghidra 用户则导入ghidra.py完成类似操作。导入之后原本裸奔的汇编代码会变成带注释、带类型的关键调用定位核心逻辑的速度会明显提升。四、加密与加壳两条应急通道1. 如何判断自己被锁了如果运行时报出类似下面的错误说明global-metadata.dat大概率被加密或做了特殊处理ERROR: Metadata file supplied is not valid metadata file.可以再辅助检查文件体积是否异常与同版本 Unity 的常规文件相比过大或过小以及头部是否为标准的 magic 值。2. 应急通道 A从内存里请出真身加密只在磁盘上生效程序运行时内存里的元数据必然是解密的。常用做法是用 x64dbg 附加到游戏进程在il2cpp::metadata初始化相关的函数上下断点断点命中后在内存中定位元数据区域并整体 dump 下来把 dump 出的文件当作输入重新喂给 Il2CppDumper。对于已 root 的 Android 设备还有更省事的运行时方案在进程内直接读取解密后的元数据从根源上无视磁盘加密。3. 应急通道 B强制指定版本部分旧版本 IL2CPP 需要手动兜底。在config.json中把ForceIl2CppVersion设为true再通过ForceVersion指定版本号例如某些安卓 20 环境需要把版本强制设为 16 才能正常解析重新运行即可。如果二进制本身被加壳提示ERROR: This file may be protected.则需要先用 GameGuardian 之类的工具从游戏内存中 dump 出libil2cpp.so再交给 Il2CppDumper 处理才能绕过大部分保护。兜底提示当自动模式失效ERROR: Cant use auto mode to process file, try manual mode.时程序会进入手动模式要求你输入 CodeRegistration 与 MetadataRegistration 两个关键地址。另外请注意PC 平台的 IL2CPP 可执行文件通常是GameAssembly.dll。五、四个高频踩坑点坑 1把 Dummy DLL 当成完整代码。还原出的 DLL 只有类型与签名没有方法体。指望从里面看到完整逻辑是不现实的正确姿势是DLL 定结构、反汇编看逻辑双线并行。坑 2忽略平台差异。不同平台的可执行格式完全不同Android 是 ELF、iOS 是 Mach-O、PC 是 PE、Switch 是 NSO、WebGL 是 WASM。文件格式没对上解析自然失败先确认自己手里文件的真实类型再动手。坑 3版本对不上还硬解析。IL2CPP 格式随 Unity 版本持续变化。遇到解析错误先看程序打印的版本号版本检测代码在Il2CppDumper/Il2Cpp/Metadata.cs对照官方支持范围Unity 5.3 到 2022.2再决定是否走强制版本通道。坑 4直接分析加壳文件。商业游戏普遍对libil2cpp.so加壳。跳过脱壳直接分析只会得到一堆无效数据先脱壳或从内存 dump再进入正常流程。写在最后比工具更重要的三件事工具只是手段理解原理才能应对层出不穷的变体元数据结构掌握 metadata 的二进制布局才能在加密时从容应对函数映射机制弄清 C# 方法如何对应到原生函数是快速定位关键逻辑的基础跨平台差异二进制格式的差异直接影响流程设计。此外如果你有批量分析的需求可以参考Il2CppDumper/Utils/Il2CppExecutor.cs它提供了程序化的调用接口可以接入自动化逆向流程。最后提醒一句一切逆向操作都应在合法合规的前提下进行尊重软件的使用条款与相关法律法规把技术用在正当的地方。【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考