Unity il2cpp global-metadata.dat 加密方案
众所周知,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 正常识别。
效果如下:
[*]欢迎通过「站内私信」了解产品信息、体验免费试用
页:
[1]