天天看點

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

一、安卓逆向常用工具

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

針對安卓單機遊戲逆向,尤其是逆向使用Unity引擎開發的安卓遊戲,隻需了解下面的工具即可。

(1)Android Killer

       Android Killer是安卓通用逆向工具,其可以對apk進行反向編譯,得到smail代碼,使用者可以更改smail代碼後,對apk重新打包,以實作破解的功能。其還可以将apk轉換成等價的java語言,以便分析程式邏輯,來更好的找到對應的smail代碼。

(2)ILSpy (針對Unity開發的手遊)

       ILSpy的作用主要是将Unity封裝在apk中的.dll庫檔案反編譯成等價的CSharp代碼,以便于觀察遊戲程式邏輯,進而決定修改位置。

(3)ILDasm (針對Unity開發的手遊)

       ILDasm的作用主要是将Unity封裝在apk中的.dll庫檔案反編譯成等價的可編輯的IL類彙編指令。

(4)ILasm (針對Unity開發的手遊)

       ILasm的作用是将IL類彙編指令重新編譯成.dll檔案。

二、逆向案例分析

1、Unity單機手遊案例1

以Unity單機手遊“模拟生活”為例,說明Unity類手遊的破解思路。

(1)解壓apk檔案

使用解壓軟體直接将apk解壓,解壓完成後,進入到assets\bin\Data\Managed目錄中(僅限Unity手遊),并找到其中的Assembly-CSharp.dll檔案(存放了遊戲主邏輯),如圖所示:

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

       随後以文本方式打開”Assembly-CSharp.dll”檔案,檢視是否被加密,如圖所示:

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

       一般情況下,能解析出如圖所示的文本,說明.dll檔案未被加密,可以直接進行逆向分析。

(2)使用ILSpy軟體檢視C#語言等價源碼确定修改位置

       打開ILSpy軟體,選擇打開”Assembly-CSharp.dll”檔案後,軟體會自動進行反編譯處理,将.dll檔案反編譯為C#語言,随後我們可以搜尋遊戲關鍵字,比如金錢(money)、等級(level)、血量(HP)和經驗(Exp)等等,一般正規的遊戲,變量命名都會很規範,如果實在找不到,隻能硬啃代碼進行分析了。

       這裡以查找“模拟生活”遊戲中的金錢為例,搜尋money後出現了很多結果,如圖所示

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

          在搜尋結果(圖中标2所示)中,依次檢視最可能有修改金錢操作的代碼,這裡最後鎖定了”EarnMoneyBonus”類,字面意思就是“賺錢獎勵”,随後點進去,發現其中有Update()和FixedUpdate()函數,這兩個函數,是Unity遊戲中的重要函數,其分别表示随着遊戲的進行,每一幀都會調用的函數(Update)和每隔固定時間會調用的函數(FixedUpdate)。

       先觀察Update中的函數,從變量名分析,其中會對一個時間相關的變量進行操作,和金錢關系不大,是以跳轉到觀察FixedUpdate函數。FixedUpdate函數中,沒有看到和money相關的字眼,但是有一個自定義的Finish函數,于是繼續檢視Finish函數,如圖所示。

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

       在裡面終于看到和money有關的變量m_moneySum(金錢總數)了,繼續觀察,還有m_multiplier(倍率),這兩個量通過一定的計算關系指派給num:

num=m_moneySum*(m_multiplier-1),而後的代碼(2中),以num作為參數進行了某些操作,再往後看代碼3,其中調用了SetText(設定文本)函數,通常此類函數是直接影響顯示界面的,也就是說,這個函數改變了某個地方顯示的文本,再看裡面的參數,還是和m_moneySum和m_multiplier有關,是以可以斷定,改變這兩個值中的一個,必定會使遊戲某個地方的文本産生突變。為了使遊戲保留可玩性,從字面意思了解改m_multiplier(倍率)可能會更好(也可以試着改其他變量)。

