众所周知,Unity引擎中有两种脚本编译器,分别是Mono和IL2CPP。相较于Mono,IL2CPP具备执行效率高、跨平台支持等优势,已被大多数游戏采用。
IL2CPP模式下,可以将游戏C#代码转换为C++代码,然后编译为各平台Native代码。Native代码提高了逆向/反编译难度,可有效提高外挂开发和游戏破解的门槛。
IL2CPP构建项目自动步骤图
虽然UnityIL2CPP在一定程度上提高了破解门槛,但并非没有弱点,市面上出现了不少针对性逆向分析工具,如IL2cppDumper。
本文将着重分析IL2CPP模式下,游戏应该如何应对IL2cppDumper的逆向分析,并提供行之有效的解决方案。
首先,我们来了解一下,IL2CPP是如何被破解的。
在UnityIL2CPP模式下,游戏逻辑是以Native代码运行,但依然存在C#某些语言特性(如GC、反射),会将所有的C#中的类名/属性名/字符串等信息记录在global-metadata.dat文件中,IL2CPP启动时会从这个文件读取所需要的信息。
IL2CPP.so与global-metadata.dat关系
正是这一机制为外挂制作与游戏破解带来了便利。破解者只需将游戏包进行解压,找到libil2cpp.so与global-metadata.dat文件,拖入input文件夹,运行一个命令行,即可完成逆向分析。
在未加密情况下IL2cppDumper可以解析出.cs/.json等文件
随后,可以将解析出的dump.cs文件拖入VisualStudio解析工具中,直接分析出源码:
使用VisualStudio可以解析出.cs文件中的代码
这样一来,游戏在破解者眼里无异于“裸奔”。破解者可以利用分析出来的代码逻辑制作各类功能的外挂,甚至制作破解版,会造成游戏公平性破坏,正常付费玩家大量流失,厂商收益直接受损等严重影响。
基于这种情况,FairGuard研发了一套完善的解决方案,支持Android/iOS/PC/鸿蒙多端,目前已接入多款热门游戏并验证了出色的保护能力,主要包含以下功能:
■global-metadata.dat文件加密
加密global-metadata.dat文件,同时做到对开发者透明。开发者只需使用加固工具运行一条命令行,即可实现加密,不需要上传额外文件。
■libil2cpp.so加壳
由于IL2cppDumper需要依赖libil2cpp.so对应global-metadata.dat文件中的字符串地址,所以对libil2cpp.so做深度加密非常有必要。
FairGuard独创的无导出/无导入函数SO加壳方案,对il2cpp进行加壳。效果如下所示:
FairGuard加壳后il2cpp.so,无导入/导出函数
在使用加密方案后,即使从内存中dump出来libil2cpp.so,依然不会被IL2cppDumper正常识别,效果如下图:
加密后IL2cppDumper无法解析
此外,FairGuard还提供反外挂、防破解、资源加密功能,与引擎加固功能紧密耦合,游戏保护效果更上一层楼。
反外挂功能
针对游戏将面临一系列外挂修改风险,FairGuard研发了行为检测方案,搭配+维度的智能感知系统,可通杀各类外挂及其变种,做到有效防护。
防破解功能
采用FairGuard业界独家技术「无API签名校验技术」,从底层出发,对游戏的引擎与代码进行加密处理,可以针对游戏包签名和文件完整性进行多重校验,防止游戏被植入恶意模块、剔除广告等。
资源加密功能
FairGuard独家资源加密方案,支持Android、iOS、PC、H5、鸿蒙多端。可为游戏资源提供高强度加密保护,同时具备高兼容性、运行消耗小、性能无影响的特点,并且支持资源在线更新。