Unity4.x版本导出android包时,只能选择mono,没法使用il2cpp,这就形成了咱们的程序集很容易被修改……不少朋友在发布项目时以为即便代码暴露出去也没什么关系,只有项目火了才有必要等,然而一旦游戏被破解,很容易对游戏生态形成没法想象的灾难,这里写两篇博文记录一下最近加密Dll的过程。html
1. 想要加密Dll的前提条件是咱们必须修改mono,由于Unity并无在mono中为开发者提供加密的接口或者功能,因此咱们必须手动编译mono,从而替换掉Unity中本来的mono。linux
2.须要一种加密Dll的可逆算法,常见的DES,TEA,XXTEA等,固然须要是C语言的实现android
3.mono中对key的保护,由于即便.so文件,也是能够被反编译的,如神器IDA等git
4.一些打包工具或者脚本,由于一旦本身加密了Dll就没法彻底依赖Unity打包了,整个打包流程会变得相对繁琐,这事须要反复打包的话最好仍是优化对应的工具。github
这两篇博文都是基于Untiy4.7版本的,对应的mono是4.6,固然我想若是是其余版本的mono应该也是能够的。算法
编译mono的过程其实仍是很繁琐的,一开始我尝试在linux下编译mono,然而各类失败,我想Unity可能并不想开发者本身编译mono,因此给的文档中各类坑,而后参考了雨凇编译mono的文章,结果发现也是各类失败,汗……后来意外发如今 “ulua&cstolua技术交流群①(341746602)”“不说惧怕”大神写过一篇编译mono的教程,因而拿过来试了一下,踩了几个小坑后就顺利编译成功了,下面就直接这篇简单修改一下贴出来啦:windows
咱们须要编译的是 针对unity-4.6 mono的安卓SO,因此首先须要clone Unity-mono ,而后切到分支unity-4.6,(注意:已经测试编译过unity-5.2,因此对于最新的版本应该也能够的)ide
下载ulua编译的那个MinGW(msys) 【注意:里面包含x86和x64我用的x86版本,但同时支持编译出各个版本的结果】放到D:\MinGW\ 【注意MinGW必定要放在某个磁盘的根目录,不然会形成MinGW环境变量错误,致使编译失败】工具
参考:
https://github.com/jarjin/ulua_runtime_project
http://pan.baidu.com/s/1gd1Wyx9#path=%252Fulua_src测试
上面下载的文件是一个.exe的文件,运行一下它就会在当前目录解压,解压完成把目录名改为 android-ndk_auto-r10e
放到
D:\MinGW\x86\msys\1.0\home\zhupf\android-ndk_auto-r10e 【zhupf 是个人windows登录名字】
zip.exe不少,这里直接在文章提供一个Zip, 下载并解压后直接放到-> D:\MinGW\x86\msys\1.0\bin
运行 D:\MinGW\x86\msys\1.0\msys.bat,切换到mono 工程目录,如:E:\Work\mono\ ,而后执行编译脚本:./external/buildscripts/build_runtime_android.sh
自动用git下载android_krait_signal_handler但编译可能失败【须要把git加到环境变量中】
下载E:\Work\mono\external\android_krait_signal_handler
但编译失败
2)--------------
build.pl内
#!/usr/bin/env perl -w
改为
#!/usr/bin/perl -w
PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9");
改为
#PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9");
3)--------------
\jni\Application.mk
NDK_TOOLCHAIN_VERSION := clang3.3
改为
#NDK_TOOLCHAIN_VERSION := clang3.3
./external/buildscripts/build_runtime_android.sh
E:\Work\mono\builds\embedruntimes\android
2)--------------
编译出的so文件大约8m, 是Debug
若要编译release版本
对于arm7等,修改build_runtime_android.sh
只要把CFLAGS里的-g改为-O2就能够了 【注意-O2 是gcc编译优化选项,其中‘O’是英文字母'O’】
对于x86,修改build_runtime_android_x86.sh
去除CFLAGS里的-g
注:O是优化等级(Optimize)的参数
-g选项,表示产生供gdb调试的调试数据
参考:
http://www.xuanyusong.com/archives/3553
其中加-Wl,–gc-sections \ 这个我这边试了会失败,能够不加。
12. strip去除调试信息(能够加到build_runtime_android.sh和build_runtime_android_x86.sh脚本)
1)--------------
$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip.exe libmono.so
2)--------------
$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip.exe libmono.so
下篇文章会介绍如何加密Dll和在mono中保护key的问题 : http://www.cnblogs.com/lixiang-share/p/5979981.html