Cpp2IL项目对Unity 2021版本v31元数据的支持问题分析

Cpp2IL项目对Unity 2021版本v31元数据的支持问题分析

【免费下载链接】Cpp2IL Work-in-progress tool to reverse unity's IL2CPP toolchain. 【免费下载链接】Cpp2IL 项目地址: https://gitcode.com/gh_mirrors/cp/Cpp2IL

问题背景

Cpp2IL是一个用于逆向Unity的"il2cpp"构建过程的工具。近期有用户报告,在使用最新CI版本处理Unity 2021.3.40及以上版本的游戏时遇到了兼容性问题。该问题表现为工具在处理v31版本的IL2CPP元数据时出现异常,导致分析过程失败。

错误表现

当用户尝试使用Cpp2IL分析Unity 2021.3.40及以上版本构建的游戏时,工具会抛出两种不同类型的异常:

  1. 数组维度超出范围异常:系统抛出System.OverflowException,提示"Array dimensions exceeded supported range"。这表明工具在尝试读取二进制数据时,遇到了超出预期的数组大小。

  2. 流结束异常:在某些情况下(如处理Hungry Shark Evolution 12.7.2时),会抛出System.IO.EndOfStreamException,提示"Unable to read beyond the end of the stream"。这表明工具在读取文件时超出了实际数据范围。

技术分析

从错误堆栈可以追踪到问题主要出现在以下两个关键环节:

  1. 二进制数据读取过程:在ClassReadingBinaryReader.ReadClassArrayAtRawAddr方法中,工具尝试读取特定偏移量和数量的数据时失败。这表明Unity 2021.3.40及以上版本可能改变了IL2CPP二进制数据的组织方式或数据结构。

  2. IL2CPP二进制初始化过程:在Il2CppBinary.Init方法中,工具尝试使用代码注册表(pCodeRegistration)和元数据注册表(pMetadataRegistration)的地址初始化二进制数据时失败。

潜在原因

  1. 数据结构变更:Unity 2021.3.40可能引入了新的数据结构或改变了现有结构的大小/布局,导致Cpp2IL的解析逻辑不再适用。

  2. 内存布局调整:新版本可能调整了代码和元数据在内存中的组织方式,使得工具无法正确计算偏移量。

  3. 元数据版本兼容性问题:虽然工具识别出元数据版本为v31,但Unity 2021.3.40可能对该版本做了细微调整,导致兼容性问题。

解决方案建议

  1. 更新解析逻辑:需要针对Unity 2021.3.40及以上版本调整二进制数据的解析方式,特别是数组和结构体的读取逻辑。

  2. 增强错误处理:在读取二进制数据时增加范围检查,防止越界访问。

  3. 版本特定适配:为Unity 2021.3.40及以上版本实现专门的解析路径,而不是依赖通用的v31元数据处理逻辑。

总结

Cpp2IL工具当前对Unity 2021.3.40及以上版本的支持存在不足,主要问题集中在二进制数据的解析环节。这需要开发者深入了解新版本Unity的IL2CPP实现变化,并相应调整工具的解析逻辑。对于普通用户而言,目前建议暂时避免使用Cpp2IL处理Unity 2021.3.40及以上版本构建的游戏,等待官方更新修复此问题。

【免费下载链接】Cpp2IL Work-in-progress tool to reverse unity's IL2CPP toolchain. 【免费下载链接】Cpp2IL 项目地址: https://gitcode.com/gh_mirrors/cp/Cpp2IL

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

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

抵扣说明:

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

余额充值