一次搞懂Unity IL2CPP逆向用Il2CppDumper把二进制黑盒读成人话的实战手册【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper开场那个解不开的APK卡了我整整一周第一次接触Unity IL2CPP逆向时我对着一个刚解压完的APK文件夹手足无措里面找不到熟悉的Assembly-CSharp.dll只有一堆机器码组成的libil2cpp.so和一个看起来像乱码的global-metadata.dat。用常规反编译工具打开满屏汇编仿佛在看天书。后来我才明白一个反常识的事实IL2CPP模式下C#代码不是被编译成DLL而是被翻译成C再编成原生机器码类型信息则全部塞进了一个独立的元数据文件。这两者就像肉和骨架——机器码是肉元数据是骨架缺一不可。而 Il2CppDumper 这个开源工具恰好就是那把把骨架重新拼出来的钥匙。读完这篇实战手册你可以独立完成从APK/安装包中提取关键文件、用Il2CppDumper一键还原类型结构、再用dnSpy浏览还原出的Dummy DLL、最后把结果导入IDA/Ghidra辅助分析函数逻辑。全程不需要你懂一行汇编跟着步骤走就行。第一部分先搞懂它在干什么大白话原理在动手之前花两分钟理解原理后面遇到报错才不会慌。一句话原理Il2CppDumper做的事就像查字典抄目录。Unity在用IL2CPP模式打包时会生成两个关键文件文件内容生活化类比libil2cpp.so或GameAssembly.dllC#逻辑编译成的原生机器码一本写满代码的书但你看不懂global-metadata.dat所有类、方法、字段的类型定义这本书的目录和索引global-metadata.dat本身有固定格式文件开头有个防伪标记0xFAB11BAF版本号紧随其后——这个细节在 Il2Cpp/Metadata.cs 里可以看到校验逻辑。Il2CppDumper就是靠读这个元数据文件重建出每个类的完整签名再对照机器码里的地址信息生成一份类型齐全但没有逻辑的伪DLL也就是所谓的Dummy DLL。⚠️ 必须记住Dummy DLL里没有方法体只有声明。想看逻辑还得靠IDA/Ghidra分析原生机器码——这一步Il2CppDumper也帮你想好了它会顺便生成对应的辅助脚本。第二部分从零搭好分析环境的最快方法先准备工具全程用到的只有三样Il2CppDumper核心工具需自行编译或下载Releasegit clone https://gitcode.com/gh_mirrors/il/Il2CppDumperdnSpy 或 ILSpy任意一个.NET反编译查看器用来浏览Dummy DLL7-Zip解压APK等安装包用✅环境自检清单能运行 Il2CppDumper 的GUI窗口或能在命令行执行Il2CppDumper.exe并看到帮助信息dnSpy能正常打开任意一个普通.NET DLL文件能解压APKAndroid、IPAiOS或直接访问安装目录Windows三个都勾上就可以进入实战了。第三部分三阶段实战从新手到进阶阶段一最基础的Android游戏还原这个阶段要达成从APK里取出关键文件跑通Il2CppDumper用dnSpy看到还原出的类结构。具体步骤先解压APK并定位文件7z x game.apk -oextracted_apk cd extracted_apk/lib/arm64-v8a/ ls libil2cpp.so cd ../../assets/bin/Data/ ls global-metadata.dat看到这两个文件后打开 Il2CppDumper按提示依次选择libil2cpp.so和global-metadata.dat程序会在当前目录生成一堆输出文件。更推荐用命令行方式可脚本化Il2CppDumper.exe libil2cpp.so global-metadata.dat output如何验证成功程序会打印Metadata Version和Il2Cpp Version两行信息然后生成output文件夹。检查里面是否包含DummyDll/文件夹还原出的全部DLLdump.cs所有类、方法、字段的文本清单script.json供后续IDA/Ghidra脚本使用的地址数据il2cpp.h结构体定义头文件接着启动dnSpy打开output/DummyDll/Assembly-CSharp.dll左侧导航树里就能看到命名空间和类。搜索PlayerController这类关键类名能搜到就说明还原成功。 贴心提示想批量处理多个APK的话直接在命令行循环调用即可输出目录每次换成新的就行。更程序化的调用方式可以参考 Utils/Il2CppExecutor.cs它把核心解析逻辑封装成了可复用的类。常见坑与补救⚠️ 报错ERROR: Metadata file supplied is not valid metadata file.先确认选的是不是真的global-metadata.dat。很多游戏会把这个文件加密或魔改Il2CppDumper只负责解析标准格式解密得靠其他手段见阶段二。再确认Unity版本是否在支持范围5.3 ~ 2022.2。版本检测逻辑在 Il2Cpp/Metadata.cs它只接受版本号16~31的元数据。⚠️ 报错ERROR: Cant use auto mode to process file, try manual mode.自动模式搜不到关键注册表结构时才会走到这步。先别慌把提示的CodeRegistration和MetadataRegistration两个地址补上即可通常是因为so文件被加壳或格式异常。阶段二遇上加密的metadata怎么破这个阶段要达成在global-metadata.dat被加密或压缩的情况下拿到一份能解析的元数据。具体步骤先判断是不是真的加密了。一个快速方法用十六进制编辑器打开文件开头标准元数据的前4个字节是AF 1B B1 FA小端序的0xFAB11BAF。不对就基本可以断定被处理过。这时候靠静态文件不行得走内存掏数据路线用 x64dbgWindows或 GameGuardianAndroid附加到游戏进程找到il2cpp::metadata::Init之类的初始化函数在关键位置下断点断点命中后定位到metadata内存区域把这段内存dump成文件得到的就是解密后的运行时数据存成dumped_metadata.dat然后把 dump 出的文件喂给Il2CppDumper同时改一下 config.json{ ForceIl2CppVersion: true, ForceVersion: 24.1, ForceDump: true }Il2CppDumper.exe libil2cpp.so dumped_metadata.dat output2如何验证成功能顺利打印出版本号并生成output2/DummyDll就算成功了。把 dump.cs 和阶段一的输出对比一下正常情况下类结构应该一致或更完整。常见坑与补救⚠️ 指定了ForceIl2CppVersion反而解析失败说明强制版本选错了。IL2CPP内部格式随Unity版本变化很频繁可以参考 Il2Cpp/Il2Cpp.cs 里的自动校准逻辑它会根据计数异常自动向下调整版本号手动指定时多试几个相邻版本。⚠️ dump出来的so和metadata对不上两者必须来自同一个进程、同一次运行混搭使用必然报错。要点ForceDump是告诉程序我给你的已经是内存dump产物别当原文件解析。Android上有些设备dump出的文件指针没做重定向还得把NoRedirectedPointer设为true不然会解析出全错的数据。阶段三把结果导入IDA/Ghidra看懂函数逻辑这个阶段要达成让IDA或Ghidra自动识别函数名、参数类型和结构体把反汇编代码变成有注释的代码。具体步骤在IDA中打开libil2cpp.so等自动分析完成打开脚本控制台执行 Il2CppDumper 生成的ida_with_struct.py带结构体版本ida_with_struct.py脚本会读取同目录的script.json和il2cpp.h自动给函数重命名、给结构体套类型用Ghidra的朋友对应执行ghidra.pyBinary Ninja用户则用Il2CppBinaryNinja插件目录Il2CppBinaryNinja/init.py 就是插件入口。如何验证成功导入后随便找一个之前从dump.cs里看到的函数名比如PlayerController_Update在IDA的函数窗口搜索能直接跳转到对应的机器码位置——这就说明地址映射成功了。此时函数参数会显示成真实类型如Vector3、GameObject*不再是裸的寄存器。常见坑与补救⚠️ 脚本执行后函数名没变多半是script.json和so文件对不上。重新跑一次Il2CppDumper确保所有输出文件来自同一次解析不要混用不同版本的输出。⚠️ Ghidra分析大so文件卡死先关掉自动分析中的某些耗时选项如栈指针修正脚本执行完再补跑能省下大量时间。第四部分新手最容易踩的3个坑自查清单把常见翻车点集中在这里动手前先过一遍坑1拿Dummy DLL当完整代码看。里面只有声明没有逻辑期望看到方法实现注定失望。正确姿势用Dummy DLL拿类型信息用IDA/Ghidra看机器码逻辑两个配合才是完整分析。坑2不认平台差异就硬解析。Android是ELFiOS是Mach-OWindows是PESwitch是NSOWeb是WASM——Il2CppDumper全都支持这些解析器分别在 ExecutableFormats 目录下但Windows平台的游戏文件叫GameAssembly.dll别去搜libil2cpp.so。坑3直接分析加壳文件。商业游戏大多对so加壳Il2CppDumper检测到保护会提示ERROR: This file may be protected.此时先脱壳或从内存dump别跟它硬刚。第五部分高频问题速查Q解析出来一堆报错先查什么A先看版本。Metadata file supplied is not a supported version就说明Unity版本过新或过老优先核对支持范围。Q没有root的Android手机能做内存dump吗A可以试试非root方案但选择很少。有root的话可考虑作者的另一个项目 Zygisk-Il2CppDumper能绕过大部分保护。Q只想提取MonoBehaviour和MonoScript怎么最省事A直接启用GenerateDummyDll还原出的DLL配合 UABE 等工具就能提取不用走完整逆向流程。最后把收获串起来回顾一下你这次掌握了四件事原理IL2CPP把C#编成原生码类型信息存在独立的metadata里Il2CppDumper负责抄目录。基础流程提取libil2cpp.soglobal-metadata.dat→ 运行Il2CppDumper → dnSpy看Dummy DLL。进阶手段遇到加密metadata从内存dump后用ForceIl2CppVersionForceDump强解。深度分析用ida_with_struct.py/ghidra.py把类型信息灌进反汇编器。下一步行动很明确拿一个你手头合法的测试应用比如你自己用Unity打包的Demo跑通整个流程再用一个真实目标练手。先在dump.cs里定位一个类再到IDA里看它的函数你会发现自己已经能读二进制了。合规声明本文所述逆向技术仅限用于你自己拥有或已获授权的软件、安全研究、学习交流等合法场景。对他人软件进行逆向分析前请务必确认其是否符合软件许可协议与所在地区法律法规违反带来的后果由使用者自行承担。【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考