Unity3D程序保护最佳实践
#
功能简介Virbox Protector 为 Unity3D 程序定制了专属的加密方案用于保护程序代码和资源,防止程序被反编译和篡改。
Unity 版本
Virbox Protector 支持了 Unity 引擎所支持的主流平台,支持 Unity 5.4 以上的 5.x 版本,以及 Unity 2017 以上版本,同时支持 Mono 和 il2cpp Release方式编译方式生成的应用。
编译方式 | Windows | Linux | macOS | Android | iOS |
---|---|---|---|---|---|
Mono | ✔ | ✔ | ✔ | ✔ | ✔ |
il2cpp | ✔ | ✔ | ✔ | ✔ | ✔ |
Virbox Protector 需要对 Unity 引擎做修改,建议使用 Unity 官方发布的版本,并使用 Release 方式编译。
功能列表
详细功能支持如下:
功能 | Windows | Linux | macOS | Android | iOS |
---|---|---|---|---|---|
程序集加密(Mono) | ✔ | ✔ | ✔ | ✔ | N/A |
资源加密 | ✔ | ✔ | ✔ | ✔ | ✔ |
内存校验(il2cpp) | ✔ | ✔ | ✔ | ✔ | ✔ |
Unity引擎保护(il2cpp) | ✔ | ✔ | ✔ | ✔ | ✔ |
MetaData加密(il2cpp) | ✔ | ✔ | ✔ | ✔ | ✔ |
MetaData名称混淆(il2cpp) | ✔ | ✔ | ✔ | ✔ | ✔ |
调试器检测 | ✔ | ✔ | ✔ | ✔ | ✔ |
签名校验 | ❌ | ❌ | ✔ | ✔ | ✔ |
文件校验 | ❌ | ❌ | ❌ | ✔ | ❌ |
反注入 | ❌ | ❌ | ❌ | ✔ | ❌ |
防截屏 | ❌ | ❌ | ❌ | ✔ | ❌ |
模拟器检测 | N/A | N/A | N/A | ✔ | N/A |
Root 检测 | N/A | N/A | N/A | ✔ | ❌ |
多开检测 | ❌ | ❌ | N/A | ✔ | ❌ |
#
保护流程#
打开Unity程序Virbox Protector 保护 Unity3D 程序时,需要对生成的整个应用保护,对 Windows、Linux 直接保护编译生成的整个文件夹,对 Android 平台保护 .apk 文件,而对 macOS/iOS 平台则是保护生成的 .app 文件夹。
直接将需要保护的文件夹/.apk/.app
拖进 Virbox Protector 即可开始保护。
#
设置保护选项选择程序集(Mono)
如果保护的 Unity 应用是 Mono 编译方式生成的,核心代码一般位于 Assembly-CSharp.dll 这个程序集文件中,请在加密选项
界面的程序集
中添加需要保护的程序集,建议选择自己开发生成的程序集,请勿选择 Unity 自带的程序集。
其它选项
其它选项的设置,不同平台会有所差异,请以 Virbox Protector 工具界面上显示的功能为准。
注:以下表格中的 il2cpp 模块,表示 Unity 程序使用 il2cpp 方式编译生成的 libil2cpp.so、GameAssembly.dll 或 UnityFramework 模块,不同平台的模块名不同。
选项 | 描述 | 操作建议 |
---|---|---|
反调试 | 检测到调试器则退出 | 建议勾选 |
Unity引擎保护(il2cpp) | 保护 il2cpp 模块,防止动态调用 | 建议勾选 |
MetaData名称混淆(il2cpp) | 混淆 global-metadata.dat 里的方法名 | 建议勾选 |
内存校验(il2cpp) | 校验 il2cpp 模块的内存完整性 | 部分低版本安卓模拟器会修改 ELF 结构信息导致校验失败,存在部分兼容性问题;建议根据运行环境选择 |
签名校验 | 校验开发者签名 | 如果用于 Google Play 上架,则不勾选,否则建议勾选;该选项需要开启签名功能 |
文件校验 | 校验 apk/aab 内所有文件的完整性 | 建议勾选 |
反注入 | 防 ptrace 注入、反调试 | 建议勾选 |
防截屏 | 防止应用开启状态时被截屏 | 视应用运行环境而定 |
模拟器检测 | 检测到模拟器则退出 | 视应用运行环境而定,如果目标设备的硬件环境特殊,也不要勾选 |
Root 检测 | 检测到设备被 Root 则退出 | 视应用运行环境而定 |
多开检测 | 检测是应用多开则退出 | 视应用运行环境而定 |
#
资源加密Virbox Protector 支持加密 Unity3D 程序中的 Asset Bundle 资源,在 Windows/Linux 平台支持所有类型的资源。
在资源加密
页点击 启用
即可打开资源加密功能,再点击选择文件
选择需要加密的资源文件即可。
大小优先:在Android/iOS 平台,如果开发者关心加密后的包大小,可以勾选此选项,但勾选后会降低加密的安全性。
设置密码
如果需要使用资源热更新功能,则需要设置密码,否则建议使用随机密钥。密钥与解密逻辑在保护时会链接到 Unity 引擎模块中,因此加密的资源与保护后的 Unity 模块对应。
加密外部资源
如果资源不在应用程序内,或者是通过热更新的方式下载到本地的资源,可以点击加密外部资源
再单独进行加密,加密外部资源需要先设置密码并保存配置。
#
签名Android 签名
Virbox Protector 的签名过程需要安装 jdk 环境,并确保将 java、jarsigner 加入 PATH 环境变量(可以打开命令行终端输入 java 或 jarsigner 测试)。
签名过程需要正确填写 KeyStore 路径、KeyStore密码、密钥别名、密钥密码。
iOS 签名
iOS 应用的签名只在 macOS 系统下保护时支持,Virbox Protector 采用的是重新签名
的方式,保护前的 iOS App 也需要经过签名,并保证选择的证书一致。
#
保护设置好所有选项后,点击保护选中项目
即可开始保护,保护完成后会生成到输出文件(夹)
中,接下来进行测试和发布流程即可。
#
控制台自动保护在界面配置完成后,点击保存选中配置
会在被保护的程序旁边生成 .ssp
文件,如果应用重新打包后,可继续使用该 .ssp
文件自动化保护。
virboxprotector_con <application_path> -o <output_application_path>
注:
.ssp
文件需要与<applicaton_path>
位于同一目录下。建议将 virboxprotector_con 加入环境变量,virboxprotector_con 的默认安装后所在目录为:
Windows:
C:\Program Files\senseshield\Virbox Protector 2\bin
Linux:
/usr/share/virboxprotector/bin
macOS:
/Applications/Virbox Protector 2.app/Contents/MacOS/bin
#
性能与技术原理功能 | 性能 | 技术原理 |
---|---|---|
程序集加密 | 与方法数量和大小有关 | 加密程序集中的方法和整个程序集,在程序集中的 IL 代码编译时(JIT 过程)在保护后的 Mono 中逐个方法解密 |
资源加密 | 与资源数量和大小有关 | 加密选择的资源,运行时在修改后的 Unity 引擎中解密 |
反调试 | 几乎无影响 | 使用系统层 API 或内存状态等信息检测调试器 |
Unity引擎保护(il2cpp) | 有轻微影响 | 指令混淆结合调用者检测 |
MetaData名称混淆(il2cpp) | 无影响 | 解析 global-metadat.dat 修改名称 |
内存校验(il2cpp) | 启动时有轻微影响 | 扫描并校验指令是否被篡改 |
签名校验 | 启动时有轻微影响 | 校验 APK/AAB 的开发者签名 |
文件校验 | 启动时有轻微影响 | 校验 APK 内每个文件的哈希值 |
反注入 | 几乎无影响 | 使用系统层 API 防止调试附加和内存修改 |
模拟器检测 | 启动时有轻微影响 | 检测运行设备的硬件信息与否为常规设备 |
Root 检测 | 启动时有轻微影响 | 检测当前运行系统是否为 Root 环境 |
多开检测 | 启动时有轻微影响 | 检测当前运行环境是否为多开应用 |