unity 3d專案遊戲邏輯採用c#指令碼,我們知道c#編譯生成的dll或exe是il程式集。il程式集中有乙個metadata,記錄了程式集中的一切資訊,所以容易被反編譯。傳統的防破解方式是是對il程式集進行混淆或者加殼。但是這種混淆基本上只是做一些名稱混淆或流程混淆或者加一些打花指令。這種混淆或加殼的結果基本上還是保留了il程式集的原貌,還是很容易被破解的。
因為有這些缺點,我們實現了一套自己的加密方案:直接對il程式集進行加密。改變程式集形態,這樣子,它就不再是il程式集格式了。
unity 3d專案的遊戲邏輯指令碼編譯後會生成assembly-csharp.dll。只要對它進行加密,但是這帶來乙個問題是,unity不認加密後的dll,因為它不再是dll格式了。那我們就需要修改unity底層**,好在unity是基於mono的,而mono是開源的。只要找到mono載入dll的**,對它進行逆向即可。
mono載入dll的**位於/mono/metadata/image.c檔案中的mono_image_open_from_data_with_name,**如下:
monoimage *
mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, monoimageopenstatus *status, gboolean refonly, const char *name)
//紅色部分是我們新增的,對加密過的dll進行解密
if (strstr(name, 「assembly-csharp.dll」) != null)
…return register_image (image);
}有了加密方案,我們要解決的是mono編譯問題。
1、開啟visual studio command prompt(2010)
2、進入mono-unity-4.5\msvc目錄
3、執行msbuild.exe mono.sln /p:configuration=release_eglib
注意:直接開啟mono.sln解決方案,在visual studio底下是編譯不了的。
準備ndk r9以上版本。32位或者64位均可。
linux 32位環境下編譯採用32位ndk版本。
linux 64位環境下編譯採用64位ndk版本。
cygwin32位環境下編譯採用32位ndk版本。
cygwin64位環境下編譯採用64位ndk版本。
建議使用32位linux與32位ndk來編譯
1、安裝gcc、make、automake等編譯工具
$ sudo apt-get install build-essential
cygwin環境下安裝devel裡面的包,基本編譯工具就都有了。
/home/jjl/android-ndk-r9
設定環境變數export android_ndk_root=/home/jjl/android-ndk-r9
/home/jjl/mono-unity-4.5
4、安裝依賴包
bison
gettext
libffi-dev
zlib(注意ubuntu底下包名為zlib1g-dev)
libtool
安裝以上包用 sudo apt-get install ***x
5、進入mono-unity-4.5目錄
編輯external/buildscripts/build_runtime_android.sh檔案,這個檔案是編譯指令碼
找到第14行,填上對應的ndk版本號。
perl $/prepareandroidsdk.pl -ndk=r9
-env=envsetup.sh && source envsetup.sh
注釋掉145、146行
#clean_build 「$ccflags_armv5_cpu」 「$ldflags_armv5″ 「$outdir/armv5″
#clean_build 「$ccflags_armv6_vfp」 「$ldflags_armv5″ 「$outdir/armv6_vfp」
在mono-unity-4.5目錄下執行
./external/buildscripts/build_runtime_android.sh
注意,一定要切換到mono-unity-4.5目錄底下執行,而不要進入external/buildscripts/目錄執行
執行過程中,會出現以下錯誤:
configure: error: c compiler cannot create executables
編輯external/android_krait_signal_handler/build.pl這個檔案
將#!/usr/bin/env perl –w改為#!/usr/bin/perl –w
其它的錯誤根源都因為這一行**。
再次進入mono-unity-4.5目錄,執行
./external/buildscripts/build_runtime_android.sh
注意,一定要切換到mono-unity-4.5目錄底下執行,而不要進入external/buildscripts/目錄執行
直到出現以下字樣,說明我們已經編譯成功了。
build success!
build failed? android static/shared library cannot be found… found 4 libs under builds/embedruntimes/android
注意:出build failed?字樣,並不是我們編譯失敗了,而是我們注釋掉了build_runtime_android.sh 第145、146行,有些庫就沒有編譯。只編譯我們要的庫,加快編譯速度。
編譯出來的庫位於builds/embedruntimes/android/armv7a資料夾中。
最後要編譯release版,請將build_runtime_android.sh 第66行的-g選項去掉。
Unity3d資料加密
在unity中能夠使用c 自帶的對稱演算法對資料進行加密,以下兩種加密演算法 using system using system.text using system.security.cryptography using system.io using unityengine public clas...
Unity3d時鐘指令碼
var tu1 texture2d var time1 float 0 function fixedupdate function ongui function gettime time float string var lasttime string var hour mathf.floortoi...
Unity3D 指令碼入門
1 資料型別和基本運算 a 命名空間就像在檔案系統中乙個資料夾容納多個檔案一樣,可以看作某些類的乙個容器。通過把類放入命名空間可以把相關的類組織起來,並且可以避免命名衝突。命名空間既用作程式de 內部 組織系統,也用作 外部 組織系統。使用命名空間 using 2 整型 整數 8個名稱 sbyte ...