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應該也是可以的。
編譯mono的過程其實還是很繁瑣的,一開始我嘗試在linux下編譯mono,然而各種失敗,我想unity可能並不想開發者自己編譯mono,所以給的文件中各種坑,然後參考了雨凇編譯mono的文章,結果發現也是各種失敗,汗……後來意外發現在 「ulua&cstolua技術***①(341746602)」「不說害怕」大神寫過一篇編譯mono的教程,於是拿過來試了一下,踩了幾個小坑後就順利編譯成功了,下面就直接這篇簡單修改一下貼出來啦:
1.獲得unity-mono
我們需要編譯的是 針對unity-4.6 mono的安卓so,所以首先需要clone unity-mono
,然後切到分支unity-4.6,(注意:已經測試編譯過unity-5.2,所以對於最新的版本應該也可以的)
2. 準備編譯環境
參考:android-ndk-r10e
*************************=
第14行確認:
例如這樣: perl $/prepareandroidsdk.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh
>>>>>>>>>>>>>>>>>>>>>>>>>
放到d:\mingw\x86\msys\1.0\home\zhupf\android-ndk_auto-r10e 【zhupf 是我的windows登陸名字】
5. 修改一行指令碼
檔案e:\work\mono\external\buildscripts\prepareandroidsdk.pm 需要處理一下:
elsif(lc $^o eq 'cygwin')
改成,不然不認識我們的編譯環境
elsif(lc $^o eq 'cygwin' or lc $^o eq 'msys')
5. 啟動
執行 d:\mingw\x86\msys\1.0\msys.bat,切換到mono 工程目錄,如:e:\work\mono\ ,然後執行編譯指令碼:./external/buildscripts/build_runtime_android.sh
7. 第一次會失敗
8. 修改android_krait_signal_handler下的指令碼
1)--------------
prepareandroidsdk.pm 內
elsif(lc $^o eq 'cygwin')
改成,不然不認識我們的編譯環境
elsif(lc $^o eq 'cygwin' or lc $^o eq 'msys')
2)--------------
build.pl內
#!/usr/bin/env perl -w
改成
#!/usr/bin/perl -w
prepareandroidsdk::getandroidsdk(undef, undef, "r9");
改成
#prepareandroidsdk::getandroidsdk(undef, undef, "r9");
9. 重新編譯
./external/buildscripts/build_runtime_android.sh
10. 成功編譯到
e:\work\mono\builds\embedruntimes\android
11. 注意
1)--------------
這樣會編譯出針對4種處理器的庫
armv5, armv6_vfp, armv7a, x86
可以根據情況修改(在這個檔案最後,用#注釋掉不需要的)
e:\work\mono\external\buildscripts\build_runtime_android.sh
以便精簡
比如:
#clean_build "$ccflags_armv5_cpu" "$ldflags_armv5" "$outdir/armv5"
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除錯的除錯資料
參考:
其中加-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的問題 :
重新編譯索引
資料庫執行一段時間後,由於大量的資料變化,會導致一些表的索引實效,造成sql語句執行速度過慢,使資料庫出現大量的鎖,日常維護中應該對資料庫定時重新編譯索引。編譯索引 如下 setfeedback off column rebuild index heading spool temp rebuild ...
Raize 重新編譯
最近專案用到了raize5的日曆控制項,需要在中文版本與英文版本中切換顯示,這個需要修改 rzpopups.pas,修改了需要重新編譯.費老大勁了.首選修改 rzborder.pas,不然編譯不過 再改 rc5 source build rc5.cmd 執行ok,替換dcu,重新啟動ide,完美 這...
devexpress 漢化 重新編譯
dxperience v2009 vol 1 9.1.3 漢化 本地化 編譯指令碼 試用版 更新說明 論壇 部落格 資源 dxperience 官方本地化資源 2009 04 21 dxperience 官方編譯指令碼 2009 04 01 dx 9.1.3 最新試用版 源 重新編譯 官方30天試用...