Unity Mono腳本 加密


加密環境

引擎版本:Unity3D 5.3.4 及更高版本 (使用Mono而並非IL2CPP)

操作系統:CentOS 6.2(Final)

加密環境:Android、IOS(暫定)

加密對象:C#源代碼(dll文件)

解密方法:libmono.so (重點:加入解密算法並重編譯此文件)

加密的目地

.NET Reflector等反編譯工具 無法通過對dll反編譯得到源碼

注意事項

dll的加密算法和libmono.so解密算法一致

思路分析

image

重點:我們需要對libmono.so重編譯,加入我們的解密算法。

准備環境

編譯系統:linux或mac os

我的編譯環境:centos 6.2 Final,建議在linux或mac os中編譯 libmono.so

linux安裝運行庫

git

在編譯過程中,可能需要通過git獲取某些運行庫。

查看是否安裝git:git –version

CentOS7 yum 安裝git

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,所以同樣請先准備好環境

image

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

https://github.com/Unity-Technologies/mono/blob/unity-5.3/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安裝軟件

CentOS6.X安裝QQ2012

終於可以在centos下使用QQ啦!

Centos YUM更新軟件:http://jingyan.baidu.com/article/19020a0ac84c3d529d2842ee.html

centos安裝軟件:https://www.centos.org/forums/viewtopic.php?t=871       查找某一類軟件:yum list *Firefox*

文獻資料

Unity 自動導出 AndroidStudio 項目

 

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

http://www.luzexi.com/unity3d/%E6%B8%B8%E6%88%8F%E6%9E%B6%E6%9E%84/%E5%89%8D%E7%AB%AF%E6%8A%80%E6%9C%AF/2015/04/11/Unity3D-%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91Mono%E5%8A%A0%E5%AF%86DLL.html

雨松

Unity3D研究院之Android加密DLL與破解DLL .SO(八十一):http://www.xuanyusong.com/archives/3553

其它

Unity 3d腳本加密方案:http://www.cppcourse.com/u3d-encryption.html

進度

已完成

  1. ndk安裝及配置完成
  2. unity mono庫clone到本地

遇到問題

  1. 安裝gtk卡在 libffi 版本太低

我的環境

image

 

IL2CPP

之后的項目極可能會使用IL2CPP。如果是IL2CPP的話,就無需這一套加密了,因為通過IL2CPP生成的包中並不存在dll,而是二進制文件。

更多關於IL2CPP的資料,可以查看Unity官方的資料,或者我之前的文章:http://www.cnblogs.com/zhaoqingqing/p/3842690.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM