Unity 3d遊戲逆向之.NET Reflector工具使用介紹

移動平臺遊戲框架主要有unity 3d和cocos 2d。咱們首先得識別遊戲使用的框架。html


識別Unity遊戲
Android平臺的apk包能夠直接解壓,看是否有./assets/bin/Data/Managed目錄,也能夠查看lib文件夾下面包含的一些so,若是有libmono,libunity等模塊,基本能夠肯定是unity遊戲了。
Android平臺中C#編寫的主邏輯模塊代碼靜態編輯以後存儲於Assembly-CSharp.dll文件中。由於unity的跨平臺,Android平臺是unity編譯的遊戲,那麼其對應的IOS平臺上也是unity編譯出來的。若是但願直接從IOS上面去看是不是unity遊戲,能夠提取遊戲中的主模塊查看是否有unity之類的函數便可。框架


破解思路
下面列舉了一些破解版思路,若是能直接下斷點在函數頭修改寄存器可直接修改寄存器測試,遇到一些不能直接修改的,就用第二種方法,把修改後的Assembly-CSharp.dll注入到遊戲中,讓遊戲執行咱們修改後的代碼。另外也能夠動靜態修改二進制實現。

一、修改unity遊戲邏輯代碼編譯成彙編代碼相關的值
(1) 修改傳進來的參數,即寄存器,通常是set之類的函數
(2) 彙編代碼中儘可能不修改內存,不修改opcode,能改寄存器直接改寄存器

二、反編譯Assembly-CSharp.dll,直接修改unity的C#源代碼
(1) 修改函數返回值
(2) 直接刪除函數體,只剩下 ret 指令
(3) 在對應函數修改,對變量進行處理
(4) 在對應函數增長一些call處理,主動call

三、分析源碼直接修改代碼
(1) 經過分析unity反編譯後的源碼找到對應的彙編指令下斷點修改寄存器
(2) 經過直接靜態分析dll,直接修改IL碼的二進制碼

四、在加載dll的函數位置dump原來的dll代碼,可繞過dll加密,修改源代碼
hook住mono_image_open_from_data_full函數,dump出dll能夠,用IDA配合jdb掛起進程在那函數位置下斷點dump也能夠,源代碼具體修改方案同「2」和「3」

經常使用工具
一、IDA工具
能夠進行動態調試和靜態分析的工具,能在合適的位置下斷點,修改指定寄存器和編寫IDC腳本配合分析
二、ILSpy
反編譯和分析dll代碼,能夠交叉引用,能夠以源碼形式保存反編譯的代碼,提供代碼給DirFind等字符串搜索定位工具定位代碼位置

三、.NET Reflector + Reflexil
反編譯和分析dll代碼,彌補了ILSpy一些功能性的缺陷,能夠分析出錯誤的CLR文件頭,一些在ILSpy顯示不出的dll文件,若是隻是由於dll頭部被修改,放在.NET Reflector中是能夠分析出的。Reflexil則是.NET Reflector的一款插件,能夠反編譯和回編譯IL碼,方便實用可視化。

四、Ilasm和ildasm
Ildasm能夠反編譯dll,dump出反編譯後的il碼,而Ilasm則能夠重打包il碼,利用命令ilasm /dll *.il便可。函數

經常使用IL碼二進制
(1)nop 二進制是 0x00
(2)ldc.i4.0 二進制是 0x16
(3)ldc.i4.1 二進制是 0x17
(4)ret 二進制是 0x2A
(5)ldc.r4 二進制是 0x22 ,後面跟四個字節工具

.NET Reflector + Reflexil的使用
用.NET Reflector打開Assembly-CSharp.dll,這裏使用的.NET Reflector版本是9.0,Reflexil版本是2.1。如圖所示,經過這個Reflexil插件,咱們能夠插入字段、類、方法等。測試

經過Tools菜單下的Reflexil選項,能夠打開unity代碼修改器:flex

在左邊單擊對應函數,就能夠對該函數代碼進行修改了。ui

下面舉例分析。在逆向中咱們常常須要插入log語句打印log信息來輔助分析。unity打印log的語句是:加密

Debug.Log
函數原型是:public static void Log(object message);

若是咱們要打印下面函數中ToString的返回值應該如何操做呢?spa

按照正常邏輯,應該是先保存ToString()的值到寄存器,而後看成參數傳遞給Log函數打印出來。可是我不知道怎麼保存這個值,因此想到了另一個辦法,仿照原代碼,再次調用ToString()函數,而後將下面調用CalcMD5函數改成調用Debug.Log函數。
具體怎麼操做呢?
(1)首先右擊「ldloc.3」那一行代碼(Offset爲 196),選擇「Create new...」,OpCode選擇「ldloc.3」,而後點擊「Insert before select」。
stloc.1 將值從堆棧彈出到局部變量 1
ldloc.1 將索引 1 處的局部變量加載到計算堆棧上插件

(2)OpCode選擇「callvirt」,Operand type選擇「Method reference」,Operand選擇「ToString」函數(在mscorlib模塊找到System.Text.StringBuilder::ToString函數)。而後點擊「Insert before select」。
(3)OpCode選擇「call」,Operand type選擇「Method reference」,Operand選擇「Log」函數。這個函數是在UnityEngine中查找,如圖所示:

而後點擊「Insert before select」,以下圖所示:

添加代碼後的狀況以下:

修改完成後,右鍵「Assembly-CSharp.dll」,依次點擊「Reflexil」,「Save as...」保存dll文件,從新打包安裝運行就能夠看到log輸出信息了。

參考資料:http://gslab.qq.com/article-53-1.html

相關文章
相關標籤/搜索