加密環境
引擎版本:Unity3D 5.3.4 及更高版本 (使用Mono而並非IL2CPP)
操作系統:CentOS 6.2(Final)
加密環境:Android、IOS(暫定)
加密對象:C#源代碼(dll文件)
解密方法:libmono.so (重點:加入解密算法並重編譯此文件)
加密的目地
.NET Reflector等反編譯工具 無法通過對dll反編譯得到源碼
注意事項
dll的加密算法和libmono.so解密算法一致
思路分析
重點:我們需要對libmono.so重編譯,加入我們的解密算法。
准備環境
編譯系統:linux或mac os
我的編譯環境:centos 6.2 Final,建議在linux或mac os中編譯 libmono.so
linux安裝運行庫
git
在編譯過程中,可能需要通過git獲取某些運行庫。
查看是否安裝git:git –version
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
其它package
autoconf
automake
bison
gcc
gettext
glib >= 2.0
libtool
make
perl
glib >= 2.0 這個一直安裝失敗
centos安裝軟件
在root權限下,通過以下命令來安裝軟件:
yum install [nginx][php][php-fpm][mariadb][mariadb-server][mysql][mysql-server]...
Unity安裝Android模塊
確保已安裝Unity引擎,並且Android模塊已安裝,Android SDK已安裝並更新,保證可以打包APK
正式/測試工程
使用Unity創建一個加密測試項目或正式項目,用來用加密
Unity mono
unity的mono和原生mono有些不一樣,所以需要去github拉取unity的mono庫
https://github.com/Unity-Technologies/mono
monobuildtools
unity mono打包工具
https://github.com/Unity-Technologies/monobuildtools
Android SDK Tool/Android6.0
我使用Unity5.3.4在windows上打包apk,需要android sdk tool版本為23,Android6.0,所以同樣請先准備好環境
Android打包工具
Android Studio:http://www.androiddevtools.cn/ 或者:http://tools.android-studio.org/
Eclipse:https://marketplace.eclipse.org/content/android-development-tools-eclipse
Andmore - Eclipse Android Tooling:https://projects.eclipse.org/projects/tools.andmore
android對應的NDK版本
查看路徑:external/buildscripts/build_runtime_android.sh
在文件的上半部分就可以看到需要的NDK版本,我在2016-06-25 clone的,需要的NDK版本為r10e
android-ndk 下載
根據android和unity的版本不同,需要的ndk版本也不同,我這兒以2016-06-25 clone的倉庫為例,需要ndk-r10e
x64
android-ndk-r10e-linux-x86_64.bin:http://pan.baidu.com/s/1dDAqnK1
x86
android-ndk-r10e-linux-x86.bin:http://pan.baidu.com/s/1sjoneRr
設置android ndk環境變量
反編譯工具測試加密結果
.Net反編譯工具
主要加密對象是Assembly-CSharp.dll,所以可以准備幾款.Net反編譯工具來測試加密結果
下面舉例.net的反編譯工具
.NET Reflector:http://www.red-gate.com/products/dotnet-development/dotnet-developer-bundle/
C語言反編譯工具
如果對libmono.so也加密的話,那還需要准備幾款C語言反編譯工具
下面舉例C語言反編譯工具
ida pro
官網:https://www.hex-rays.com/products/ida/
代銷商:http://xlsoft.com.cn/category/%E5%8F%8D%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7/
libmono.so(解密方法)
加密C#的dll
根據自己的實際情況,對導出的 assets/bin/Data/Managed/Assembly-CSharp.dll 進行加密
在so中解密dll
Mono加載dll的代碼的文件位於/mono/metadata/image.c
mono_image_open_from_data_with_name
打開image.c,找到 mono_image_open_from_data_with_name 方法,把解密方法寫在這兒。此方法大概在1807行
MonoImage * mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name) { MonoCLIImageInfo *iinfo; MonoImage *image; char *datac; if (!data || !data_len) { if (status) *status = MONO_IMAGE_IMAGE_INVALID; return NULL; } //在這兒對加密過的dll進行解密 if (strstr(name, “Assembly-CSharp.dll”) != NULL) { //這里是解密過程,我們采用的是xxtea加解密算法。 } //..... return register_image (image); }
遇到的問題
AndroidManifest.xml Error
Unity導出Android Project之后,AndroidMainifest.xml中有一行會報Error: android:debuggable="false" ,無法識別。
解決辦法:http://stackoverflow.com/questions/24204140/android-error-when-i-set-androiddebuggable-false-or-true
CentOS安裝軟件 Error
在CentOS上安裝一些軟件時遇到:Errno 256] No more mirrors to try
確保系統已連接網絡,輸入以下命令(作用:重建緩存)
yum clean all
yum makecache
Linux安裝ndk.bin?
資料:Linux下安裝JDK-(bin版) http://blog.csdn.net/sonnet123/article/details/9290561
安裝步驟
以下命令都是ROOT身份運行
1. 安裝ndk-文件拷貝
#mkdir /usr/ndk #cd /usr/ndk #cp /xxxx/android-ndk-r10e-linux-x86.bin /usr/ndk
2. 安裝ndk-安裝和配置環境變量
1. ./android-ndk-r10e-linux-x86.bin 成功后終端輸出 Everything is OK
3. 安裝ndk-安裝成功
Everything is Ok [root@workstation ndk]# source /etc/bashrc [root@workstation ndk]# echo $ANDROID_NDK_ROOT /usr/ndk/android-ndk-r10r [root@workstation ndk]#
提示要ndk9?
查看參考資料caption的修改
./configure沒有那個文件或目錄
查看README文件
tar.xz安裝
Linux下解壓tar.xz格式壓縮文件
資料:http://blog.csdn.net/longerzone/article/details/8707118
安裝glib
我安裝的是glib-2.48.1
1 ./configure 2 make 3 make install
這里configure主要是配置並生成Makefile文件,make主要是對程序進行編譯,make install主要是對編譯好的程序進行安裝
資料:http://www.linuxfromscratch.org/blfs/view/svn/general/glib2.html
安裝glib-提示缺少libffi
不知道大家注意到沒有,在configure時,出現缺少相關庫時解決方法都可以使用 庫-devel 解決,那么這個
devel是什么呢?devel是個開發包,只有在開發程序時才會安裝。里面包含了頭文件、以及開發用到的相關庫和
幫助文件等等。一般安裝某些工具的時候就會出現
glib的安裝:http://blog.chinaunix.net/uid-26126915-id-3368644.html
安裝glib依賴庫
libffi
下載,解壓,執行 ./configure make make install 進行安裝
libpcre >=8.13
./configure --with-prce=/usr/local/prec/
tar.bz2安裝
命令:tar -xjvf xxx.tar.bz2 來解壓,得到解壓后的目錄再進一步安裝
其它錯誤
1. 文件格式錯誤
/bin/bash^M: bad interpreter: 沒有那個文件或目錄
方法二:在windows下用Notepad++修改格式為unix
PKG_CONFIG_PATH environment
如果配置 PKG_CONFIG_PATH
Linux操作知識
查看系統版本:
lsb_release –a
查看linux系統位數:
getconf LONG_BIT 輸出32則是x86,輸出64則是x64
給shell賦於root權限:
1. 輸入 su 2.輸入root密碼 回車
執行腳本:chmod 700 hello.sh
文件拷貝
cp [選項] 源文件或目錄 目標文件或目錄
訪問共享文件夾
1.virtual box設置共享文件夾
2. 這一步是在mnt下創建share目錄,可不創建
mkdir /mnt/share
步驟3,有兩種方法
如果你希望把共享目錄放在share下,並且mnt也創建 了share目錄:
#sudo mount -t vboxsf 共享文件夾名/mnt/share ,比如我的:
mount -t vboxsf mono/mnt/share
你希望直接放在mnt下:
#sudo mount -t vboxsf 共享文件夾名/mnt,比如我的:
mount -t vboxsf mono/mnt
4. 在 文件系統 – mnt 下就可以看到共享內容了
cd 目錄操作
以root用戶登錄之后,默認是在當前用戶文件夾內,往上跳到文件主目錄中:cd ../../
virtualbox 虛擬和主機粘貼板共享
1. 從virtualbox官網下載對應版本的增加工具包,進行安裝
2. 在linux中加載工具包 ios鏡像,進行安裝
3. 虛擬機和主機可以共享粘貼板內容了
Centos安裝軟件
Centos YUM更新軟件:http://jingyan.baidu.com/article/19020a0ac84c3d529d2842ee.html
centos安裝軟件:https://www.centos.org/forums/viewtopic.php?t=871 查找某一類軟件:yum list *Firefox*
文獻資料
Perl語言(*.pl文件)
perl是解釋性語言, 可用於linux/unix系統。可以理解為和windows下的bat一樣。
- *.pl 是perl語言的庫文件,通常用 require xx.pl; 來加載
- *.pm 是perl語言的模塊文件,通常用 use module; 來加載
- *.plx 是perl語言的腳本文件
運行: ./路徑/文件名 (前面的“./”表示運行命令)
結束: ctrl + c
注釋
單行:#開頭,有個例外perl程序第一行也是#開頭
多行:=pod 注釋多行代碼塊 =cut
參考資料
Captain
Unity3d 加密 Assembly-CSharp.dll (Android平台) 全記錄:http://blog.csdn.net/huutu/article/details/50829828
技術人生
Unity3D-重新編譯Mono加密DLL
雨松
Unity3D研究院之Android加密DLL與破解DLL .SO(八十一):http://www.xuanyusong.com/archives/3553
其它
Unity 3d腳本加密方案:http://www.cppcourse.com/u3d-encryption.html
進度
已完成
- ndk安裝及配置完成
- unity mono庫clone到本地
遇到問題
- 安裝gtk卡在 libffi 版本太低
我的環境
IL2CPP
之后的項目極可能會使用IL2CPP。如果是IL2CPP的話,就無需這一套加密了,因為通過IL2CPP生成的包中並不存在dll,而是二進制文件。
更多關於IL2CPP的資料,可以查看Unity官方的資料,或者我之前的文章:http://www.cnblogs.com/zhaoqingqing/p/3842690.html