本帖最后由 牵走天涯 于 2016-10-29 17:34 编辑
最近学到了一些内购的破解方式,就来试试手。然后找个了比较火爆的游戏BB弹,找个个没壳的就来练习。 这些东西都是大神写烂了的东西了,我这里只是写出我自己找不到方法的时候的思路。勿笑。 火柴人需要玩的就拿去试试吧,有什么问题记得回帖告诉我。促进学习!!! 此贴并不是重复贴,我只是记记自己的笔记说说我的思路,顺便给小白领路!内购其实总体来说不是太难,难的是你遇到问题就放弃。讲真,火柴人我弄了一下午加一晚上,才弄明白的! 最后求求CB,求热心,求评分!!!前几天玩回帖奖励,回到了解放前!!!
一、BB弹 BB弹的话比较简单,我们首先弄到模拟器上看看是什么支付。
我们发现支付宝和话费都可以。 那说明我们有很多种方法去破解内购了。我们的目的就是取消就为购买!
我们先用支付宝的
该图为引用的。
我们直接搜索0x1771
把它改为0x1771 -> :sswitch_0 就行了。 然后再来试试话费的,我们直接所搜索paysuccess
分别点进去看看
[Java] 纯文本查看 复制代码 .class Lcom/zplay/bbtan/plug/EgamePlug$2$1;
.super Ljava/lang/Object;
.source "EgamePlug.java"
# interfaces
.implements Lcn/egame/terminal/paysdk/EgamePayListener;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/zplay/bbtan/plug/EgamePlug$2;->run()V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation
# instance fields
.field final synthetic this$1:Lcom/zplay/bbtan/plug/EgamePlug$2;
# direct methods
.method constructor <init>(Lcom/zplay/bbtan/plug/EgamePlug$2;)V
.locals 0
.prologue
.line 1
iput-object p1, p0, Lcom/zplay/bbtan/plug/EgamePlug$2$1;->this$1:Lcom/zplay/bbtan/plug/EgamePlug$2;
.line 79
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public paySuccess(Ljava/util/Map;)V
.locals 2
.param p1, "params" # Ljava/util/Map;
.prologue
.line 90
sget-object v0, Lcom/dubo/android/JniMsgType;->RechargeFail:Lcom/dubo/android/JniMsgType;
invoke-virtual {v0}, Lcom/dubo/android/JniMsgType;->ordinal()I
move-result v0
iget-object v1, p0, Lcom/zplay/bbtan/plug/EgamePlug$2$1;->this$1:Lcom/zplay/bbtan/plug/EgamePlug$2;
# getter for: Lcom/zplay/bbtan/plug/EgamePlug$2;->this$0:Lcom/zplay/bbtan/plug/EgamePlug;
invoke-static {v1}, Lcom/zplay/bbtan/plug/EgamePlug$2;->access$0(Lcom/zplay/bbtan/plug/EgamePlug$2;)Lcom/zplay/bbtan/plug/EgamePlug;
move-result-object v1
# getter for: Lcom/zplay/bbtan/plug/EgamePlug;->_sku:Ljava/lang/String;
invoke-static {v1}, Lcom/zplay/bbtan/plug/EgamePlug;->access$1(Lcom/zplay/bbtan/plug/EgamePlug;)Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Lcom/dubo/android/PlatformMessage;->SendPlatformMessage(ILjava/lang/String;)V
.line 91
return-void
.end method
.method public payFailed(Ljava/util/Map;I)V
.locals 2
.param p1, "params" # Ljava/util/Map;
.param p2, "errorInt" # I
.prologue
.line 86
sget-object v0, Lcom/dubo/android/JniMsgType;->RechargeFail:Lcom/dubo/android/JniMsgType;
invoke-virtual {v0}, Lcom/dubo/android/JniMsgType;->ordinal()I
move-result v0
iget-object v1, p0, Lcom/zplay/bbtan/plug/EgamePlug$2$1;->this$1:Lcom/zplay/bbtan/plug/EgamePlug$2;
# getter for: Lcom/zplay/bbtan/plug/EgamePlug$2;->this$0:Lcom/zplay/bbtan/plug/EgamePlug;
invoke-static {v1}, Lcom/zplay/bbtan/plug/EgamePlug$2;->access$0(Lcom/zplay/bbtan/plug/EgamePlug$2;)Lcom/zplay/bbtan/plug/EgamePlug;
move-result-object v1
# getter for: Lcom/zplay/bbtan/plug/EgamePlug;->_sku:Ljava/lang/String;
invoke-static {v1}, Lcom/zplay/bbtan/plug/EgamePlug;->access$1(Lcom/zplay/bbtan/plug/EgamePlug;)Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Lcom/dubo/android/PlatformMessage;->SendPlatformMessage(ILjava/lang/String;)V
.line 87
return-void
.end method
.method public payCancel(Ljava/util/Map;)V
.locals 2
.param p1, "params" # Ljava/util/Map;
.prologue
.line 82
sget-object v0, Lcom/dubo/android/JniMsgType;->Recharge:Lcom/dubo/android/JniMsgType;
invoke-virtual {v0}, Lcom/dubo/android/JniMsgType;->ordinal()I
move-result v0
iget-object v1, p0, Lcom/zplay/bbtan/plug/EgamePlug$2$1;->this$1:Lcom/zplay/bbtan/plug/EgamePlug$2;
# getter for: Lcom/zplay/bbtan/plug/EgamePlug$2;->this$0:Lcom/zplay/bbtan/plug/EgamePlug;
invoke-static {v1}, Lcom/zplay/bbtan/plug/EgamePlug$2;->access$0(Lcom/zplay/bbtan/plug/EgamePlug$2;)Lcom/zplay/bbtan/plug/EgamePlug;
move-result-object v1
# getter for: Lcom/zplay/bbtan/plug/EgamePlug;->_sku:Ljava/lang/String;
invoke-static {v1}, Lcom/zplay/bbtan/plug/EgamePlug;->access$1(Lcom/zplay/bbtan/plug/EgamePlug;)Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Lcom/dubo/android/PlatformMessage;->SendPlatformMessage(ILjava/lang/String;)V
.line 83
return-void
.end method
显然看不出太多的信息
第二处
这里就很关键了。这个看起来眼花的话,我们看看Java的
我们惊奇的发现,这几个成功,取消和失败的代码只有一处不同。 方法一: 那么我们就可以把取消的RechargeFail换成Recharge就OK了。 方法二: 我们可以把paySuccess和payCancel的函数名调换。也就说说,我们点了取消,却调用的是paySuccess里面的代码。OK。BB弹就简单的破解了。
二、火柴人联盟
这不是重点,重点是。这个游戏在模拟器上打不开。我也不知道为什么,直接反编译。
发现了这个游戏的购买方式很多,移动,电信,联通,支付宝都有。然后还是按照之前破解BB弹的方式去破解。
却发现根本不行。把取消的RechargeFail换成Recharge,不行
把支付宝的代码换掉也不行。
于是认真参考了刚刚那个帖子,发现很多代码已经被原作者改了。那就只有自己研究了
这里就是重点了,我来说说我自己的思路。后来发现这个游戏坑爹的只能移动购买。
首先是住入口去看看 然后在这个函数去看看移动购买的函数。
然后点过去看看,发现信息不是太多。
[Java] 纯文本查看 复制代码 .method private payInYidong()V
.locals 6
.prologue
const/4 v1, 0x1
.line 735
sget v0, Lcom/DBGame/DiabloLOL/DiabloLOL;->sCMCC_OPEN:I
if-nez v0, :cond_0
.line 736
const-string v0, "\u6b63\u5728\u5904\u7406,\u8bf7\u7a0d\u540e....."
invoke-static {v0}, Lcom/DBGame/Common/BLHelper;->showShieldLayer(Ljava/lang/String;)V
.line 738
:cond_0
iget-object v0, p0, Lcom/DBGame/DiabloLOL/DiabloLOL;->PAY_CODE_MM:[Ljava/lang/String;
iget v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL;->mPayIndex:I
aget-object v3, v0, v2
const/4 v4, 0x0
iget-object v5, p0, Lcom/DBGame/DiabloLOL/DiabloLOL;->payCallback:Lcn/cmgame/billing/api/GameInterface$IPayCallback;
move-object v0, p0
move v2, v1
invoke-static/range {v0 .. v5}, Lcn/cmgame/billing/api/GameInterface;->doBilling(Landroid/content/Context;ZZLjava/lang/String;Ljava/lang/String;Lcn/cmgame/billing/api/GameInterface$IPayCallback;)V
.line 739
return-void
.end method
但是我们好像发现了payCallback这个东西。感觉又价值。我们搜索看看。
发现了两处,有用的是第一处的。 于是我们过去看看
这个时候我们就看出来了
[Java] 纯文本查看 复制代码 package com.DBGame.DiabloLOL;
import cn.cmgame.billing.api.GameInterface.IPayCallback;
import com.DBGame.Common.BLHelper;
class DiabloLOL$4
implements GameInterface.IPayCallback
{
DiabloLOL$4(DiabloLOL paramDiabloLOL) {}
public void onResult(int paramInt, String paramString, Object paramObject)
{
switch (paramInt)
{
default:
new StringBuilder().append("购买道具:[").append(this.this$0.PAY_NAME[DiabloLOL.access$800(this.this$0)]).append("] 取消!").toString();
}
for (;;)
{
BLHelper.closeShieldLayer();
return;
if (!"10".equals(paramObject.toString()))
{
new StringBuilder().append("购买道具:[").append(this.this$0.PAY_NAME[DiabloLOL.access$800(this.this$0)]).append("] 成功!").toString();
BLHelper.purchaseComplete(this.this$0.PRO_ID_Str[DiabloLOL.access$800(this.this$0)], 1);
continue;
new StringBuilder().append("购买道具:[").append(this.this$0.PAY_NAME[DiabloLOL.access$800(this.this$0)]).append("] 失败!").toString();
}
}
}
}
也就说packed-switch p1, :pswitch_data_0,然后pswitch_data_0就购买成功。
直接来个goto大发。OK了 教程就到这里了,本破解只为学习交流。访问密码回复可见哦! 360云失效,更更新==
提供样本 火柴人去官网下就是了 成本:
|