可以看到,之後m_multiplier被重新指派為1,這裡為了效果明顯,将其改為1000000試試(不是直接改C#代碼),這裡相當于确定了修改的位置為”EarnMoneyBonus”類中”Finsh”函數中的”m_multiplier”變量。

(3)通過ILDasm插件,确定IL彙編指令的修改位置

       在Visual Studio 2019及以上版本中,内置了ILDasm插件,先在之前解壓的apk的Managed上右鍵,選擇“使用Visual Studio打開(V)”,這個操作的目的是為了使工作目錄直接切換到”Assembly-CSharp.dll”檔案所在目錄,省了很多操作,如圖所示。

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

 之後,可以在Visual Studio的“工具”,“指令行(L)”中選擇“開發者指令提示(C)”,如圖所示:

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

 随後輸入如下指令将”Assembly-CSharp.dll”檔案反彙編成IL指令檔案:

ildasm Assembly-CSharp.dll

效果如圖所示:

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

 此時自動彈出了ILDASM插件的GUI界面,并把.dll反彙編成了.il,之後要做的就是定位IL指令檔案中需要修改的位置。

根據前面确定的修改位置,先找到”EarnMoneyBonus”類,再找到其中的”Finsh”函數,最後定位給”m_multiplier”變量指派為1的地方。

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

       最後我們确定了需要修改的地方為IL_00ce: ldc.r4 1,如果改成IL_00ce: ldc.r4 1000000,則意味着每次運作Finish函數後,m_multiplier都會被指派為1000000,這裡不能直接修改,需要等導出文本檔案後再修改,是以先複制特征串”IL_00d3: stfld float32 EarnMoneyBonus::m_multiplier”以便于查找到需要修改的位置。

       如圖,在“檔案(F)”中,找到“轉儲(D)”,随後儲存,命名為“Assembly-CSharp.il”,如圖所示:

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

(4)修改“Assembly-CSharp.il”檔案

       使用任意文本編輯器打開“Assembly-CSharp.il”檔案後定位到(3)中确定的修改位置後(直接搜尋前面複制的特征串),将其改為1000000,如圖所示。

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

 (5)編譯“Assembly-CSharp.il”檔案

       使用ILasm插件将“Assembly-CSharp.il”檔案編譯為“Assembly-CSharp.dll”檔案。和前面步驟一樣,在Visual Studio中打開指令提示符後,使用如下指令編譯“Assembly-CSharp.il”檔案:

ilasm Assembly-CSharp.il /output=Assembly-CSharp_crack.dll /dll

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

這裡為了不覆寫原來的“Assembly-CSharp.dll”檔案,将新編譯的檔案命名為“Assembly-CSharp_crack.dll”檔案,該檔案就是破解後的Unity遊戲主邏輯檔案,替換掉原Apk中的“Assembly-CSharp.dll”檔案後,重新打包編譯apk就能生成破解的遊戲安裝包了。

(6)使用Android Killer重新編譯Apk

使用Android Killer打開“生活模拟器”apk,之後進入到Android Killer該安裝包的工程目錄projects\安裝包名稱\Project\assets\bin\Data\Managed中,用Assembly-CSharp_crack.dll替換掉原Assembly-CSharp.dll檔案(替換後,将_crack字尾删除),如圖所示

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

       随後點選Android Killer中的編譯功能,編譯生成破解的apk,如圖所示:

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

        破解的apk輸出的位置為projects\安裝包名稱\Bin\xxx.apk。

效果如圖所示,每點選一次掙錢,獲得的是999999金錢,和前面反編譯出的C#源碼中,num=m_moneySum*(m_multiplier-1)計算結果一緻,其中m_multiplier為倍率,被我們修改為1000000了,而m_moneySum為1,是以每點選一次得到999999

Unity單機手遊逆向破解思路(僅供學習參考,禁止用于非法行為)

三、附錄

本文所用的Android Killer和ILSpy軟體連結如下:

連結:https://pan.baidu.com/s/1oiecCQkJVFoucLmwSZfJIA 

提取碼:long 

關于ILDasm和ILasm插件,可下載下傳安裝Visual Studio 2019及以上版本,其内置了這兩個插件,VS官網下載下傳位址如下(其中Community為免費版):

Visual Studio: 面向軟體開發人員和 Teams 的 IDE 和代碼編輯器 (microsoft.com)