一個簡單的安卓游戲逆向


綜述

一個簡單的安卓游戲內購破解,主要用於熟練smali匯編以及相關工具的使用

使用工具

夜神模擬器v3.8.3.1

Andriod Killer v1.3.1.0

分析過程

使用夜神模擬器安裝該游戲程序,打開游戲商城,發現本游戲主要貨幣是鑽石,鑽石需要通過話費充值獲取,在未破解的情況下,點擊購買,鑽石購買失敗,具體情況如下圖。

 

使用Andriod Killer v1.3.1.0打開該程序,通過初始頁面工程信息選項卡下的入口鏈接,可以直接找到該程序的入口類對應的smali文件。

 

點開工程管理器選項卡,可以看到整個apk文件解壓后的文件結構,其中可以找到很多重要文件,比如保存着app配置信息和全局信息的AndroidManifest.xml文件

因為本次破解目標是游戲的購買機制,所以在工程搜索選項卡下搜索"購買"字符串,需要注意的,需要將字符串轉為unicode碼進行搜索才會有用。具體過程如下。

 

搜索到只有一個文件,該文件中有三個地方的字符串與購買相關

 

將鼠標移動到smali代碼的中的字符串上,工具會自動將unicode解碼出來,發現該三處字符串分別與取消購買、購買成功,購買失敗相關,並且如果將鼠標移動到smali指令上,工具還會給出該指令的解釋,從而方便理解smali代碼

 

此時可以通過Android Killer提供的反編譯工具,將當前smali文件轉換為JAVA源碼,以方便閱讀,注意此時得到的JAVA可能存在問題,可以多嘗試使用幾個反編工具(如JEB、GDA)對smali進行反編譯,從而得到更好的JAVA代碼。

從JAVA代碼中,我們看到整個函數的是一個switch-case結構,根據函數參數(paramInt)的不同,從而執行不同的分支,而購買成功與購買失敗的字符串就出現在相鄰的分支中,如下圖。

 

回到Android Killer的smali匯編中,我們發現購買成功對應的case值為pswitch_0, 購買失敗對應的case值為pswitch_1

 

此時我們大膽猜測,能否通過將兩個case值呼喚,從而讓購買失敗情況下執行購買成功的代碼呢?

 

如上圖,我們將兩個case值互換,ctrl+s保存修改,因為改變了程序原有的代碼,所以需要將apk程序重新打包,此時可以使用Android Killer中的編譯功能,該功能可以將app重新編譯打包,並重新簽名,從而生成一個新的apk文件。

 

根據生成路徑,找到新的apk文件,將模擬器中原本的app卸載,然后使用新apk重新安裝,打開游戲后,我們發現游戲內鑽石購買機制被破解,即使購買失敗,也能獲得相應的鑽石。

 

注意因為此游戲的購買機制全部在客戶端判斷執行,即所謂的內購,所以這種簡單的方法可以達到目的,如果對於購買機制在服務端判斷執行的游戲,如果要破解,就需要抓包分析其數據包結構,從而構造指定結構的數據包發送給服務端。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM