iOS Unity3D应用保护最佳实践
#
iOS Unity程序介绍Unity3D 是由 Unity Technologies
公司开发的一款专业游戏引擎,可以让开发者轻松创建三维视频游戏、建筑可视化、实时三维动画等工具和应用。
Unity3D 具有跨平台、高效的开发语言和工具、丰富的插件和极易上手等优势,已逐渐成为备受开发者青睐的游戏引擎。
Unity3D 程序使用 C# 语言开发,可以通过 Unity 编译环境生成各个平台的程序,Unity 提供了 Mono 和 il2cpp 两种不同的编译方式,但编译iOS Unity程序一般都是il2cpp格式,通过一些手段和工具可以将dump出c#程序集和提取出资源,所以对于高安全性需要的场景,不经过保护很容易被逆向破解。
#
安全性问题#
代码安全问题il2cpp 是 Unity 提供的另一种编译方式,它将 C# 代码转换成 C++ 代码,最后直接编译成了相应平台的 Native 可执行格式,位于 libil2cpp.so、GameAssembly.dll 或 UnityFramework 等文件中(依平台而定),转换成 Native 程序后,代码的分析难度理应会更大,但实际上并非如此,虽然 C# 代码由 IL 指令转换成了 Native 指令,但依然存在 .NET 元数据信息,存在于程序目录下的 global-metadata.dat 文件中,通过 il2cppDumper 等工具可以直接生成 .NET 文件格式。
Dump 出 C# 程序集后,虽然无法直接看到 .NET 方法中的逻辑,但可以直接定位到方法对应的 il2cpp 模块的地址,篡改代码逻辑,破坏正常功能。
#
资源易提取Unity3D 程序在编译打包阶段会通过 Unity 编辑器将资源打包成 Asset Bundle 文件,Asset Bundle 是一种公开的文件格式,使用 Asset Studio
等工具可以对其解析、展示和提取。
Unity3D 程序中的有些骨骼模型和场景等资源一般是开发商耗费大量的精力开发的,如果不保护,很容易被窃取进行二次开发。对于网络游戏,还可以将一些场景资源的材质属性改为透明,实现透视效果。
#
功能介绍#
加密选项#
Metadata加密Virbox Protector
可以对 il2cpp 的global-metadata.dat
文件加密或隐藏,防止直接 Dump 中 C# 程序集,并对global-metadata.dat
的数据结构进行混淆和加扰,防止Dump出原始的元数据信息。
#
Metadata名称混淆Metadata名称混淆,可以将类名混淆成无意义的字符串名称,可以无法直观的找到类名的调用关系。
注意:1)该功能目前只能混淆类名,不能混淆方法名,调用到其他资源的类名也不会进行混淆。2)若程序代码里涉及到跨模块反射调用这种情况,则OC名称混淆可能会导致程序界面功能无法正常使用的情况。
#
内存校验校验 il2cpp 核心模块的内存完整性,防止核心逻辑被篡改,内存校验功能是在程序加载时校验自身完整性,如果发现程序被篡改,则会退出进程。
#
调试器检测调试是逆向分析时的重要手段,可以在庞大的二进制指令中迅速定位到相关的逻辑。
调测调试器,可以检测当前模块的进程是否被 IDA Pro/lldb等工具调试,被调试则退出阻止运行。
#
签名校验校验ipa中的开发者签名证书(Team id),防止ipa被第三方二次打包重签名。
1)若想使用签名校验功能,则必须要启用签名;2)若启用签名,则签名校验选项可选可不选。
#
签名设置若勾选启用签名,签名证书选择和Xcode编译xcarchive时的证书一致,则程序保护生成的app默认已签名;
若不勾选启用签名,则程序保护生成的app默认不签名,需自行在对加固后的app手动签名(比如使用codesign、iOS App Signer工具等);
#
资源加密Virbox Protector
提供了资源加密的功能,通过一些加密算法对资源进行加密,运行时通过修改unity引擎中切片去读取资源的位置,进行解密读取操作,可以防止反编译等工具可以对资源进行解析、展示和提取。
大小优先选项:
1)勾选资源加密选项进行保护后,文件的体积会增加,资源文件越多则文件体积就增加的越大;
2)为了兼容对文件体积有要求的设备,勾选
大小优选选项
后,则加密能力会相对降低,因此文件的体积增加不会那么大。
#
操作指引#
界面操作- 直接将需要保护的
.ipa/.app
拖进Virbox Protector
工具界面; - 在加密选项处选择所需的功能并勾选,启用签名选择证书;
- 在
资源加密
页点击启用
即可打开资源加密功能,再点击选择文件
选择需要加密的资源文件;
- 界面进行设置完成后,点击
保护选中项目
,等待保护完成即可。
#
命令行操作#
命令行工具Virbox Protector
的命令行工具 virboxprotector_con
的默认路径位于:
Windows:C:\Program Files\senseshield\Virbox Protector 3\bin
Linux:/usr/share/virboxprotector/bin
macOS:/Applications/Virbox Protector 3.app/Contents/MacOS/bin
使用配置文件保护
使用工具界面进行保护,在被保护的程序旁边会生成 .ssp
文件,然后调用virboxprotector_con
:
virboxprotector_con <input_file> -o <output_file>
virboxprotector_con
会自动查找 <input_file>.ssp 作为配置文件开始保护。
无配置文件保护
如果没有配置文件,virboxprotector_con
会使用默认参数保护,可以传入具体参数覆盖默认选项,参考命令行选项。
以上两种方式任选其一即可。
#
命令行选项加密选项
选项 | 参数 | 默认选项 |
---|---|---|
内存校验 | --mem-check= | 0 |
Metadata名称混淆 | --metadata-rename= | 0 |
调试器检测 | --detect-dbg= | 0 |
签名校验(iOS) | --sign-check= | 0 |
启用 | -res-enc= | N/A |
资源列表 | -res <resource_list> | N/A |
举例
对ipa保护,勾选内存校验、调试器检测、启用资源选项,命令参考如下:virboxprotector_con test.ipa --mem-check=1 --detect-dbg=1 --res-enc=1 -res "*" -o protector/test.ipa
签名选项
选项 | 参数 |
---|---|
启用签名 | --sign= |
证书名称 | --identity= |
ipa包输出 | --ipa= |
举例
1.使用命令行查看系统上的证书security find-identity -v -p codesigning2.对ipa保护,勾选内存校验、调试器检测和签名校验选项,并启用签名,命令参考如下:virboxprotector_con test.ipa --mem-check=1 --detect-dbg=1 --sign-check=1 --sign=1 --identity="证书id" -o protector/test.ipa
#
保护方案请根据自己程序的特性,可以在加固时勾选对应的选项。
功能 | 技术原理 | 性能 | 稳定性和兼容性 |
---|---|---|---|
内存校验 | 扫描并校验指令是否被篡改 | 启动时有轻微影响 | 高 |
MetaData加密 | 指令混淆结合调用者检测 | 几乎无影响 | 高 |
MetaData名称混淆 | 解析 global-metadat.dat 修改名称 | 无影响 | 高 |
调试器检测 | 使用系统层 API 或内存状态等信息检测调试器 | 几乎无影响 | 高 |
签名校验 | 校验证书的TeamID | 无影响 | 高 |
资源加密 | 加密选择的资源,运行时在修改后的Unity引擎中解密 | 与资源数量和大小有关 | 高(和程序有关) |
#
问题#
Xcode环境下加固appXcode16以下版本
1.在Target->Build Phases->New Run Script Phases创建Run Script;
2.在Run Script添加如下脚本;
3.然后进行build,则默认在原app目录下生成一个protected文件夹,目录里即为加固后的app或ipa。
Xcode16以上版本
1.在Xcode 16版本创建新的项目;
2.在Edit Scheme->Build->Post-actions新建Run Script;
3.在Run Script添加脚本;
4.然后进行build,则默认在原app目录下生成一个protected文件夹,目录里即为加固后的app或ipa。
脚本示例,参考如下:
echo "开始执行加固命令,根据需求添加命令参数,参考如下""/Users/sense/Desktop/Virbox Protector 3 Trial.app/Contents/MacOS/bin/virboxprotector_con" "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app" --detect-dbg=1 --sign-check=0 --sign=1 --identity="Apple Development: 27XXXXXX7@qq.com" --ipa="${TARGET_BUILD_DIR}/protected/${PRODUCT_NAME}.ipa"
#
非越狱手机上安装ipa【注】这种情况只在个人测试时才会出现这个问题,如果程序正常上架后,在app store里下载,就不会区分手机是越狱还是非越狱。
问题:若加壳时文件签名证书选择和Xcode编译xcarchive时的证书不一致,程序重新签名,如何在非越狱手机上安装程序?
解决1:重新签名时,证书用一致的。
解决2:
1、下载爱思助手,并打开
2、连接设备
3、点击爱思助手的工具箱,选择”IPA签名“,选择使用“Apple ID签名”
4、点击“添加Apple ID”,输入开发者账号,选择设备UDID,点击添加。
4、选择ipa文件,选择对应的Apple ID,点击开始签名
5、签名成功后,点击“打开已签名IPA位置”,可以看到重签后的IPA
6、在非越狱手机上可以安装成功(注:这种情况下签名的ipa只能在该设备ID上安装)。
#
崩溃信息若程序加壳后在手机上运行崩溃,需要将崩溃信息提供给Virbox人员,如何获取崩溃信息?
1、手机连接电脑,保证手机ip地址要和电脑IP地址在同一网段内。
2、打开Xcode ,选择Window->Devices and Simulators选项;
2、点击View Device Logs选项;
3、若手机ip地址要和电脑IP地址在同一网段内,在手机上运行的app崩溃后,日志会自动同步到此页面;
4、选中Type为Crash,点击右键Export log,将该日志保存到本地。
#
如何用命令给app签名1、使用该命令查询电脑上的证书
security find-identity -v -p codesigning
2、使用该命令对app进行签名
codesign -fs <证书信息> ***.app
#
如果将app打包成ipa1、创建一个文件夹,名称为Payload;
2、将保护后的.app文件放入该文件夹中;
3、将Payload文件夹进行压缩(默认压缩为.zip);
4、将后缀名.zip改名为.ipa;