Unity4.x版本导出android包时,只能选择mono,无法使用il2cpp,这就造成了我们的程序集很容易被修改……很多朋友在发布项目时觉得即使代码暴露出去也没什么关系,只有项目火了才有必要等,然而一旦游戏被破解,很容易对游戏生态造成无法想象的灾难,这里写两篇博文记录一下最近加密Dll的过程。
1.想要加密Dll的前提条件是我们必须修改mono,因为Unity并没有在mono中为开发者提供加密的接口或者功能,所以我们必须手动编译mono,从而替换掉Unity中原本的mono。
2.需要一种加密Dll的可逆算法,常见的DES,TEA,XXTEA等,当然需要是C语言的实现
3.mono中对key的保护,因为即使.so文件,也是可以被反编译的,如神器IDA等
4.一些打包工具或者脚本,因为一旦自己加密了Dll就无法完全依赖Unity打包了,整个打包流程会变得相对繁琐,这事需要反复打包的话最好还是优化对应的工具。
这两篇博文都是基于Untiy4.7版本的,对应的mono是4.6,当然我想如果是其他版本的mono应该也是可以的。
下载ulua编译的那个MinGW(msys)【注意:里面包含x86和x64我用的x86版本,但同时支持编译出各个版本的结果】放到D:\MinGW\【注意MinGW一定要放在某个磁盘的根目录,否则会造成MinGW环境变量错误,导致编译失败】
上面下载的文件是一个.exe的文件,运行一下它就会在当前目录解压,解压完成把目录名改成android-ndk_auto-r10e
放到
D:\MinGW\x86\msys\1.0\home\zhupf\android-ndk_auto-r10e【zhupf是我的windows登陆名字】
运行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/envperl-w改成#!/usr/bin/perl-w
PrepareAndroidSDK::GetAndroidSDK(undef,undef,"r9");改成#PrepareAndroidSDK::GetAndroidSDK(undef,undef,"r9");
3)--------------\jni\Application.mkNDK_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调试的调试数据
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.exelibmono.so2)--------------$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip.exelibmono.so