天天看點

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

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

最近在TapTap閑逛,看到了進化之地這款遊戲,TapTap上有兩個進化之地,一個是在TapTap直接購買的,另外一個則是試玩版,玩到中間就會有個購買完整版。

試玩版連接配接:https://www.taptap.com/app/33024

閑來無事,便是下了試玩版來玩,感覺還不錯,到中間的時候,就是要提示要購買完整版,看了一下界面,發現是咪咕遊戲的SDK,就想着搞事情。

咪咕遊戲裡面有支付寶支付的選項,我選擇之後,點選了取消,發現了一個Toast提示,短信發送失敗,請嘗試其它支付方式,

不過,當我丢入Androidkiller中去反編譯的時候,忽然想起,簽名不同,無法覆寫安裝啊,無奈。

試玩到中間,會提示一個購買完整版,選擇支付方式為支付寶,之後傳回,提示“短信發送失敗,請嘗試其它支付方式”,一個Toast

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

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

但是不确定是哪一個,是以我們将其中的某一個的内容稍微修改一下,接着編譯安裝到手機上,之後便是可以确定為CallSMSPay$3這個smali檔案,進到裡面觀察,可以發現沒有我們想要的支付成功,撤退。,

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

搜尋onbilling,沒有結果

搜尋支付成功,看到了一個關鍵檔案

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

去看了一下它的僞java代碼,發現有幾個if語句,猜測了一下,将bool1指派為true,然而測試的時候以失敗告終。

Android破解學習之路(八)—— 進化之地内購破解
Android破解學習之路(八)—— 進化之地内購破解
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這裡

因為pswitch_2即是正在支付的那個過程

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

之後測試的時候,奇迹發生了,成功了!!我的心情真的是爽了!!

不過,還沒有完,咪咕遊戲一般有較多的廣告,這個我也得想辦法破掉。

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

我去觀察了一下裡面的代碼,發現了四個關鍵檔案,如下圖

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

通過代碼,再結合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:經測試發現,删除了網絡權限,就可以去彈窗廣告,不能确定是否會影響購買(因為是在我是在内購成功購買之後才弄的去廣告,不清楚去除網絡權限是否還可以啟動那個購買界面)

提問之前,請先看提問須知

點選右側圖示發起提問

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

或者加入QQ群一起學習

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

TornadoFx學習交流群:1071184701

繼續閱讀