寫在前面
說好了慢慢搬博客。。但是近一個月一直在弄加密的事情。寫博客的擱置下了。這就來總結總結。
加密也是個老生長談的事情的。先不多說,在下面的文章內仔細談。先貼幾個我真正用到的參考帖子,以做感謝。
- 這個第一次瞭解到Unity加密方式的地方,基本是按照這篇來做,但過程說的特別簡略。基本上只是在加密方向上做了指引。
http://www.narkii.com/club/thread-330884-1.html - 做到一半的時候卡在了編譯libmono上面,這篇文章算是真正的點到了關於編譯libmono的所有要點。
http://www.luzexi.com/unity3d-%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91mono%E5%8A%A0%E5%AF%86dll/ - 雨鬆Momo的兩篇文章,真正幫助我完成了整個加密的工作,關於so的加密方法完全參照的雨鬆文章來做的。Momo的文章裏也提到了上面這個關於編譯libmono的文章。
http://www.xuanyusong.com/archives/3553
http://www.xuanyusong.com/archives/3571
轉載請註明,出自喵喵丸的博客 (http://blog.csdn.net/u011643833/article/details/49102423)
準備工作
一個巨坑
- 沒有什麼信心的話,請不要使用Windows+ Cygwin 來編譯libmono。我最開始的一段時間之內都在煩惱Cygwin的用法(也是我太渣渣的過),後面安裝了Ubuntu的虛擬機,上手沒什麼難度而且 真 的 很 好 用。
解密工具
- Untiy中C#的代碼最後編譯成Assembly-CSharp.dll,解密可以用de4dot(net脫殼工具)。
- 讀取上面dll的是libmono.so,我們的代碼解密工作就要在這裏完成,而so文件解密可以使用IDA(反編譯工具)。
這兩個工具纔可以幫助我們真正的查看我們的加密工作是否真的完成了。
準備內容
VMWare以及Ubuntu(也可以用Mac編譯,從大家的說法來看也比較簡單)Ubuntu安裝時推薦使用英文環境,否則命令行命令不好敲
[Windows] VMware Workstation 11.0.0正式版/註冊碼/註冊機
怎樣在VMware虛擬機中使用安裝並設置Ubuntu系統
虛擬機 Ubuntu與Windows共享文件夾的方法UnityMono源碼
https://github.com/Unity-Technologies/mono/
選取與自己Unity相合的Branch從GitHub下載即可(形如Unity4.6 Unity4.3這樣的Branch)Android NDK
我所編譯的爲 Unity4.6 的mono源碼,這個版本需要準備的是android-ndk-r9,這裏需要說明一下,一定要按照mono對應的NDK去準備,如果需要的r9。那麼r9c、 r9d等版本也不可以。【如何查看所需ndk版本】:在你下載的源碼工程中查看“/external/buildscripts/build_runtime_android.sh”有下面類似的一句
perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r9 -env=envsetup.sh && source envsetup.sh
其中 -ndk 的內容 就是所就是所需的NDK版本號。去下載即可.
編譯Libmono
這篇博文是我按照回憶來寫的。可能有一些步驟會斷開,請留言,我會補上的。
【這一部分操作我在Ubuntu中完成】
環境配置
- 將mono源碼和NDK解壓到一個你可以找到的地方。
- 配置環境變量,在Terminal中執行。
gedit ~/.bashrc
這時打開了文本編輯器,在文本的末尾添加NDK_ROOT=/home/mimi/Documents/MonoHelper/android-ndk-r9
NDK=$NDK_ROOT
ANDROID_NDK_ROOT=$NDK_ROOT
export NDK_ROOT NDK ANDROID_NDK_ROOT
NDK_ROOT配置內容即是你解壓後的ndk所在目錄 - 保存關閉文本編輯器,Terminal執行
source ~/.bashrc
,執行後你新配置的環境變量就可以生效了,可以在Terminal中輸入$NDK
查看輸出來確定是否生效
編譯過程
此處先不談雨鬆Momo博主提到的代碼更改,單純說如何編譯。各位真正編譯的時候可以參照Momo對build_runtime_android.sh文件的更改。
- 將mono根目錄下/external/buildscripts中的內容複製到mono根目錄下
- Terminal cd到mono根目錄下,執行
./build_runtime_android.sh
(在編譯途中如果出現找不到xxx命令的情況,請大家根據命令行的提示,使用apt命令安裝 (我只記得autoconf automake libtool 這三個必須的了Q v Q)) - 編譯開始需要注意輸出的前面幾行(檢測完ndk之後 接下來就是這個內容),如果出現了形如
perl -w:No such File or Dictionary
這樣的提示。那麼,先使用perl -v
確認你已經安裝了perl。如果已經安裝,那麼cd 到/external/android_krait_signal_handler目錄下,Terminal 執行./build.pl
.執行成功之後,這個目錄之中呈現下圖所示的目錄結構
在下面的留言中~有人提到,build.pl編譯的時候需要把perl -w前的env去掉,不然也會perl -w: No such File or Dictionary
報錯(這個東西我貼在這裏給大家做參考,似乎我當時沒有遇到這樣的問題) - 其餘特別需要注意的地方我已經沒有印象了(所以有什麼問題大家請留言,我儘量幫忙解決),正確執行後開始不斷刷屏幕, 最後輸出有SUCCESS就證明成功編譯了libmono。
- 編譯過後,libmono.so存儲在 /build/xxxx/android目錄之下, 裏面有armv5、armv6、armv7以及x86這4個文件夾,裏面均有libmono.so。(build_runtime_android.sh內會執行build_runtime_android_x86.sh 所以不用另外執行build_runtime_android_x86.sh來獲取x86下的libmono.so)
調試
那麼我們編譯好了libmono如何使用呢?
【這一部分操作我在Windows中完成】
- 首先從Unity中導出Android工程,方法參見Unity3D研究院之腳本生成Android Google Project
- 在導出的Android工程的libs目錄下,可以發現armv7以及x86文件夾,將我們自己編譯生成的libmono.so對應的覆蓋原本的文件(armv5和armv6怎麼辦? 我選擇了忽略(:з」∠))。
- ant 或者是在Eclipse中編譯安卓工程,如果遊戲正常執行了,那麼恭喜你。libmono編譯正確了。
還有一些內容
( ⊙ o ⊙ )出於自己堆疊了好久的工作量,最近在趕工,博客比較難產。先寫出我後面要寫的一些內容,估計還有一篇文章就結束代碼加密的內容了
- 加密Dll
- 在libmono中做dll的相關解密
- 加密so,隱藏自己對dll解密的方法