如何防止Unity3D代码被反编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何防止Unity3D代码被反编译相关的知识,希望对你有一定的参考价值。

加密原理(无需Unity源码):
1. IDA Pro打开libmono.so, 修改mono_image_open_from_data_with_name为
mono_image_open_from_data_with_name_0,
2. 替换实现mono_image_open_from_data_with_name,
extern mono_image_open_from_data_with_name_0(...);
mono_image_open_from_data_with_name(...)
MonoImage *img = mono_image_open_from_data_with_name_0(...);
//发现数据文件头不是DLL前缀则解密 img->raw_data, 相应修改img->raw_data_len
return img;

3. 重新打包libmono.so; 替换Unity3D中的android下的版本.
4. 另外写个加密的工具,植入构建环境(MonoDeveloper或VS,添加一个打包后Build Phase来加密DLL); (ios下禁用JIT固采用AOT编译,DLL中没有逻辑代码,所以无需操心);

从AndroidManifest.xml中可以看出,腾讯的改造应该是修改并替换了入口的classes.dex,把以前的入口 UnityPlayerProxyActivity替换为com.tencent.tauth.AuthActivity. 然后去加载了自定义的几个so: libNativeRQD.so. 周全考虑,为了防止第三方委托libmono去做解密而做了防护措施. 具体实现我还没做深入分析, 应该也是老套路.

libmono.so中的mono_image_open_from_data_with_name也被替换成了mono_image_open_from_data_with_name_0.

解密(android):
方法一: ROOT android系统(最好是一部手机,别搞模拟器,慢死), 挂载LD_PRELOAD的API hook来实现.

方法二: 内存特征码提取,简单高效无敌; 机器能读,你就能读;
参考技术A 加密原理(无需Unity源码):
1. IDA Pro打开libmono.so, 修改mono_image_open_from_data_with_name为
mono_image_open_from_data_with_name_0,
2. 替换实现mono_image_open_from_data_with_name,
extern mono_image_open_from_data_with_name_0(...);
mono_image_open_from_data_with_name(...)
MonoImage *img = mono_image_open_from_data_with_name_0(...);
//发现数据文件头不是DLL前缀则解密 img->raw_data, 相应修改img->raw_data_len
return img;

3. 重新打包libmono.so; 替换Unity3D中的android下的版本.
4. 另外写个加密的工具,植入构建环境(MonoDeveloper或VS,添加一个打包后Build Phase来加密DLL); (IOS下禁用JIT固采用AOT编译,DLL中没有逻辑代码,所以无需操心);

从AndroidManifest.xml中可以看出,腾讯的改造应该是修改并替换了入口的classes.dex,把以前的入口 UnityPlayerProxyActivity替换为com.tencent.tauth.AuthActivity. 然后去加载了自定义的几个so: libNativeRQD.so. 周全考虑,为了防止第三方委托libmono去做解密而做了防护措施. 具体实现我还没做深入分析, 应该也是老套路.

libmono.so中的mono_image_open_from_data_with_name也被替换成了mono_image_open_from_data_with_name_0.

解密(android):
方法一: ROOT android系统(最好是一部手机,别搞模拟器,慢死), 挂载LD_PRELOAD的API hook来实现.

方法二: 内存特征码提取,简单高效无敌; 机器能读,你就能读;
参考技术B 进行代码混淆,增加反编译代码解析难度。
混淆工具: Dotfuscator、xeoncode、foxit
本人试验过Dotfuscator、xeoncode
前者混淆较为简单,后者混淆效果比较不错。
前者是微软开发的,有很多功能,筛选混淆代码较简单,后者成都高,但是感觉工具不完善,很多东西都需要手动操作。

不过,本人建议还是使用后者
参考技术C 进行代码混淆,增加反编译代码解析难度。
混淆工具: Dotfuscator、xeoncode、foxit
本人试验过Dotfuscator、xeoncode
前者混淆较为简单,后者混淆效果比较不错。
前者是微软开发的,有很多功能,筛选混淆代码较简单,后者成都高,但是感觉工具不完善,很多东西都需要手动操作。

不过,本人建议还是使用后者
参考技术D Unity3D的加密可以使用Virbox Protector加壳工具,能加密代码及资源,防止代码被反编译,防止资源被破解

以上是关于如何防止Unity3D代码被反编译的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Unity3D代码被反编译

如何防止Unity3D代码被反编译

Unity3D加密外壳如何做到防止反编译?

Unity3D代码加密防止反编译及资源加密

如何防止代码被反编译

如何防止Android程序被反编译