安卓逆向系列教程 4.3 登山賽車內購破解

4.3 登山賽車內購破解

作者:飛龍

首先在這里下載游戲:http://g.10086.cn/game/760000032287?spm=www.pdindex.android.addjgame.1

我們要破解的東西是這個,獲得金幣:

點擊之后會有個彈出框,我們隨便輸入一些東西,然后點擊“確認支付”:

出現了“短信驗證碼驗證失敗”的Toast

好,信息收集完畢,將程序拉進 Android Killer:

搜索“驗證失敗”四個字,我們可以找到剛才的內容:

我們發現它在strings.xml里面,它的名稱是gc_security_sms_err。老方法,搜索這個名稱:

我們在public.xml中發現了它的 ID,0x7f0700a1。我們搜索這個值。

然后就沒下文了。我們沒有找到任何使用這個值的地方。只能從其它方面入手。

我們從前面可以得知,付費用的是移動的接口,我們搜索onresult,這是移動支付 API 的關鍵字(問我怎么知道的,這個 API 是有開發者文檔的,大家可以搜索一下):

一下子就出現了,ChinaBillingPayCallback$1。下面就是要好好分析這個類

這個類只有一個onResult方法,也就是說只是一個閉包,而且也沒有什么特別有用的信息:

public void onResult(int paramInt, String paramString, Object paramObject)
{
    int i = paramInt;
    BillingResult localBillingResult = new BillingResult();
    localBillingResult.setResultCode(i);
    localBillingResult.setBillingIndex(this.val$billingIndex);
    localBillingResult.setReturningObject(paramObject);
    localBillingResult.setCode(paramString);
    Log.i("MySDK Billing Java", "CMCC object toString(): " + paramObject.toString());
    Log.i("MySDK Billing Java", "CMCC result: " + localBillingResult.toJSON());
    this.this$0.launchResultReceived(localBillingResult);
}

反正我是沒看出來。再看一看,這個類所在的包是com.mygamez.common,而軟件的包是con.fingersoft.game,等于說這個類是別人的 API,當然沒有業務邏輯。

我們換個方式,搜索Billing

除了底下的兩個資源類,有三個游戲包中的類出現了Billing。第一個類是一個Applicaion,只有如下代碼:

public void onCreate()
{
    MyBilling.applicationHeater(this);
}

再看看MainActivity$1,它也是一個閉包,只有onChinaBillingResult方法,這就非常重要了。由于它的 java 反編譯結果不可讀,我們直接看 Smali:

invoke-virtual {p1}, Lcom/mygamez/billing/BillingResult;->getResultCode()I

move-result v2

packed-switch v2, :pswitch_data_0

...

開頭有這么一段代碼,我們跳到:pswitch_data_0處:

:pswitch_data_0
.packed-switch 0x1
    :pswitch_0
    :pswitch_1
.end packed-switch

由于判斷的是某個 API 的返回代碼,按照慣例,0是正常,其余是異常。我們可以跳到:pswitch_1分支:

:pswitch_1
iget-object v2, p0, Lcom/fingersoft/game/MainActivity$1;->this$0:Lcom/fingersoft/game/MainActivity;

invoke-virtual {v2}, Lcom/fingersoft/game/MainActivity;->getApplicationContext()Landroid/content/Context;

move-result-object v2

const-string v3, "\u4ed8\u6b3e\u5931\u8d25"

const/4 v4, 0x1

invoke-static {v2, v3, v4}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

move-result-object v1

.line 301
.local v1, "toast":Landroid/widget/Toast;
invoke-virtual {v1}, Landroid/widget/Toast;->show()V

goto :goto_0

那個字符串是“付款失敗”,這么多代碼其實就是Toast.makeText(this.this$0.getApplicationContext(), "付款失敗", 1).show()。這應該就是異常分支了。

至于接下來的修改,這個方法第二行move-result v2,改成const v2, 0x0,完事。

寫到這里其實還有一個問題,就是代碼中的字符串和實際實現的對不上。這個我也不知道為什么,但是既然有這種情況,就要想別的方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,441評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,537評論 0 17
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • 等待的過程,最享受。 無論怎樣的天氣,無論有沒有反應,無論錢多錢少,我選擇等待,讓一切慢慢發酵,最后不了了之。 也...
    石默默閱讀 267評論 0 0
  • 夢想是什么,原諒我的早熟,因為從小就一直在思考的一個問題。 小時候有兩年,家里條件好,經常爸爸會蒸一盆的螃蟹皮皮蝦...
    沐簡閱讀 289評論 0 0