吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 29212|回复: 67
收起左侧

[Android 原创] 利用移动支付函数特征 破解移动新游“猎魔勇士1”

  [复制链接]
御剑 发表于 2014-4-23 14:42
本帖最后由 御剑 于 2014-4-23 14:45 编辑

【文章标题】: 利用移动支付函数特征破解移动新游“猎魔勇士1”
【文章作者】: 御剑
【作者邮箱】: 408885352@qq.com
【作者主页】: 无
【作者QQ号】: 无
【软件名称】: 猎魔勇士1
【下载地址】: http://pan.baidu.com/s/1hqsW2Z6  为方便新手研究我就把这个版本上传百度网盘吧
【加壳方式】: 无
【编写语言】: JAVA
【使用工具】: ApkIDE
【软件介绍】: 【安卓游戏】没什么好介绍的...
【作者声明】: 只是技术交流,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】

小菜也只是刚接触移动安全,对JAVA并不是很了解. 如有失误之处还请见谅...

1.用ApkIDE 打开 猎魔勇士1
2.搜索移动支付函数特征:onResult
请看图1
1.jpg
我们会来到移动支付特征函数的段首
[Asm] 纯文本查看 复制代码
# virtual methods
.method public onResult(ILjava/lang/String;Ljava/lang/Object;)V
    .locals 4
    .param p1, "resultCode"    # I
    .param p2, "billingIndex"    # Ljava/lang/String;
    .param p3, "obj"    # Ljava/lang/Object;

    .prologue
    .line 285
    const-string v1, ""

    .line 286
    .local v1, "result":Ljava/lang/String;
    packed-switch p1, :pswitch_data_0

    .line 304
    :goto_0
    return-void

    .line 288
    :pswitch_0
    const-string v2, "001"

    if-ne p2, v2, :cond_0

    .line 289
    const/4 v2, 0x6

    invoke-static {v2}, Lcom/droidhen/defender/game/Shop;->getItem(I)V

    goto :goto_0

    .line 291
    :cond_0
    sget-object v2, Lcom/droidhen/defender/GameActivity;->currentItem:Ljava/lang/String;

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Integer;->intValue()I

    move-result v0

    .line 292
    .local v0, "itemID":I
    invoke-static {v0}, Lcom/droidhen/defender/game/Research;->billSuccess(I)V

    goto :goto_0

    .line 296
    .end local v0    # "itemID":I
    :pswitch_1
    const-string v1, "\u8d2d\u4e70\u5931\u8d25\uff01"

    .line 297
    invoke-static {}, Lcom/droidhen/defender/GameActivity;->getContext()Landroid/content/Context;

    move-result-object v2

    const/4 v3, 0x0

    invoke-static {v2, v1, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v2

    .line 298
    invoke-virtual {v2}, Landroid/widget/Toast;->show()V

    goto :goto_0

    .line 286
    :pswitch_data_0
    .packed-switch 0x1
        :pswitch_0
        :pswitch_1
    .end packed-switch
.end method


第一次接触的童鞋肯定眼花了...

那么我们在打开JAVA源码看看
2.jpg

[Asm] 纯文本查看 复制代码
package com.droidhen.defender;

import android.widget.Toast;
import cn.cmgame.billing.api.GameInterface.IPayCallback;
import com.droidhen.defender.game.Research;
import com.droidhen.defender.game.Shop;

class GameActivity$1
  implements GameInterface.IPayCallback
{
  public void onResult(int paramInt, String paramString, Object paramObject)
  {
    switch (paramInt)
    {
    default:
      return;
    case 1:
      if (paramString == "001")
      {
        Shop.getItem(6);
        return;
      }
      Research.billSuccess(Integer.valueOf(GameActivity.currentItem).intValue());
      return;
    case 2:
    }
    Toast.makeText(GameActivity.getContext(), "购买失败!", 0).show();
  }
}

感觉明了多了...有木有...

下面我们进行大概的分析下(注意看注释)

[Asm] 纯文本查看 复制代码
package com.droidhen.defender;

import android.widget.Toast;
import cn.cmgame.billing.api.GameInterface.IPayCallback;
import com.droidhen.defender.game.Research;
import com.droidhen.defender.game.Shop;

class GameActivity$1
  implements GameInterface.IPayCallback
{
  public void onResult(int paramInt, String paramString, Object paramObject)
  {
    switch (paramInt)  //判断是否确认支付
    {
    default:     //取消支付
      return;
    case 1:   //支付成功
      if (paramString == "001")  //判断游戏内购所需支付的类型
      {
        Shop.getItem(6);      //游戏道具
        return;
      }
      Research.billSuccess(Integer.valueOf(GameActivity.currentItem).intValue()); //游戏激活
      return;
    case 2:   //支付失败
    }
    Toast.makeText(GameActivity.getContext(), "购买失败!", 0).show();
  }
}



[Asm] 纯文本查看 复制代码
# virtual methods
.method public onResult(ILjava/lang/String;Ljava/lang/Object;)V
    .locals 4
    .param p1, "resultCode"    # I
    .param p2, "billingIndex"    # Ljava/lang/String;
    .param p3, "obj"    # Ljava/lang/Object;

    .prologue
    .line 285
const-string v1, ""

    .line 286
    .local v1, "result":Ljava/lang/String;
    packed-switch p1, :pswitch_data_0   //判断是否确认支付  如确定支付则跳转到  :pswitch_data_0
                                            //如取消支付则返回
.line 304
    :goto_0
    return-void  //返回

.line 288
    :pswitch_0
    const-string v2, "001"
                           //猎魔勇士1 支付购买类型有两种...
                                                   //1.游戏商店
//2.游戏激活
if-ne p2, v2, :cond_0  //判断游戏内购所需支付的类型, 如果是游戏激活则跳转到:cond_0  否则往下执行(游戏道具购买)

.line 289
    const/4 v2, 0x6

invoke-static {v2}, Lcom/droidhen/defender/game/Shop;->getItem(I)V

    goto :goto_0

    .line 291
    :cond_0
    sget-object v2, Lcom/droidhen/defender/GameActivity;->currentItem:Ljava/lang/String;

invoke-static {v2}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Integer;->intValue()I

    move-result v0

    .line 292
    .local v0, "itemID":I
    invoke-static {v0}, Lcom/droidhen/defender/game/Research;->billSuccess(I)V

    goto :goto_0

    .line 296
    .end local v0    # "itemID":I
    :pswitch_1
    const-string v1, "\u8d2d\u4e70\u5931\u8d25\uff01"  // "\u8d2d\u4e70\u5931\u8d25\uff01" 转换为ASCII 就是“购买失败”

.line 297
    invoke-static {}, Lcom/droidhen/defender/GameActivity;->getContext()Landroid/content/Context;

    move-result-object v2

    const/4 v3, 0x0

    invoke-static {v2, v1, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v2

    .line 298
    invoke-virtual {v2}, Landroid/widget/Toast;->show()V

    goto :goto_0

    .line 286
    :pswitch_data_0
    .packed-switch 0x1    //判断是否购买成功  
:pswitch_0        //购买成功则跳往:pswitch_0
        :pswitch_1        //购买失败则跳往:pswitch_1
    .end packed-switch
.end method


经过大概分析后 现在我们逆向起来就比较简单了吧! 相信后面的操作大家都可以自己做完了

现在由我来演示下吧...

[Asm] 纯文本查看 复制代码
# virtual methods
.method public onResult(ILjava/lang/String;Ljava/lang/Object;)V
    .locals 4
    .param p1, "resultCode"    # I
    .param p2, "billingIndex"    # Ljava/lang/String;
.param p3, "obj"    # Ljava/lang/Object;

    .prologue
    .line 285
    const-string v1, ""

    .line 286
    .local v1, "result":Ljava/lang/String;
        //经过分析我们已知大概流程...那么我们试试是否可以直接在判断是否购买之前就跳转到购买成功段 :pswitch_0 来实现,在提示购买界面时就已经购买成功了呢?

goto :pswitch_0   //我们使用goto 语句来看看我们的猜测是否正确

packed-switch p1, :pswitch_data_0   //判断是否确认购买  如确定支付则跳转到  :pswitch_data_0
                                            //如取消购买则往下执行(返回)
    .line 304
    :goto_0
    return-void  //返回

.line 288
    :pswitch_0
    const-string v2, "001"
                           //猎魔勇士1 支付购买类型有两种...
                                                   //1.游戏商店
//2.游戏激活
if-ne p2, v2, :cond_0  //判断游戏内购所需支付的类型, 如果是游戏激活则跳转到:cond_0  否则往下执行(游戏道具购买)

.line 289
    const/4 v2, 0x6

    invoke-static {v2}, Lcom/droidhen/defender/game/Shop;->getItem(I)V

    goto :goto_0

    .line 291
    :cond_0
    sget-object v2, Lcom/droidhen/defender/GameActivity;->currentItem:Ljava/lang/String;

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Integer;->intValue()I

    move-result v0

    .line 292
    .local v0, "itemID":I
    invoke-static {v0}, Lcom/droidhen/defender/game/Research;->billSuccess(I)V

    goto :goto_0

    .line 296
    .end local v0    # "itemID":I
    :pswitch_1
    const-string v1, "\u8d2d\u4e70\u5931\u8d25\uff01"  // "\u8d2d\u4e70\u5931\u8d25\uff01" 转换为ASCII 就是“购买失败”

.line 297
    invoke-static {}, Lcom/droidhen/defender/GameActivity;->getContext()Landroid/content/Context;

    move-result-object v2

    const/4 v3, 0x0

    invoke-static {v2, v1, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v2

    .line 298
    invoke-virtual {v2}, Landroid/widget/Toast;->show()V

goto :goto_0

    .line 286
    :pswitch_data_0
    .packed-switch 0x1    //判断是否购买成功  
:pswitch_0        //购买成功则跳往:pswitch_0
        :pswitch_1        //购买失败则跳往:pswitch_1
    .end packed-switch
.end method


OK 修改完毕...咱们在修改保存,重新编译,签名,测试

成品:http://www.52pojie.cn/thread-253480-1-1.html


5.jpg

免费评分

参与人数 6热心值 +6 收起 理由
885 + 1 我很赞同!
晓陽 + 1 谢谢@Thanks!
Terrorist + 1 热心回复!
无邪 + 1 已答复!
周卫国 + 1 谢谢@Thanks!
jojaajj + 1 已收藏,很适用新手,对于刚看完低调大神教.

查看全部评分

本帖被以下淘专辑推荐:

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

YsGer 发表于 2014-4-23 15:16
y79112 发表于 2014-4-23 15:11
好,那个不错,省的去买三星或者苹果哪些所谓的高端机了,好贵的说,苹果系统虽然要好,但是你五六千的手 ...

  问题是iso  给你如丝般润滑   - -   比安卓 好多了  记得 知乎上面有一个 关于 苹果硬件 低  但是 安卓却没有苹果流畅的讨论  你可以 去看下www.zhihu.com
y79112 发表于 2014-4-23 14:46
一看这种画面的游戏,俺就懂了,俺渣渣手机玩起来肯定不能如丝般顺滑,所以,俺只看看不说话
YsGer 发表于 2014-4-23 14:46
  御剑   =  =  我知道 御剑1.5 御剑1.6  不知道你是不是这两款工具的作者
YsGer 发表于 2014-4-23 14:54
y79112 发表于 2014-4-23 14:46
一看这种画面的游戏,俺就懂了,俺渣渣手机玩起来肯定不能如丝般顺滑,所以,俺只看看不说话

不试一试 怎么知道啊!  - -    功能机 路过

点评

主要每次多装几个软件就开始卡了,然后刷机,变卡,再刷机,再变卡。。。我已经放弃治疗了,现在刚刚刷完机,然后准备不再放游戏,不要烧饼。。。然后就没有然后了,哎 下次换个ram大的,512的刚买还行,现在真心渣  发表于 2014-4-23 15:01
小彡哥 发表于 2014-4-23 14:57
新手真看不懂
Dlan 发表于 2014-4-23 14:58
好文章!学习了
YsGer 发表于 2014-4-23 15:04
y79112 发表于 2014-4-23 14:46
一看这种画面的游戏,俺就懂了,俺渣渣手机玩起来肯定不能如丝般顺滑,所以,俺只看看不说话

512确实 小了  现在  基本上都是 4核+1G  标配了   哎
y79112 发表于 2014-4-23 15:07
一个傻子 发表于 2014-4-23 15:04
512确实 小了  现在  基本上都是 4核+1G  标配了   哎

下次换肯定要2g以上的,yy一下,手机什么时候可以拆机自己配啊,嘿嘿,像电脑一样可以自己换主板加内存就太棒了
YsGer 发表于 2014-4-23 15:08
y79112 发表于 2014-4-23 15:07
下次换肯定要2g以上的,yy一下,手机什么时候可以拆机自己配啊,嘿嘿,像电脑一样可以自己换 ...

  好像前段时间 有一个 关于自己可以diy手机的新闻  - -  看来不远了
y79112 发表于 2014-4-23 15:11
一个傻子 发表于 2014-4-23 15:08
好像前段时间 有一个 关于自己可以diy手机的新闻  - -  看来不远了

好,那个不错,省的去买三星或者苹果哪些所谓的高端机了,好贵的说,苹果系统虽然要好,但是你五六千的手机只给1g的ram 确实太抠门了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 16:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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