【乾貨】Unity遊戲逆向及破解方法介紹 您所在的位置:网站首页 捏鼻子吸气耳朵恢复是正常么 【乾貨】Unity遊戲逆向及破解方法介紹

【乾貨】Unity遊戲逆向及破解方法介紹

#【乾貨】Unity遊戲逆向及破解方法介紹| 来源: 网络整理| 查看: 265

背景介紹

隨著手遊的發展,Unity3D引擎逐漸成爲主流的遊戲開發解決方案,傳統cocos的2D遊戲逐漸被取代,一些公司在Unity3D遊戲方面的產出也越來越多,如天天飛車,天天來戰,全民破壞神,全民偶像,全民突擊等遊戲。Unity3D遊戲的不斷產出,遊戲的安全性要求也越來越高,在此歸納一些逆向用到的方法和思路以及一些輔助性工具,做一些知識普及。

 

識別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加密,修改原始碼 

(1) hook住mono_image_open_from_data_full函數,dump出dll可以,用IDA配合jdb掛起進程在那函數位置下斷點dump也可以,原始碼具體修改方案同「二」和「三」

 

常用工具

一、 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 ,後面跟四個字節

 

案例

案例一:在函數頭下斷點(全民反恐攻擊任意傷害)

利用ILSpy反編譯的unity遊戲原始碼,在裡面找到一個影響傷害的函數,發現裡面的傳參第一個參數就是傷害值,那麼我們利用斷點工具在FPlayerPawn::TakeDamage函數頭下斷點,然後修改r1寄存器,繼續運行就可以了。

案例二:利用IDA在函數頭下斷點(悟空降魔任意修改血量值)

利用ILSpy反編譯後的unity遊戲原始碼,在裡面找到一個影響血量設置的函數set_curHP,用IDA工具調到地址下斷點,修改r1寄存器值。

案例三:Reflector+Reflexil修改源碼返回值後注入(全民偶像任意舞蹈滿分過關)

利用Reflector反編譯unity遊戲原始碼,找到CRhythmGamingCore::GetHitResult

函數,利用Reflexil插件編輯IL碼把返回值修改成1,相當於直接返回「amazing」。然後保存成新的dll文件,並利用工具將模塊注入到遊戲中。

修改後,反編譯結果如下:

案例四:Reflector+Reflexil刪除函數體後注入(全民突擊不限時)

利用Reflector反編譯unity遊戲原始碼,找到TaskGameTimeReached::OnUpdate函數,利用Reflexil插件刪除函數體,變成下面的形式,注入到遊戲中即可。

案例五:Reflector+Reflexil call函數(全民破壞神技能無CD)

利用Reflector反編譯unity遊戲原始碼, 利用Reflexil在函數加一句話主動call函數,可以清空所有技能CD。

 

小結

Unity引擎遊戲從目前的情況來看,相對於cocos的遊戲還是不安全的,畢竟目前很多Unity遊戲都直接暴露了dll,儘管沒有暴露dll,也能直接dump出dll去反編譯分析,直接看到了源碼。而unity遊戲既可以從彙編層入手也可以從原始碼入手,彙編層的話直接找到函數編譯後的地址然後下斷點就可以了;如果是修改源碼的話則需要把回編譯的dll注入到mono加載dll的那個地方。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有