0x5.smali邏輯分析實(shí)戰(zhàn)
本文介紹一個(gè)手游的內(nèi)購(gòu)破解來加強(qiáng)對(duì)smali邏輯分析的理解。提綱如下:
-->文中的apk修改僅用于研究學(xué)習(xí),如涉及權(quán)益侵犯請(qǐng)隨時(shí)聯(lián)系處理。 <--
在開始分析和破解前,我們需要先安裝apk使用,以確認(rèn)我們的需求。
進(jìn)入游戲后,我們看到有1000的初始元寶,點(diǎn)擊后彈出充值界面,我們這里定義我們的需求為元寶的內(nèi)購(gòu)破解。我們先來了解一下充值流程,進(jìn)入充值界面:
點(diǎn)擊購(gòu)買充值后,彈出了我們熟悉的toast信息框,內(nèi)容為“游戲試玩期間不允許購(gòu)買元寶或者道具”。 這里就引入了我們分析的第一步,字符串搜索。
0x1.字符串搜索
使用Android Killer將apk反編譯,進(jìn)入工程搜索一欄,進(jìn)行字符串的搜索。如果直接搜索漢字是無(wú)法搜索到結(jié)果的,需要轉(zhuǎn)化為Unicode后搜索:
搜索到兩個(gè)結(jié)果,Define.smali經(jīng)查看是字符串定義用的,與邏輯無(wú)關(guān)。FkddzPay.smali即為我們要找的smali,然后我們打開分析具體邏輯,也就進(jìn)入到了我們的第二步。
0x2.邏輯分析
打開這個(gè)smali文件定位到信息框提示的這段代碼:
根據(jù)上圖可以得知,關(guān)鍵在于是否為試玩的判斷,即我們無(wú)論如何需要去執(zhí)行 cond_0,而不是顯示toast信息框。
這里不再做具體修改步驟書寫,提供幾個(gè)思路,大家自己嘗試。
1.if-nez變更為if-eqz
2.判斷執(zhí)行之前,定義v3為非0數(shù)據(jù)
3.判斷前直接執(zhí)行g(shù)oto命令跳轉(zhuǎn)到 cond_0
在這個(gè)判斷邏輯修改完畢后,我們可以正常進(jìn)入充值界面了:
此時(shí),不管我們是直接關(guān)掉該窗口,還是都點(diǎn)擊確認(rèn)之后后再點(diǎn)擊取消,都會(huì)得到如下的toast信息框提示:
我們先進(jìn)行字符串搜索找到該提示的位置:
很顯然這只是一個(gè)toast方法,我們需要知道是誰(shuí)調(diào)用了它,來尋找這個(gè)邏輯在哪里。之后我們搜索shopBillingCancel發(fā)現(xiàn)access$800調(diào)用了它,繼續(xù)順藤摸瓜,尋找調(diào)用access$800的方法。
之后我們分析搜索的結(jié)果后,在FkddzPay$9$1.smali中定位到這個(gè)函數(shù),并確定這里是邏輯判斷的關(guān)鍵點(diǎn)。
之后我們繼續(xù)順藤摸瓜,搜索payCancel,找到調(diào)用的地方, 并全部將其修改為paySuccess:
保存后編譯運(yùn)行,元寶的內(nèi)購(gòu)破解就完成了,這里不再貼結(jié)果圖片,大家自己嘗試。接下來我們介紹最后一個(gè)思路。
0x3.函數(shù)替換
在程序運(yùn)行過程中,未修改前,我們?nèi)∠灰?,調(diào)用的是payCancel,如果我們將所有payCancel的函數(shù)內(nèi)容變?yōu)榕cpaySuccess一樣,則也一定會(huì)成功。
這部分相對(duì)簡(jiǎn)單,不再做具體解釋,請(qǐng)大家自己嘗試替換和測(cè)試。