最完整Il2Cpp逆向指南:从内存到代码的Program类全流程解析

最完整Il2Cpp逆向指南:从内存到代码的Program类全流程解析

【免费下载链接】Il2CppDumper Unity il2cpp reverse engineer 【免费下载链接】Il2CppDumper 项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper

你是否在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.csElf.csMacho.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.csDummyAssemblyExporter.cs实现,为逆向工程提供了更多便利。

总结与展望

Il2CppDumper作为一款强大的Unity逆向工具,其设计巧妙、功能全面,能够帮助开发者和研究人员深入理解Unity游戏的内部结构。通过分析Program.cs的源代码,我们不仅可以了解工具本身的工作原理,还能学习到许多逆向工程和代码设计的最佳实践。

未来,随着Unity和Il2Cpp技术的不断发展,Il2CppDumper也需要持续更新以应对新的挑战。如果你对项目感兴趣,可以通过README.md了解更多信息,或直接参与到项目的开发中。

【免费下载链接】Il2CppDumper Unity il2cpp reverse engineer 【免费下载链接】Il2CppDumper 项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值