一、安卓逆向常用工具
針對(duì)安卓單機(jī)游戲逆向,尤其是逆向使用Unity引擎開發(fā)的安卓游戲,只需了解下面的工具即可。
(1)Android Killer
?????? Android Killer是安卓通用逆向工具,其可以對(duì)apk進(jìn)行反向編譯,得到smail代碼,用戶可以更改smail代碼后,對(duì)apk重新打包,以實(shí)現(xiàn)破解的功能。其還可以將apk轉(zhuǎn)換成等價(jià)的java語言,以便分析程序邏輯,來更好的找到對(duì)應(yīng)的smail代碼。
(2)ILSpy (針對(duì)Unity開發(fā)的手游)
?????? ILSpy的作用主要是將Unity封裝在apk中的.dll庫文件反編譯成等價(jià)的CSharp代碼,以便于觀察游戲程序邏輯,從而決定修改位置。
(3)ILDasm (針對(duì)Unity開發(fā)的手游)
?????? ILDasm的作用主要是將Unity封裝在apk中的.dll庫文件反編譯成等價(jià)的可編輯的IL類匯編指令。
(4)ILasm (針對(duì)Unity開發(fā)的手游)
?????? ILasm的作用是將IL類匯編指令重新編譯成.dll文件。
二、逆向案例分析
1、Unity單機(jī)手游案例1
以Unity單機(jī)手游“模擬生活”為例,說明Unity類手游的破解思路。
(1)解壓apk文件
使用解壓軟件直接將apk解壓,解壓完成后,進(jìn)入到assets\bin\Data\Managed目錄中(僅限Unity手游),并找到其中的Assembly-CSharp.dll文件(存放了游戲主邏輯),如圖所示:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-805911.html
?????? 隨后以文本方式打開”Assembly-CSharp.dll”文件,查看是否被加密,如圖所示:
?????? 一般情況下,能解析出如圖所示的文本,說明.dll文件未被加密,可以直接進(jìn)行逆向分析。
(2)使用ILSpy軟件查看C#語言等價(jià)源碼確定修改位置
?????? 打開ILSpy軟件,選擇打開”Assembly-CSharp.dll”文件后,軟件會(huì)自動(dòng)進(jìn)行反編譯處理,將.dll文件反編譯為C#語言,隨后我們可以搜索游戲關(guān)鍵字,比如金錢(money)、等級(jí)(level)、血量(HP)和經(jīng)驗(yàn)(Exp)等等,一般正規(guī)的游戲,變量命名都會(huì)很規(guī)范,如果實(shí)在找不到,只能硬啃代碼進(jìn)行分析了。
?????? 這里以查找“模擬生活”游戲中的金錢為例,搜索money后出現(xiàn)了很多結(jié)果,如圖所示
????????? 在搜索結(jié)果(圖中標(biāo)2所示)中,依次查看最可能有修改金錢操作的代碼,這里最后鎖定了”EarnMoneyBonus”類,字面意思就是“賺錢獎(jiǎng)勵(lì)”,隨后點(diǎn)進(jìn)去,發(fā)現(xiàn)其中有Update()和FixedUpdate()函數(shù),這兩個(gè)函數(shù),是Unity游戲中的重要函數(shù),其分別表示隨著游戲的進(jìn)行,每一幀都會(huì)調(diào)用的函數(shù)(Update)和每隔固定時(shí)間會(huì)調(diào)用的函數(shù)(FixedUpdate)。
?????? 先觀察Update中的函數(shù),從變量名分析,其中會(huì)對(duì)一個(gè)時(shí)間相關(guān)的變量進(jìn)行操作,和金錢關(guān)系不大,因此跳轉(zhuǎn)到觀察FixedUpdate函數(shù)。FixedUpdate函數(shù)中,沒有看到和money相關(guān)的字眼,但是有一個(gè)自定義的Finish函數(shù),于是繼續(xù)查看Finish函數(shù),如圖所示。
?
?????? 在里面終于看到和money有關(guān)的變量m_moneySum(金錢總數(shù))了,繼續(xù)觀察,還有m_multiplier(倍率),這兩個(gè)量通過一定的計(jì)算關(guān)系賦值給num:
num=m_moneySum*(m_multiplier-1),而后的代碼(2中),以num作為參數(shù)進(jìn)行了某些操作,再往后看代碼3,其中調(diào)用了SetText(設(shè)置文本)函數(shù),通常此類函數(shù)是直接影響顯示界面的,也就是說,這個(gè)函數(shù)改變了某個(gè)地方顯示的文本,再看里面的參數(shù),還是和m_moneySum和m_multiplier有關(guān),因此可以斷定,改變這兩個(gè)值中的一個(gè),必定會(huì)使游戲某個(gè)地方的文本產(chǎn)生突變。為了使游戲保留可玩性,從字面意思理解改m_multiplier(倍率)可能會(huì)更好(也可以試著改其他變量)。
可以看到,之后m_multiplier被重新賦值為1,這里為了效果明顯,將其改為1000000試試(不是直接改C#代碼),這里相當(dāng)于確定了修改的位置為”EarnMoneyBonus”類中”Finsh”函數(shù)中的”m_multiplier”變量。
(3)通過ILDasm插件,確定IL匯編指令的修改位置
?????? 在Visual Studio 2019及以上版本中,內(nèi)置了ILDasm插件,先在之前解壓的apk的Managed上右鍵,選擇“使用Visual Studio打開(V)”,這個(gè)操作的目的是為了使工作目錄直接切換到”Assembly-CSharp.dll”文件所在目錄,省了很多操作,如圖所示。
?之后,可以在Visual Studio的“工具”,“命令行(L)”中選擇“開發(fā)者命令提示(C)”,如圖所示:
?隨后輸入如下命令將”Assembly-CSharp.dll”文件反匯編成IL指令文件:
ildasm Assembly-CSharp.dll
效果如圖所示:
?此時(shí)自動(dòng)彈出了ILDASM插件的GUI界面,并把.dll反匯編成了.il,之后要做的就是定位IL指令文件中需要修改的位置。
根據(jù)前面確定的修改位置,先找到”EarnMoneyBonus”類,再找到其中的”Finsh”函數(shù),最后定位給”m_multiplier”變量賦值為1的地方。
?
?????? 最后我們確定了需要修改的地方為IL_00ce: ldc.r4 1,如果改成IL_00ce: ldc.r4 1000000,則意味著每次運(yùn)行Finish函數(shù)后,m_multiplier都會(huì)被賦值為1000000,這里不能直接修改,需要等導(dǎo)出文本文件后再修改,因此先復(fù)制特征串”IL_00d3: stfld float32 EarnMoneyBonus::m_multiplier”以便于查找到需要修改的位置。
?????? 如圖,在“文件(F)”中,找到“轉(zhuǎn)儲(chǔ)(D)”,隨后保存,命名為“Assembly-CSharp.il”,如圖所示:
?
(4)修改“Assembly-CSharp.il”文件
?????? 使用任意文本編輯器打開“Assembly-CSharp.il”文件后定位到(3)中確定的修改位置后(直接搜索前面復(fù)制的特征串),將其改為1000000,如圖所示。
?(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
?
這里為了不覆蓋原來的“Assembly-CSharp.dll”文件,將新編譯的文件命名為“Assembly-CSharp_crack.dll”文件,該文件就是破解后的Unity游戲主邏輯文件,替換掉原Apk中的“Assembly-CSharp.dll”文件后,重新打包編譯apk就能生成破解的游戲安裝包了。
(6)使用Android Killer重新編譯Apk
使用Android Killer打開“生活模擬器”apk,之后進(jìn)入到Android Killer該安裝包的工程目錄projects\安裝包名稱\Project\assets\bin\Data\Managed中,用Assembly-CSharp_crack.dll替換掉原Assembly-CSharp.dll文件(替換后,將_crack后綴刪除),如圖所示
?????? 隨后點(diǎn)擊Android Killer中的編譯功能,編譯生成破解的apk,如圖所示:
??????? 破解的apk輸出的位置為projects\安裝包名稱\Bin\xxx.apk。
效果如圖所示,每點(diǎn)擊一次掙錢,獲得的是999999金錢,和前面反編譯出的C#源碼中,num=m_moneySum*(m_multiplier-1)計(jì)算結(jié)果一致,其中m_multiplier為倍率,被我們修改為1000000了,而m_moneySum為1,因此每點(diǎn)擊一次得到999999
三、附錄
本文所用的Android Killer和ILSpy軟件鏈接如下:
鏈接:https://pan.baidu.com/s/1oiecCQkJVFoucLmwSZfJIA?
提取碼:long?
關(guān)于ILDasm和ILasm插件,可下載安裝Visual Studio 2019及以上版本,其內(nèi)置了這兩個(gè)插件,VS官網(wǎng)下載地址如下(其中Community為免費(fèi)版):
Visual Studio: 面向軟件開發(fā)人員和 Teams 的 IDE 和代碼編輯器 (microsoft.com)文章來源:http://www.zghlxwxcb.cn/news/detail-805911.html
?
到了這里,關(guān)于Unity單機(jī)手游逆向破解思路(僅供學(xué)習(xí)參考,禁止用于非法行為)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!