【Unity】代碼加密(一)編譯libmono

寫在前面

說好了慢慢搬博客。。但是近一個月一直在弄加密的事情。寫博客的擱置下了。這就來總結總結。
加密也是個老生長談的事情的。先不多說,在下面的文章內仔細談。先貼幾個我真正用到的參考帖子,以做感謝。

  1. 這個第一次瞭解到Unity加密方式的地方,基本是按照這篇來做,但過程說的特別簡略。基本上只是在加密方向上做了指引。
    http://www.narkii.com/club/thread-330884-1.html
  2. 做到一半的時候卡在了編譯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/
  3. 雨鬆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(反編譯工具)。
    這兩個工具纔可以幫助我們真正的查看我們的加密工作是否真的完成了。

準備內容

編譯Libmono

這篇博文是我按照回憶來寫的。可能有一些步驟會斷開,請留言,我會補上的。
【這一部分操作我在Ubuntu中完成】


環境配置

  1. 將mono源碼和NDK解壓到一個你可以找到的地方。
  2. 配置環境變量,在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所在目錄
  3. 保存關閉文本編輯器,Terminal執行source ~/.bashrc,執行後你新配置的環境變量就可以生效了,可以在Terminal中輸入$NDK查看輸出來確定是否生效

編譯過程

此處先不談雨鬆Momo博主提到的代碼更改,單純說如何編譯。各位真正編譯的時候可以參照Momo對build_runtime_android.sh文件的更改。

  1. 將mono根目錄下/external/buildscripts中的內容複製到mono根目錄下
  2. Terminal cd到mono根目錄下,執行./build_runtime_android.sh
    (在編譯途中如果出現找不到xxx命令的情況,請大家根據命令行的提示,使用apt命令安裝 (我只記得autoconf automake libtool 這三個必須的了Q v Q))
  3. 編譯開始需要注意輸出的前面幾行(檢測完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報錯(這個東西我貼在這裏給大家做參考,似乎我當時沒有遇到這樣的問題)
  4. 其餘特別需要注意的地方我已經沒有印象了(所以有什麼問題大家請留言,我儘量幫忙解決),正確執行後開始不斷刷屏幕, 最後輸出有SUCCESS就證明成功編譯了libmono。
  5. 編譯過後,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中完成】

  1. 首先從Unity中導出Android工程,方法參見Unity3D研究院之腳本生成Android Google Project
  2. 在導出的Android工程的libs目錄下,可以發現armv7以及x86文件夾,將我們自己編譯生成的libmono.so對應的覆蓋原本的文件(armv5和armv6怎麼辦? 我選擇了忽略(:з」∠))。
  3. ant 或者是在Eclipse中編譯安卓工程,如果遊戲正常執行了,那麼恭喜你。libmono編譯正確了。

還有一些內容

( ⊙ o ⊙ )出於自己堆疊了好久的工作量,最近在趕工,博客比較難產。先寫出我後面要寫的一些內容,估計還有一篇文章就結束代碼加密的內容了

  • 加密Dll
  • 在libmono中做dll的相關解密
  • 加密so,隱藏自己對dll解密的方法

(PS:so加密是從雨鬆Momo博主的文章中學到的~大家可以直接轉戰到他的博客中學習)

歡迎大家留言~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章