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