Skip to main content

Virbox Protector Unity3D的保护原理

Unity3D程序简介#

Unity3D 是由 Unity Technologies 公司开发的一款专业游戏引擎,可以让开发者轻松创建三维视频游戏、建筑可视化、实时三维动画等工具和应用,广泛应用于游戏、汽车、运输与制造、电影与动画、建筑、工程与施工等领域。Unity3D 具有跨平台、高效的开发语言和工具、丰富的插件和极易上手等优势,已逐渐成为备受开发者青睐的游戏引擎。

游戏引擎使用量排行(Steam)

Unity3D 程序使用 C# 语言开发,可以通过 Unity 编译环境生成各个平台的程序,Unity 提供了 Mono 和 il2cpp 两种不同的编译方式,编译方式不同,其运行原理也不同,但都不同程度的存在一些安全问题。

Unity3D程序的安全问题#

代码安全问题#

Mono运行时的安全问题#

以 Mono 方式编译的 Unity3D 程序,其核心代码位置于 Assembly-CSharp.dll 中,Assembly-CSharp.dll 是标准的 .NET 文件格式,附带了方法名、类名、类型定义等丰富的元数据信息,使用 DnSpy 等工具可以轻易地将其反编译,代码逻辑、类名和方法名等一览无余。

Unity3D 代码逻辑一但被反编译,可以使用工具直接篡改,很容易滋生各种类型的外挂,破坏游戏平衡,如果代码逻辑中存在漏洞,也容易被挖掘利用,可能对开发商造成无法预料的损失。

il2cpp的安全问题#

il2cpp 是 Unity 提供的另一种编译方式,它将 C# 代码转换成 C++ 代码,最后直接编译成了相应平台的 Native 可执行格式,位于 libil2cpp.so、GameAssembly.dll 或 UnityFramework 等文件中(依平台而定),转换成 Native 程序后,代码的分析难度理应会更大,但实际上并非如此,虽然 C# 代码由 IL 指令转换成了 Native 指令,但依然存在 .NET 元数据信息,存在于程序目录下的 global-metadata.dat 文件中,通过 il2cppDumper 等工具可以直接生成 .NET 文件格式。

D:\>il2cppDumper.exe libil2cpp.so global-metadata.dat .Initializing metadata...Metadata Version: 21Initializing il2cpp file...Applying relocations...Il2Cpp Version: 21Searching...CodeRegistration : 2595ee8MetadataRegistration : 25d2738Dumping...Done!Generate struct...Done!Generate dummy dll...Done!Press any key to exit...

Dump 出 C# 程序集后,虽然无法直接看到 .NET 方法中的逻辑,但可以直接定位到方法对应的 il2cpp 模块的地址,篡改代码逻辑,破坏正常功能。

资源易提取#

Unity3D 程序在编译打包阶段会通过 Unity 编辑器将资源打包成 Asset Bundle 文件,Asset Bundle 是一种公开的文件格式,使用 Asset Studio 等工具可以对其解析、展示和提取。

Unity3D 程序中的有些骨骼模型和场景等资源一般是开发商耗费大量的精力开发的,如果不保护,很容易被窃取进行二次开发。对于网络游戏,还可以将一些场景资源的材质属性改为透明,实现透视效果。

Unity3D保护方案#

程序集加密#

使用 Mono 方式编译的 Unity3D 程序,针对 Assembly-CSharp.dll 程序集的加密,最早存在一些简单的加解密方式,如直接加密整个 DLL,运行时通过 hook mono 中的加载函数 mono_image_open_from_data_with_name 进行解密,这种加密方式过于简单,解密后在内存中可以被 Dump 出明文,安全性低。

Virbox Protector 通过加密程序集中的每个方法,每次仅有一个方法被解密,并且解密时解密到随机的内存地址,保证加密后的程序无法被 Dump 出原始内容,再通过二进制指令块编译链接技术,将关键的代码逻辑动态地进行混淆或虚拟化保护,保证其安全性。

加密前:

加密后:

il2cpp元数据保护#

Virbox Protector 可以对 il2cpp 的 global-metadata.dat 文件加密或隐藏,防止直接 Dump 中 C# 程序集,并对 global-metadata.dat 的数据结构进行混淆和加扰,防止 Dump 出原始的元数据信息。

il2cpp内存校验#

校验 il2cpp 核心模块(GameAssembly.dll、libil2cpp.so、UnityFramework 等)的内存完整性,防止核心逻辑被篡改。

AssetBundle资源加密#

Virbox Protector 提供了资源加密的功能,支持 Android apk 的分块读取和其它平台的读取操作,通过保护工具配置完成加密。

反调试#

Virbox Protector 提供了反调试的功能,在运行时检测调试器,发现恶意调试行为立即清场退出,防止动态调试保护后的程序。

反注入#

针对安卓系统,Virbox Protector 还提供了反注入的功能,通过 ptrace 双进程守护技术,防止进程被调试器附加,防止内存读写,以及 so 库注入,在运行时防止自身进程被恶意调试和修改。

产品优势#

  • 多平台支持

    支持 Windows、Linux、macOS、Android、iOS 操作系统。

  • 兼容性高

    支持 Unity 5.4 以上,同时支持 Mono 和 il2cpp 编译的 Unity3D 程序。

  • 操作简单,一键完成保护

    无需对代码和编译环境做任何修改,使用保护工具一键完成保护。

  • 保护过程自动化,可离线部署

    调整保护选项后生成配置文件,通过命令行自动完成保护,保护工具可以离线使用。

  • 性能影响小

    保护后的程序运行时性能影响很小,不影响用户体验。

  • 安全性高

    高强度的加密方案,再通过二进制指令块混淆虚拟化技术加持,大辐提升安全强度。