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:经测试发现,删除了网络权限,就能够去弹窗广告,不能肯定是否会影响购买(由于是在我是在内购成功购买以后才弄的去广告,不清楚去除网络权限是否还能够启动那个购买界面)

相关文章
相关标签/搜索