Unity防破解 重新編譯mono

2022-07-15 18:03:16 字數 3335 閱讀 9069

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天試用...