Unity3d DLL脚本通用解密方法
? 網上已經有很多文章講解過Unity3D腳本DLL?解密,基本方法原理都差不多,就是通過HOOK或者調試下斷mono_image_open_from_data_with_name這個函數拿到解密后的DLL。這些方法都需要比較專業的知識(Hook或者過反調試),另外對于使用了強度比較高的第三方保護,也無能為力。下面我們來探討一下更為通用簡便的U3D腳本DLL解密方法。
一、腳本解密原理
? ? ??先來理一下通過mono_image_open_from_data_with_name解密腳本DLL的原理。
? ? ? Unity3d游戲的腳本默認情況下是非加密形態,保存于如下圖的壓縮包目錄下,一般情況名字為Assembly-CSharp.dll或Assembly-CSharp-firstpass.dll。
? ? ? ?這樣的腳本DLL是由C#語言編寫的,可以被類似Reflector之類的工具反編譯成源碼。破解者得到源碼就可以對其進行修改,實現內購破解、修改游戲人物屬性(修改金幣、HP等)、修改戰斗技能(無敵、強制勝利等)。? ??????
? ? ? ?我們來看下mono_image_open_from_data_with_name這個函數的源碼
幾個主要函數的參數意義:
data:?腳本內容
data_len:腳本長度
name:腳本名稱
這個函數執行了如下幾步操作:
1.把data指向的腳本拷貝到新申請的內存
2.填充一個MonoImage結構體
3.使用do_mono_image_load初步加載該腳本
4.注冊并返回MonoImage結構體指針
????這個原始mono_image_open_from_data_with_name函數,如果輸入的data指向的是個加密過的腳本DLL,在這個函數執行之前,先要對該data指向的內存進行解密。
調試解密可在return處下斷,此時data指向的內存已經解密,把該處內存拷貝出來即是解密后的DLL
???? HOOK解密原理是待mono_image_open_from_data_with_name原始函數返回后拷貝data指向的內存
????不過往往第三方保護都是帶反調試的,新手要過掉反調試還是比較費周折的,有些厲害的反調試,老手都不一定過得了。對SO做HOOK也是要有一定的技術基礎才能做到。
????對于強度稍微高點的保護,這個函數處是拿不到解密后的DLL的,等這個函數返回的時候,內存可能是空的。??
????絕大部分加密,都緊盯著data指向的內存來做文章,認為只要把mono_image_open_from_data_with_name參數里的data加密搞定就萬事大吉了,而忽略掉了另一塊永久存在的處于解密狀態的DLL內存。
??? mono_image_open_from_data_with_name第一步就是把data內存使用memcpy拷貝到一塊新申請的內存里,這塊內存將永久存在,因為C#語言是需要動態解析類、函數等信息的,時不時要用到這塊內存。而data待這個函數調用完后,將會被釋放掉。
????這也是某些強度比較高的第三方保護,通過那兩種方法都得不到解密DLL的關鍵所在,它在mono_image_open_from_data_with_name函數返回前就把data指向的內存給清空了。
二、腳本解密方法
????下面就來講一下我們的U3D腳本DLL解密方法,原理即是利用了內存中存在的那個memcpy拷貝的DLL。
????由于內存中永久存在這個DLL,我們只要全內存搜索這個DLL就可以了。如何全內存搜索呢,自己寫個工具還是挺麻煩的一件事。
????其實用手游分析者比較熟悉的一個現成工具就可以做到:燒餅修改器(八門神器等其它修改器也可以),燒餅修改器可以對游戲進行數值搜索。那我們要搜索什么數值呢?
? ?先用二進制工具hiew來看下Assembly-CSharp.dll
? ? ?這是個PE結構的文件,以4d 5a 90 00這四個字節為magic head,這可以做為C# DLL腳本的特征,我們只要搜索0x905a4d這個數值就可以了,由于燒餅修改器是使用10進制數值,將其轉換成10進制值:9460301
????下圖是使用燒餅修改器搜索一個3D卡車小游戲的示例: ?
? ? 顯示出來的是搜索結果,一共搜索到了12個結果
? ? 第一個搜索結果,即是以52c4c008起始地址的腳本DLL,我們可以使用memdump工具把這塊內存DUMP下來,由于不知道大小,先dump 0×3000大小來看一下。
? ? 保存為abc.dll,再用hiew?看下abc.dll?
? ? 可以看到DUMP下來的確實是個CSharp?腳本DLL,DLL實際大小可通過下圖這個FFI?工具,解析出來,將第?3行的0x10A00?加上?0×200?即是實際大小。可通過這個方法來確定這12?個?DLL?,哪個是你需要解密的?DLL?。?
? ? 這個方法的優點是可以不用去管反調試,也不用去學習怎么HOOK,用現成的工具組合起來就可以做到解密腳本。最重要一點是對保護強度比較高的保護也可以無視。
http://www.freebuf.com/column/153720.html
總結
以上是生活随笔為你收集整理的Unity3d DLL脚本通用解密方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【译】X Server-Client!!
- 下一篇: 【译】LXC and LXD: Expl