Unity开发源码的加解密一mono.dll和libmono.so编译

源码的加密,只是加了一层防护,不是绝对的安全,参考网络大部份类似的实现方式:

  1. 混淆自定义库
  2. 加解密Assembly-CSharp.dll
  3. 自动化工具集成

一、使用各种加密方法制作C++动态库DEncrypt.dll

加密方法,使用xxtea示例

解密方法

检查导出的方法

除了xxtea,也可以使用des,aes等对称加密方式

参考:C++动态库制作

二、使用C#调用DEncrypt.dll加密Assembly-CSharp.dll

C#代码引用DLL

调用,会在dll文件目录生成带指定后缀的加密后文件,如果后缀为空,替换文件

三、编译mono.dll

1.下载mono 对应版本(当前项目是uniyt 5.5)

2.修改mono_image_open_from_data_with_name方法,添加解密代码,在加密的时候加个前缀,如果存在就解不存在不执行

原本计划写个静态库加解密方法写在一个文件中,方便维护(也是第一步制作dll的原因)。因技能能力有限,试了N次静态库链接有问题,遂放弃,将源码复制到mono项目中mono\metadata\crypt  crypt是创建的目录,将添加的所有源码复制到这个目录,添加到工程中

3.编译mono.dll

需要安装VS2010

编写脚本BuildMono.bat,编译32位和64位dll,执行成功后会在\builds\embedruntimes 生成win32和win64位目录,对应着32和64位的mono.dll

在打包window项目时,用新的mono.dll替换打包后的XXX_Data\Mono\mono.dll文件,windows不是重点,不再描述。

四、编译libmono.so

编译libmono.so比较麻烦,Window和macOS都需要配置环境,下面说一下windows

参考 Unity防破解 —— 重新编译mono

1.下载mingw-get-setup.exe 安装到C盘或D盘根目录 在basic 全选安装

2.下载Android NDK,解压到C:\MinGW\msys\1.0\home\maxx\android-ndk_auto-r10e 如果home\maxx没有,创建即可,注意ndk的目录名称要一致

3.下载zip,解压到C:\MinGW\msys\1.0\bin

4.修改

5.修改

6.修改

7.修改

8.执行

9.修改

10.修改

11.修改

12.再次执行./external/buildscripts/build_runtime_android.sh,成功后会在mono-unity-5.5\builds\embedruntimes\android 生成armv7a和x86两个文件夹

五.替换libmono.so和加密后的Assembly-CSharp.dll

下一篇会介绍Unity开发源码的加解密二