最完整Il2Cpp逆向指南:从内存到代码的Program类全流程解析
你是否在Unity游戏逆向时遇到过Il2Cpp二进制文件难以解析的问题?是否对metadata与可执行文件的匹配过程感到困惑?本文将通过深度剖析Il2CppDumper/Program.cs的核心逻辑,带你掌握从文件加载到代码生成的完整逆向流程,让你轻松应对各类Unity游戏的Il2Cpp逆向工程。
读完本文你将获得:
- 理解Il2CppDumper的工作原理与执行流程
- 掌握不同格式可执行文件的解析方法
- 学会处理metadata与二进制文件的匹配问题
- 了解代码生成与结构导出的实现方式
程序入口与初始化流程
Il2CppDumper的执行入口位于Program.cs的Main方法,该方法负责解析命令行参数、加载配置文件并初始化必要组件。程序首先尝试从config.json加载配置,然后处理用户提供的命令行参数,包括Il2Cpp二进制文件路径、metadata文件路径和输出目录。
config = JsonSerializer.Deserialize<Config>(File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"config.json"));
string il2cppPath = null;
string metadataPath = null;
string outputDir = null;
如果未提供命令行参数,程序会通过OpenFileDialog提供图形界面让用户选择文件,这一设计极大提升了普通用户的使用体验。
可执行文件格式识别与处理
Il2CppDumper支持多种平台的可执行文件格式,包括Windows的PE格式、Linux的ELF格式、macOS的Mach-O格式以及WebAssembly格式。这一功能通过ExecutableFormats目录下的各类实现类完成,如PE.cs、Elf.cs和Macho.cs等。
程序通过文件头部的魔术数字(Magic Number)来识别文件类型:
var il2cppMagic = BitConverter.ToUInt32(il2cppBytes, 0);
switch (il2cppMagic)
{
case 0x6D736100: // WebAssembly
var web = new WebAssembly(il2CppMemory);
il2Cpp = web.CreateMemory();
break;
case 0x304F534E: // NSO
var nso = new NSO(il2CppMemory);
il2Cpp = nso.UnCompress();
break;
case 0x905A4D: // PE
il2Cpp = new PE(il2CppMemory);
break;
// 其他格式处理...
}
这一设计体现了面向对象的多态特性,不同格式的文件处理逻辑被封装在各自的类中,使代码结构清晰且易于扩展。
Metadata与Il2Cpp二进制文件匹配
Metadata文件(通常名为global-metadata.dat)包含了Unity游戏的类型信息、方法定义等关键数据,是逆向过程不可或缺的一部分。程序通过检查文件头部的0xFAB11BAF魔术数字来识别metadata文件:
if (BitConverter.ToUInt32(file, 0) == 0xFAB11BAF)
{
metadataPath = arg;
}
else
{
il2cppPath = arg;
}
初始化Metadata的过程在Metadata.cs中实现,它负责解析metadata文件并提取必要的信息供后续处理使用。
搜索与分析过程
Il2CppDumper的核心功能之一是在二进制文件中搜索关键结构(如CodeRegistration和MetadataRegistration),这一过程在Init方法中实现。程序首先尝试自动搜索,如果失败则会提示用户手动输入这些结构的地址:
var flag = il2Cpp.PlusSearch(metadata.methodDefs.Count(x => x.methodIndex >= 0), metadata.typeDefs.Length, metadata.imageDefs.Length);
if (!flag) flag = il2Cpp.Search();
if (!flag) flag = il2Cpp.SymbolSearch();
if (!flag)
{
Console.WriteLine("Input CodeRegistration: ");
var codeRegistration = Convert.ToUInt64(Console.ReadLine(), 16);
Console.WriteLine("Input MetadataRegistration: ");
var metadataRegistration = Convert.ToUInt64(Console.ReadLine(), 16);
il2Cpp.Init(codeRegistration, metadataRegistration);
}
这一多层次的搜索策略大大提高了程序的兼容性和成功率,即使在复杂的二进制文件中也能找到所需信息。
代码生成与导出
成功解析二进制文件和metadata后,程序进入代码生成阶段。这一过程主要由Il2CppDecompiler.cs负责,它利用前面提取的信息生成可读性强的C#代码。
var decompiler = new Il2CppDecompiler(executor);
decompiler.Decompile(config, outputDir);
此外,程序还支持生成结构体定义和Dummy DLL文件,这些功能分别由StructGenerator.cs和DummyAssemblyExporter.cs实现,为逆向工程提供了更多便利。
总结与展望
Il2CppDumper作为一款强大的Unity逆向工具,其设计巧妙、功能全面,能够帮助开发者和研究人员深入理解Unity游戏的内部结构。通过分析Program.cs的源代码,我们不仅可以了解工具本身的工作原理,还能学习到许多逆向工程和代码设计的最佳实践。
未来,随着Unity和Il2Cpp技术的不断发展,Il2CppDumper也需要持续更新以应对新的挑战。如果你对项目感兴趣,可以通过README.md了解更多信息,或直接参与到项目的开发中。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



