找回密码
 立即注册
查看: 235|回复: 0

[笔记] Unity il2cpp global-metadata.dat 加密方案

[复制链接]
发表于 2022-12-7 10:16 | 显示全部楼层 |阅读模式
众所周知,Unity 游戏有两种打包方式 mono 与 il2cpp。
在 mono 模式下,游戏 C# 代码被编译为 IL(中间代码) 并生成 dll 文件,然后 dll 被打包进最后的游戏包文件。由于 IL 非常容易被 ILSpy / .NET Reflector 等专业反编译软件分析逆向,所以在无保护情况下,游戏的安全性极差。
如下图,.NET Reflector 几乎可以还原出 C# 文件,外挂开发者可以凭此迅速制作出强大的外挂:



.NET Reflector 几乎可以还原出 C# 文件

对于 mono, il2cpp 将游戏 C# 代码转换为 C++ 代码,然后编译为各平台 Native 代码。由于 Native 代码的逆向/反编译难度大大增加,可以有效提高外挂开发/游戏破解的门槛。另外,il2cpp 具有执行效率高/平台兼容性好等原因,所以 il2cpp 已经逐步被绝大多数游戏采用。
在 il2cpp 模式下,虽然游戏逻辑是以 Native 代码运行, 但依然要实现 C# 某些语言特性(如GC), il2cpp 将所有的 C# 中的类名/属性名/字符串等信息记录在 global-metadata.dat 文件。il2cpp 启动时会从这个文件读取所需要的类名/属性名等信息。
正是这一机制为外挂制作/游戏破解带来了便利,使用 IL2cppDumper 可以解析 global-metadata.dat 文件,并将文件里的类名等字符串信息对应到 Native 代码中去,极大地方便了逆向分析。



IL2cppDumper 接收 libil2cpp.so / global-metadata.dat 两个文件路径为输入

基于这种情况,FairGuard 开发了 global-metadata.dat 加密方案(同时支持 Android / iOS / Windows),防止 global-metadata.dat 被 IL2cppDumper 解析。该方案主要包括两个部分:
1. 加密 global-metadata.dat 文件,同时做到对开发者透明。开发者只需要上传游戏包文件,就可以实现加密,不需要上传额外文件。



加密前 globa-metadata.dat 文件:



加密后的 global-metadata.dat 文件:

2. 加密 libil2cpp.so 文件。由于 IL2cppDumper 需要依赖 libil2cpp.so 对应 global-metadata.dat 文件中的字符串地址,所以对 libil2cpp.so 做深度加密非常有必要。
FairGuard独创的无导出/无导入函数SO加壳方案,对il2cpp进行加壳。效果如下所示:



原始未加壳il2cpp.so有多个导出函数



原始未加壳il2cpp.so有多个导入函数



FairGuard加壳后il2cpp.so,无导入/导出函数

使用这个方案加壳后,即使从内存中 dump 出来 libil2cpp.so , 依然不会被 IL2cppDumper 正常识别。
效果如下:



  • 欢迎通过「站内私信」了解产品信息、体验免费试用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-30 06:17 , Processed in 0.091502 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表