Android破解學習之路(八)—— 進化之地內購破解

最近在TapTap閒逛,看到了進化之地這款遊戲,TapTap上有兩個進化之地,一個是在TapTap直接購買的,另一個則是試玩版,玩到中間就會有個購買完整版。
試玩版鏈接:https://www.taptap.com/app/33024
閒來無事,即是下了試玩版來玩,感受還不錯,到中間的時候,就是要提示要購買完整版,看了一下界面,發現是咪咕遊戲的SDK,就想着搞事情。
咪咕遊戲裏面有支付寶支付的選項,我選擇以後,點擊了取消,發現了一個Toast提示,短信發送失敗,請嘗試其它支付方式
不過,當我丟入Androidkiller中去反編譯的時候,突然想起,簽名不一樣,沒法覆蓋安裝啊,無奈。html

試玩到中間,會提示一個購買完整版,選擇支付方式爲支付寶,以後返回,提示「短信發送失敗,請嘗試其它支付方式」,一個Toastjava

以此爲關鍵字找到了兩處關鍵代碼android

可是不肯定是哪個,因此咱們將其中的某一個的內容稍微修改一下,接着編譯安裝到手機上,以後即是能夠肯定爲CallSMSPay$3這個smali文件,進到裏面觀察,能夠發現沒有咱們想要的支付成功,撤退。,api

繼續尋找其餘方法,想到咪咕遊戲的破解方法,搜索onresult,發現一堆文件,根本就無從下手,沒辦法,只好一個個看下去,看完整個頭都大了,撤退。網絡

搜索onbilling,沒有結果app

搜索支付成功,看到了一個關鍵文件ide

去看了一下它的僞java代碼,發現有幾個if語句,猜想了一下,將bool1賦值爲true,然而測試的時候以失敗了結。測試

package com.locojoy.function; import android.widget.Toast; import com.adobe.fre.FREContext; import com.adobe.fre.FREFunction; import com.adobe.fre.FREInvalidObjectException; import com.adobe.fre.FREObject; import com.adobe.fre.FRETypeMismatchException; import com.adobe.fre.FREWrongThreadException; import com.locojoy.CallBackImpl; import com.locojoy.Util; import com.umeng.socialize.utils.Log; public class SMSPayResult implements FREFunction { public FREObject call(FREContext paramFREContext, FREObject[] paramArrayOfFREObject) { bool3 = false; bool4 = false; bool5 = false; bool2 = false; str = "10000"; try { bool1 = paramArrayOfFREObject[0].getAsBool(); bool2 = bool1; bool3 = bool1; bool4 = bool1; bool5 = bool1; paramArrayOfFREObject = paramArrayOfFREObject[1].getAsString(); } catch (FREWrongThreadException paramArrayOfFREObject) { for (;;) { bool1 = bool2; paramArrayOfFREObject.printStackTrace(); paramArrayOfFREObject = str; continue; if (CallSMSPay._type == 16) { CallBackImpl.buyResult(paramFREContext, Boolean.valueOf(true)); } else if (CallSMSPay._type == 30) { CallBackImpl.callBackMigu(paramFREContext, "30"); continue; Toast.makeText(paramFREContext.getActivity(), "扣款失敗,請嘗試其它支付方式,錯誤碼:" + paramArrayOfFREObject, 1).show(); } } } catch (IllegalStateException paramArrayOfFREObject) { for (;;) { bool1 = bool3; } } catch (FRETypeMismatchException paramArrayOfFREObject) { for (;;) { bool1 = bool4; } } catch (FREInvalidObjectException paramArrayOfFREObject) { for (;;) { boolean bool1 = bool5; } } Log.i("ANE", "result:" + bool1 + ",code:" + paramArrayOfFREObject); if (bool1) { Toast.makeText(paramFREContext.getActivity(), "支付成功", 1).show(); if (CallSMSPay._type == 1) { CallBackImpl.recoverResult(paramFREContext, "2"); Util.stopWaiting(); return null; } } } }
Java僞代碼

以後,我沒有放棄,繼續去查了一下咪咕的官方開發文檔資料,不過沒有方法下手字體

想了想,仍是回到了CallSMSPay$3這個smali文件,既然找不到支付成功的代碼,那就把這個正在支付這些代碼看成支付成功的代碼,修改switch語句,讓其必定跳轉到pswitch_2這裏spa

由於pswitch_2便是正在支付的那個過程

 

以後測試的時候,奇蹟發生了,成功了!!個人心情真的是爽了!!

不過,尚未完,咪咕遊戲通常有較多的廣告,這個我也得想辦法破掉。

首先,是退出界面的時候,會彈出兩次對話框,一次是正宗的對話框,(即帶有肯定和取消兩個選項的對話框),以後選擇肯定以後,它還會出現一個咪咕班的對話框,上面就是有着廣告,帶有兩個按鈕,退出遊戲和返回,這時候點擊退出遊戲纔是真正的退出遊戲

我去觀察了一下里面的代碼,發現了四個關鍵文件,以下圖

經過代碼,再結合Android開發中的對話框代碼,ExitGame$1裏面是點擊肯定按鈕所要執行的代碼,ExitGame$2則是點擊取消按鈕所要執行的代碼

按照咱們剛纔的邏輯,咱們點擊肯定以後,還會出現一個咪咕版的對話框(帶有廣告),這代碼確定是在ExitGame$1這裏面,咱們進去就能夠看到,下面綠色的字體就是打開咪咕對話框的關鍵代碼,咱們將這些代碼註釋掉,以後加上紅色的那一行,這一行的原java代碼就是system.exit(0),這樣點擊肯定按鈕就能夠直接退出了

.method public onClick(Landroid/content/DialogInterface;I)V
    .locals 2
    .param p1, "dialog"    # Landroid/content/DialogInterface;
    .param p2, "which"    # I

    .prologue
    .line 45
    const/4 v0, 0x0

    invoke-static {v0}, Ljava/lang/System;->exit(I)V
    #new-instance v0, Lcom/locojoy/function/ExitGame$1$1;

    #invoke-direct {v0, p0}, Lcom/locojoy/function/ExitGame$1$1;-><init>(Lcom/locojoy/function/ExitGame$1;)V

    .line 56
    #.local v0, "gameExitCallback":Lcn/cmgame/billing/api/GameInterface$GameExitCallback;
   # iget-object v1, p0, Lcom/locojoy/function/ExitGame$1;->val$_activity:Landroid/app/Activity;

    #invoke-static {v1, v0}, Lcn/cmgame/billing/api/GameInterface;->exit(Landroid/content/Context;Lcn/cmgame/billing/api/GameInterface$GameExitCallback;)V

    #.line 57
    return-void
.end method

 

PS:經測試發現,刪除了網絡權限,就能夠去彈窗廣告,不能肯定是否會影響購買(由於是在我是在內購成功購買以後才弄的去廣告,不清楚去除網絡權限是否還能夠啓動那個購買界面)

相關文章
相關標籤/搜索