吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22318|回复: 65
收起左侧

[Android 原创] Android逆向实例笔记—手游中的内购破解(火柴人联盟最新版1.9.2 BB弹 )

  [复制链接]
牵走天涯 发表于 2016-9-6 22:22
本帖最后由 牵走天涯 于 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弹之后,我本以为内购破解起来很简单。也很好玩,然后逛吾爱的时候,看到一篇破解火柴人的帖子。我也就去下了个官方版本去试试破解。(版本比帖子的高,帖子地址:http://www.52pojie.cn/thread-522841-1-1.html

这不是重点,重点是。这个游戏在模拟器上打不开。我也不知道为什么,直接反编译。

发现了这个游戏的购买方式很多,移动,电信,联通,支付宝都有。然后还是按照之前破解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云失效,更更新==
提供样本
链接:http://pan.baidu.com/s/1kVO5jan 密码:tdhl
火柴人去官网下就是了
成本:
链接:http://pan.baidu.com/s/1miAVRYS 密码:ly3e
链接:http://pan.baidu.com/s/1hs7GnFQ 密码:wisz

免费评分

参与人数 15吾爱币 +2 热心值 +15 收起 理由
free_dragon + 1 + 1 用心讨论,共获提升!
maomaozhuzhu521 + 1 + 1 用心讨论,共获提升!
wolvessolo + 1 我很赞同!
xyt + 1 我很赞同!
13427546798 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
冷亦寒008 + 1 的确有意思。看着他人的历程很有帮助
Hmily + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
miracles + 1 用心讨论,共获提升!
prinsgg + 1 用心讨论,共获提升!
caijvggvg + 1 我很赞同!
wudifuzhushi + 1 用心讨论,共获提升!
fhy129 + 1 用心讨论,共获提升!
ablack + 1 用心讨论,共获提升!
麓仁葭 + 1 用心讨论,共获提升!
william2568 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

aiyaya 发表于 2016-11-9 00:19
我刚学习是菜鸟,最后提示 文件名或扩展名太长 这个怎么解决能指点一下吗?
>        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
>        at java.lang.Runtime.exec(Runtime.java:620)
>        at java.lang.Runtime.exec(Runtime.java:485)
>        ... 13 more
>Caused by: java.io.IOException: CreateProcess error=206, 文件名或扩展名太长。
>        at java.lang.ProcessImpl.create(Native Method)
>        at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
>        at java.lang.ProcessImpl.start(ProcessImpl.java:137)
>        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
>        ... 15 more
APK 编译失败,无法继续下一步签名!
荆阁 发表于 2016-12-23 14:45
请教个问题。0xfa1 -> :sswitch_3
        0x1388 -> :sswitch_5
        0x1771 -> :sswitch_0
        0x1772 -> :sswitch_2
        0x1f40 -> :sswitch_4
        0x2328 -> :sswitch_0
这个返回显示成功了,但是没有充值的金额。怎么回事@牵走天涯
pray丶 发表于 2016-9-6 22:28
52pojieYiHui 发表于 2016-9-6 22:30
表示有些环节没看懂,继续学习吧。
陈树进 发表于 2016-9-6 22:42
        已答复!
初亦泽 发表于 2016-9-6 23:03
非常感谢,,
唯美美 发表于 2016-9-6 23:10
看不懂,好高深~~~~~~~~~~~~~~!
godycg 发表于 2016-9-6 23:40
好东西,喜欢这种破解教程
布鲁云 发表于 2016-9-6 23:52
感谢分享!
xh52236206 发表于 2016-9-7 00:18
顶楼主啦..希望楼主多发精品好帖啦.....
23king 发表于 2016-9-7 00:18
刚刚还练习破了个popstar。。。。。。。。不过我是直接找到充值回调,在回调里面switch前把switch的条件改成了0(0就是成功的匹配值)。。然后好了。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 10:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表