吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 115137|回复: 504
上一主题 下一主题
收起左侧

[Android 原创] [最新版新增技能免CD]火柴人联盟v1.16.1去签名验证去广告Android内购破解(附smali...

    [复制链接]
跳转到指定楼层
楼主
dryzh 发表于 2017-6-28 22:40 回帖奖励
本帖最后由 dryzh 于 2018-7-12 07:36 编辑

授人以鱼不如授人以渔,谁将授吾以渔? --by B.S. {:1_1:}
废话不多说了.先上图,分析修改说明随后附上.
注: 文章排版是用的论坛Markdown编辑的(因我的博客是基于markdown),是有点不太好阅读,可以拉到一楼最下面左边有md的导航.
真机安装还是一直卡在"正在处理,请稍后......"的童鞋,请前往2楼下载我修复过的移动支付接口版本和以后更新的各种支付接口版本(可以手机点击下载最新测试版在线安装.)
其实在B.S.去签名去广告内购破解版,下面的百度下载是个可以点击下载在线安装的最新修复版备用链接O(∩_∩)O哈哈~
应大家强烈要求,放技能免CD方法如下图:(不要关心显示的冷却时间,猛戳技能不要停)








---Creaked by  B.S. 6/26/2017 9:22:40 PM

无聊练手,当作学习Android优秀源码的笔记

仅供学习研究,请勿用作商业用途,如若喜欢请支持正版!

最新版原程序:

百度下载

(v1.16.1)

http://www.appchina.com/app/com.DBGame.DiabloLOL.yyh

http://android.myapp.com/myapp/detail.htm?apkName=com.DBGame.DiabloLOL

火柴人联盟官网: http://huo.hoolaigames.com/

B.S.去签名去广告内购破解版:(无限内购)

百度下载(移动联通电信全网通+第三方支付接口版)

(v1.16.1) 链接: https://pan.baidu.com/s/1i5OiXNZ 密码: vh7u

(v1.15.1) 链接: https://pan.baidu.com/s/1bLxtjo 密码: teyv

(v1.14.1) 链接: https://pan.baidu.com/s/1slTpHUH 密码: rt4r

联通接口的游戏联盟会员包月可以直接领铂金会员礼包无限内购版
也可以去各大安卓市场搜索下载最新版本:(推荐支付接口比较熟悉的移动,咪咕游戏,爱游戏)

爱游戏: http://www.play.cn/

咪咕游戏: http://g.10086.cn/

中国移动应用商城: http://mm.10086.cn/android

腾讯应用宝: http://android.myapp.com/

360手机助手: http://zhushou.360.cn/

百度旗下安卓市场: http://apk.hiapk.com/

安智市场: http://www.anzhi.com/

应用汇安卓市场: http://www.appchina.com/

魅族应用商店: http://app.flyme.cn/

小米游戏中心: http://game.xiaomi.com/index.php

华为应用市场: http://appstore.huawei.com/

有图有真相:

运营商网络 特征码 备注
中国移动 46000、46002、46007、46020 return 0 getMobileType
中国联通 46001、46006、46010 return 2 getOperatorType
中国电信 46003、46005、46011 return 1 getSimType

1. 去签名验证:

android killer不修改直接回编译后,是有签名验证的,检测提示盗版破解游戏.签名验证盗版提示


当然是先跑一遍原程序,看看logcat有没有敏感信息可以用;现在搜索字符串了,

signatures

getAPPSecretString

有侵权

BLACK_NAME

找到第一条添加黑名单的工具类就是,向上回溯查看哪里引用了getAPPSecretString这个方法

.class public Lcn/mycompany/addblackname/utils/utils;

.super Ljava/lang/Object;

.source "utils.java"

.method public static getAPPSecretString(Landroid/content/Context;)Ljava/lang/String;

    .prologue
    .line 21
    invoke-virtual {p0}, Landroid/content/Context;->getPackageName()Ljava/lang/String;

    move-result-object v4

    .line 22
    .local v4, "pkgname":Ljava/lang/String;
    const-string v1, ""

    return-object v1  #去签名验证从:try_start_0开始到:catch_0,但里面的返回留着.直接返回空的字符串

.end method

去验证的修改方法很多种,还可以在下面的类里定位到check方法函数.

根据经验可以去看看onCreate有没可用的信息,一般初始化在这里有处理.

.class public Lcom/DBGame/DiabloLOL/DiabloLOL;

.super Lorg/cocos2dx/lib/Cocos2dxActivity;

.source "DiabloLOL.java"

.method protected onCreate(Landroid/os/Bundle;)V

    #前面还有若干代码
    ###黑名单功能开始
    .line 240

    new-instance v0, Lcn/mycompany/addblackname/AddBlackName;

    invoke-direct {v0, p0}, Lcn/mycompany/addblackname/AddBlackName;-><init>(Landroid/content/Context;)V

    .line 241
    .local v0, "blackName":Lcn/mycompany/addblackname/AddBlackName;
    #invoke-static {}, Lcn/mycompany/addblackname/AddBlackName;->Check()V
    ###黑名单功能结束
    #后面还有若干代码

顺便广告的也可以看看能不能处理了

    #前面还有若干代码
    ###广告的初始化开始
    .line 260
    #invoke-static {p0, v7}, Lcn/cmgame/billing/api/game/main/Tool;->adIntervalInit(Landroid/app/Activity;Lcn/cmgame/billing/api/game/main/Listener;)V

    .line 262
    #invoke-static {p0, v7}, Lcn/cmgame/billing/api/game/main/Tool;->adNativeInit(Landroid/app/Activity;Lcn/cmgame/billing/api/game/main/Listener;)V
    ###广告的初始化结束
    #后面还有若干代码

看到Lcn/mycompany/addblackname/AddBlackName;->Check()V是在添加黑名单的类里,
查看方法,处理check()V

.method public static Check()V
    .locals 6

    .prologue
    ######插入代码开始 coded by B.S.

    const-string v0, "Lcn/mycompany/addblackname/AddBlackName;->check()V \n  -- by B.S."

    invoke-static {v0}, Lcom/android/BS/Log;->LogStr(Ljava/lang/String;)V

    ######插入代码结束 coded by B.S.
    return-void   #直接返回使签名验证失效.
.end method

2. 去广告:

去除返回退出的横幅广告:

点返回按钮,logcat找到敏感字符

----- showInterAD --exit

反编译后,搜索

----- showInterAD

HANDLER_SHOW_INTER_AD

在下面类修改

.class public Lcom/DBGame/Common/BLHelper;

.super Ljava/lang/Object;

.source "BLHelper.java"

不让他发送显示广告的消息

public static final int HANDLER_SHOW_INTER_AD = 211;

.field public static final HANDLER_SHOW_INTER_AD:I = 0xd3

.method public static showInterAD(Ljava/lang/String;)V
    .locals 6
    .param p0, "tag"    # Ljava/lang/String;

    .prologue
    .line 360
    const-string v3, "ad"

    new-instance v4, Ljava/lang/StringBuilder;

    invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V

    const-string v5, "----- showInterAD --"

    invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v4

    invoke-virtual {v4, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v4

    invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v4

    invoke-static {v3, v4}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I

    .line 361
    const/4 v1, 0x0

    .line 362
    .local v1, "index":I
    const/4 v0, 0x0

    .local v0, "i":I
    :goto_0
    sget-object v3, Lcom/DBGame/Common/BLHelper;->adTags:[Ljava/lang/String;

    array-length v3, v3

    if-ge v0, v3, :cond_0

    .line 363
    sget-object v3, Lcom/DBGame/Common/BLHelper;->adTags:[Ljava/lang/String;

    aget-object v3, v3, v0

    invoke-virtual {v3, p0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v3

    if-eqz v3, :cond_1

    .line 364
    move v1, v0

    .line 368
    :cond_0
    new-instance v2, Landroid/os/Message;

    invoke-direct {v2}, Landroid/os/Message;-><init>()V

    .line 369
    .local v2, "msg":Landroid/os/Message;
    const/16 v3, 0xd3

    iput v3, v2, Landroid/os/Message;->what:I

    .line 370
    iput v1, v2, Landroid/os/Message;->arg1:I

    .line 371
    sget-object v3, Lcom/DBGame/Common/BLHelper;->sContext:Lcom/DBGame/DiabloLOL/DiabloLOL;
    #去退出广告,不让他发送显示广告的消息,下面一句给注释或删掉
    #invoke-virtual {v3, v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->sendMessage(Landroid/os/Message;)V

    .line 372
    return-void

    .line 362
    .end local v2    # "msg":Landroid/os/Message;
    :cond_1
    add-int/lit8 v0, v0, 0x1

    goto :goto_0
.end method
去除选英雄和副本的横幅广告:

public static final int HANDLER_SHOWBANNER = 200;
public static final int HANDLER_HIDEBANNER = 210;

case DiabloLOL.HANDLER_HIDEBANNER /*210*/:
                    DiabloLOL.this.hideBanner();
case 200:
                    DiabloLOL.this.showBanner();

修改下面类里的方法

.class public Lcom/DBGame/Common/BLHelper;

.super Ljava/lang/Object;

.source "BLHelper.java"

.method public static showBanner(Ljava/lang/String;)V
    .locals 2
    .param p0, "tag"    # Ljava/lang/String;

    .prologue
    .line 375
    new-instance v0, Landroid/os/Message;

    invoke-direct {v0}, Landroid/os/Message;-><init>()V

    .line 376
    .local v0, "msg":Landroid/os/Message;
    const/16 v1, 0xd2  #const/16 v1, 0xc8  #显示横幅广告的发送消息的代码 0xc8 200 休改为 0xd2 210   隐藏横幅

    iput v1, v0, Landroid/os/Message;->what:I

    .line 377
    sget-object v1, Lcom/DBGame/Common/BLHelper;->sContext:Lcom/DBGame/DiabloLOL/DiabloLOL;

    #去横幅广告,或者不让他发送显示广告的消息,
    invoke-virtual {v1, v0}, Lcom/DBGame/DiabloLOL/DiabloLOL;->sendMessage(Landroid/os/Message;)V

    .line 378
    return-void
.end method

可以再去下面类里看看,消息处理的地方
.method public handleMessage(Landroid/os/Message;)V

.class Lcom/DBGame/DiabloLOL/DiabloLOL$3;

.super Landroid/os/Handler;

.source "DiabloLOL.java"

    case 200: 
      //DiabloLOL.access$400(this.this$0);
      return;
    case 210: 
      //DiabloLOL.access$500(this.this$0);
      return;
    case 211: 
      Log.e("qq", "HANDLER_SHOW_INTER_AD==========");
      //DiabloLOL.access$600(this.this$0, paramMessage.arg1);
      return;

对应的smali

    .line 650
    #去除显示横幅sswitch_8
    :sswitch_8
    iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$3;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;

    # invokes: Lcom/DBGame/DiabloLOL/DiabloLOL;->showBanner()V
    #invoke-static {v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$400(Lcom/DBGame/DiabloLOL/DiabloLOL;)V

    goto :goto_0

    .line 654
    #去除隐藏横幅sswitch_9
    :sswitch_9
    iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$3;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;

    # invokes: Lcom/DBGame/DiabloLOL/DiabloLOL;->hideBanner()V
    #invoke-static {v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$500(Lcom/DBGame/DiabloLOL/DiabloLOL;)V

    goto :goto_0

    .line 658
    #去除显示嵌入式广告sswitch_a
    :sswitch_a
    const-string v2, "qq"

    const-string v3, "HANDLER_SHOW_INTER_AD=========="

    invoke-static {v2, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

    .line 659
    iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$3;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;

    iget v3, p1, Landroid/os/Message;->arg1:I

    # invokes: Lcom/DBGame/DiabloLOL/DiabloLOL;->showInterAd(I)V
    #invoke-static {v2, v3}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$600(Lcom/DBGame/DiabloLOL/DiabloLOL;I)V

    goto/16 :goto_0

消息处理的代码如下:

        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 10:
                    DiabloLOL.this.exitGame();
                    return;
                case 11:
                    ((ClipboardManager) Cocos2dxActivity.getContext().getSystemService("clipboard")).setPrimaryClip(ClipData.newPlainText(MiniDefine.ax, BLHelper.copyString));
                    Toast.makeText(DiabloLOL.this, "拷贝成功!", 0).show();
                    return;
                case 30:
                    if (BLHelper.IPAYTAYPE == 1) {
                        DiabloLOL.this.payInDuanXin();
                        return;
                    } else if (BLHelper.IPAYTAYPE != 2 && DiabloLOL.RECHARGE_CHANNELS.indexOf(String.valueOf(DiabloLOL.this.iFromPay)) != -1) {
                        DiabloLOL.this.payInDuanXin();
                        return;
                    } else {
                        return;
                    }
                case 102:
                    OGPub.Instance().closeLoad();
                    return;
                case 200:
                    DiabloLOL.this.showBanner();
                    return;
                case DiabloLOL.HANDLER_HIDEBANNER /*210*/:
                    DiabloLOL.this.hideBanner();
                    return;
                case DiabloLOL.HANDLER_SHOW_INTER_AD /*211*/:
                    Log.e("qq", "HANDLER_SHOW_INTER_AD==========");
                    DiabloLOL.this.showInterAd(msg.arg1);
                    return;
                case DiabloLOL.HANDLER_REYUN_EXIT /*400*/:
                    ReYun.exitSdk();
                    return;
                case DiabloLOL.HANDLER_SHOWSHARE /*420*/:
                    DiabloLOL.this.showShareDialog();
                    return;
                case DiabloLOL.HANDLER_SAVEPIC /*450*/:
                    BLHelper.savePic();
                    return;
                case DiabloLOL.HANDLER_MONTHCONTRA /*470*/:
                    DiabloLOL.this.purchaseMonthlyContract(msg.arg1);
                    return;
                case DiabloLOL.HANDLER_HIDEWEBDATA /*998*/:
                    BLHelper.webout();
                    return;
                default:
                    return;
            }
        }

顺便也解决下其他的函数,
.method private showBanner()V和.method private showInterAd(I)V
处理掉直接返回

.class public Lcom/DBGame/DiabloLOL/DiabloLOL;

.super Lorg/cocos2dx/lib/Cocos2dxActivity;

.source "DiabloLOL.java"

.method private showBanner()V
    .locals 5

    .prologue
    .line 338
    return-void    #直接返回

    const v1, 0x3e4ccccd    # 0.2f

    const v2, 0x3f4ccccd    # 0.8f

    const v3, 0x3f19999a    # 0.6f

    const v4, 0x3e19999a    # 0.15f

    :try_start_0
    invoke-static {p0, v1, v2, v3, v4}, Lcn/cmgame/billing/api/game/main/Tool;->adNativeShow(Landroid/app/Activity;FFFF)V
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

    .line 342
    :goto_0
    return-void

    .line 339
    :catch_0
    move-exception v0

    .line 340
    .local v0, "e":Ljava/lang/Exception;
    invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

    goto :goto_0
.end method

.method private showInterAd(I)V
    .locals 1
    .param p1, "index"    # I

    .prologue
    .line 354
    return-void  #直接返回
    :try_start_0
    invoke-static {p0, p1}, Lcn/cmgame/billing/api/game/main/Tool;->adIntervalShow(Landroid/app/Activity;I)V
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

    .line 358
    :goto_0
    return-void

    .line 355
    :catch_0
    move-exception v0

    .line 356
    .local v0, "e":Ljava/lang/Exception;
    invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

    goto :goto_0
.end method
去除今日推荐5秒闪屏广告:

.class public Lcn/cmgame/billing/api/game/main/Tool;

.super Ljava/lang/Object;

.method public static adSplashShow(Landroid/app/Activity;Ljava/lang/Class;Ljava/lang/Class;Landroid/os/Handler;)Z
    .locals 7
    const/4 v0, 0x1

    const/4 v1, 0x0

    const-string v2, "---adSplashShow----"

    invoke-static {v2}, Lcn/cmgame/billing/api/game/e/d;->b(Ljava/lang/String;)V

    sput-object p0, Lcn/cmgame/billing/api/game/main/Tool;->splashActivity:Landroid/app/Activity;

    :try_start_0
    ###### 自带日志输出  appSign
    const-string v3, "---B.S.---Tool.adSplashShow"
    #move-object/from16 v2, v2  #v0是要打印输出的内容
    invoke-static {v3, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
    move v0, v1  #这里要,返回为0去今日推荐5秒闪屏广告,返回为1会一直黑屏
    goto :goto_0
    ######

3. 内购破解:

去除可能会产生费用的危险权限:

AndroidManifest.xml里搜索

android.permission.SEND_SMS

android.permission.CALL_PHONE

删掉

<uses-permission android:name="android.permission.SEND_SMS"/>

<uses-permission android:name="android.permission.CALL_PHONE"/>
电信支付接口:

logcat字符串定位,

Egame支付成功

Egame支付Cancel

order id:

搜索上面字符串,向上分析,回溯分析.

.class public Lcn/egame/terminal/paysdk/EgamePay;

.super Ljava/lang/Object;

.source "EgamePay.java"

.method public static pay(Landroid/app/Activity;Ljava/util/Map;Lcn/egame/terminal/paysdk/EgamePayListener;)V
    .locals 1
    .param p0, "activity"    # Landroid/app/Activity;
    .param p2, "listener"    # Lcn/egame/terminal/paysdk/EgamePayListener;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Landroid/app/Activity;",
            "Ljava/util/Map",
            "<",
            "Ljava/lang/String;",
            "Ljava/lang/String;",
            ">;",
            "Lcn/egame/terminal/paysdk/EgamePayListener;",
            ")V"
        }
    .end annotation

    .prologue
    .line 78
    #注意paySuccess这个函数只有一个参数.method public abstract paySuccess(Ljava/util/Map;)V
    #而失败payFailed这个函数有第二个整型参数 .method public abstract payFailed(Ljava/util/Map;I)V
    # Egame支付成功
    invoke-interface {p2, p1}, Lcn/egame/terminal/paysdk/EgamePayListener;->paySuccess(Ljava/util/Map;)V

    return-void

.end method

还可以用paySuccess函数体代替payCancel和payFailed.在下面的类里,

.class Lcom/DBGame/DiabloLOL/DiabloLOL$6;

.super Ljava/lang/Object;

.source "DiabloLOL.java"

联通支付接口:

logcat字符串定位啊,

Unicom支付成功

Unicom支付cancel

在下面类修改处理,可以用goto大法或者switch大法.

.class Lcom/DBGame/DiabloLOL/DiabloLOL$4;

.super Ljava/lang/Object;

.source "DiabloLOL.java"

.method public PayResult(Ljava/lang/String;IILjava/lang/String;)V

    .prologue
    .line 694
    goto  :pswitch_0  #联通支付接口,直接JMP无条件跳到支付成功 
    packed-switch p2, :pswitch_data_0
移动支付接口:

logcat定位字符串,

购买道具:[

] 成功!

] 失败!

在下面类修改

.class Lcom/DBGame/DiabloLOL/DiabloLOL$5;

.super Ljava/lang/Object;

.source "DiabloLOL.java"

.method public onResult(ILjava/lang/String;Ljava/lang/Object;)V

    .prologue
    .line 735
    const-string v0, ""

    .line 736
    .local v0, "result":Ljava/lang/String;
    goto :pswitch_0   #移动支付接口,直接JMP无条件跳到支付成功 
    packed-switch p1, :pswitch_data_0

4. 统一支付接口:

统一为电信的吧.可以直接成功,没那么多弹窗支付

定位字符串

电信初始化成功

.method protected onCreate(Landroid/os/Bundle;)V

    .line 254
    invoke-direct {p0}, Lcom/DBGame/DiabloLOL/DiabloLOL;->getSimType()I

    move-result v4

    iput v4, p0, Lcom/DBGame/DiabloLOL/DiabloLOL;->iFromPay:I

进入getSimType方法函数处理结果然后赋值给iFromPay

    private int getSimType() {
        int type = 0;
        String sOperator = ((TelephonyManager) getSystemService("phone")).getSimOperator().trim();
        if (sOperator == null || sOperator.equals("")) {
            return 0;
        }
        switch (Integer.valueOf(sOperator).intValue()) {
            case 46000:
            case 46002:
            case 46007:
            case 46020:
                type = 0;
                break;
            case 46001:
            case 46006:
                type = 2;
                break;
            case 46003:
            case 46005:
            case 46011:
                type = 1;
                break;
        }
        return type;
    }

直接return 1;伪装为电信,支付接口统一完毕.请参看本文开头的SIM类型表格

我第一次比较麻烦的改法如下,

.method private getSimType()I
    .locals 6

    .prologue
    .line 267
    const/4 v3, 0x1  #const/4 v3, 0x0  #初始化为0是移动

    .line 268
    .local v3, "type":I
    const-string v5, "phone"

    .line 269
    invoke-virtual {p0, v5}, Lcom/DBGame/DiabloLOL/DiabloLOL;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v2

    check-cast v2, Landroid/telephony/TelephonyManager;

    .line 270
    .local v2, "tm":Landroid/telephony/TelephonyManager;
    invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getSimOperator()Ljava/lang/String;

    move-result-object v5

    invoke-virtual {v5}, Ljava/lang/String;->trim()Ljava/lang/String;

    move-result-object v1

    ######插入自定义log开始

    invoke-static {v1}, Lcom/android/BS/Log;->LogStr(Ljava/lang/String;)V

    ######插入自定义log结束

    ######插入自定义log开始  

    const-string v0, "\n\u65e0\u9650\u5185\u8d2dB.S.\u7834\u89e3\u7248\n www.appleos.xyz \n-- by B.S."

    invoke-static {v0}, Lcom/android/BS/Log;->LogStr(Ljava/lang/String;)V

    ######插入自定义log结束

    .line 271
    .local v1, "sOperator":Ljava/lang/String;
    if-eqz v1, :cond_0

    const-string v5, ""

    invoke-virtual {v1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v5

    if-eqz v5, :cond_1

    :cond_0
    move v4, v3    #移动为0

    .line 295
    .end local v3    # "type":I
    .local v4, "type":I
    :goto_0
    return v4

    .line 274
    .end local v4    # "type":I
    .restart local v3    # "type":I
    :cond_1
    invoke-static {v1}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;

    move-result-object v5

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

    move-result v0

    .line 275
    .local v0, "sCode":I
    packed-switch v0, :pswitch_data_0

    :goto_1
    :pswitch_0
    move v4, v3

    .line 295
    .end local v3    # "type":I
    .restart local v4    # "type":I
    goto :goto_0

    .line 280
    .end local v4    # "type":I
    .restart local v3    # "type":I
    :pswitch_1
    const/4 v3, 0x1  #const/4 v3, 0x0   #移动

    .line 281
    goto :goto_1

    .line 284
    :pswitch_2
    const/4 v3, 0x1  #const/4 v3, 0x2   #联通

    .line 285
    goto :goto_1

    .line 289
    :pswitch_3
    const/4 v3, 0x1    #电信

    .line 290
    goto :goto_1

    .line 275
    :pswitch_data_0
    .packed-switch 0xb3b0    
        :pswitch_1
        :pswitch_2
        :pswitch_1
        :pswitch_3
        :pswitch_0
        :pswitch_3
        :pswitch_2
        :pswitch_1
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_3
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_0
        :pswitch_1
    .end packed-switch
.end method

也可以直接return 0,伪装为移动,统一为移动支付.

.method private getSimType()I
    .locals 6

    ###统一为移动短信支付接口直接返回为0
    #const/4 v4, 0x0

    #return v4
.end method

然后处理移动短信支付的函数方法payInYidong(),移动短信支付的另外一种破解方法,

.class Lcom/DBGame/DiabloLOL/DiabloLOL$5;

.super Ljava/lang/Object;

.source "DiabloLOL.java"

把移动购买成功的代码,就是:pswitch_0里两个goto :goto_0之间的有效代码,直接搬到payInYidong()里,放到:cond_0和return-void之间.

    .line 755
    :goto_0
    invoke-static {}, Lcom/DBGame/Common/BLHelper;->closeShieldLayer()V

    .line 756
    return-void

    .line 738
    :pswitch_0
    const-string v1, "10"

    invoke-virtual {p3}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v1

    if-eqz v1, :cond_0

    .line 739
    const-string v0, "\u77ed\u4fe1\u8ba1\u8d39\u8d85\u65f6"

    goto :goto_0

    .line 741
    :cond_0  ###从下面一句开始购买成功,不弹窗.
    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    const-string v2, "\u8d2d\u4e70\u9053\u5177\uff1a["

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;  #和下一语句合并

    iget-object v2, v2, Lcom/DBGame/DiabloLOL/DiabloLOL;->PAY_NAME:[Ljava/lang/String;

    iget-object v3, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;  #和下一语句合并

    # getter for: Lcom/DBGame/DiabloLOL/DiabloLOL;->mPayIndex:I
    invoke-static {v3}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$800(Lcom/DBGame/DiabloLOL/DiabloLOL;)I

    move-result v3

    aget-object v2, v2, v3

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    const-string v2, "] \u6210\u529f\uff01"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    .line 742
    iget-object v1, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;  #和下一语句合并

    iget-object v1, v1, Lcom/DBGame/DiabloLOL/DiabloLOL;->PRO_ID_Str:[Ljava/lang/String;

    iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL;  #和下一语句合并

    # getter for: Lcom/DBGame/DiabloLOL/DiabloLOL;->mPayIndex:I
    invoke-static {v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$800(Lcom/DBGame/DiabloLOL/DiabloLOL;)I

    move-result v2

    aget-object v1, v1, v2

    const/4 v2, 0x1

    invoke-static {v1, v2}, Lcom/DBGame/Common/BLHelper;->purchaseComplete(Ljava/lang/String;I)V

    goto :goto_0  ###购买成功不弹窗到goto那边的closeShieldLayer语句然后返回结束

    .line 748
    :pswitch_1

最后应该变为java源码如下面的样子:

private void payInYidong() {
        if (LOLConstant.sCMCC_OPEN == 0) {
            BLHelper.showShieldLayer("正在处理,请稍后.....");
        }
        String str = "购买道具:[" + this.PAY_NAME[this.mPayIndex] + "] 成功!";
        BLHelper.purchaseComplete(this.PRO_ID_Str[this.mPayIndex], 1);
        BLHelper.closeShieldLayer();
    }

有童靴反应真机内购,会卡在"正在处理,请稍后.....",其实这个要等一会的,等一会儿就消失了.
不愿意等太长时间,那么就干脆干掉她,如下,只要上面说的两个goto :goto_0夹着那段代码,另外记得这里面的代码,需要合并处理this指针问题哟.

private void payInYidong() {
        String str = "购买道具:[" + this.PAY_NAME[this.mPayIndex] + "] 成功!";
        BLHelper.purchaseComplete(this.PRO_ID_Str[this.mPayIndex], 1);
    }
几种支付方式如下:(短信,联通,移动,Egame支付)

其中电信用的是Egame支付

    private void payInDuanXin() {
        if (RECHARGE_CHANNELS.indexOf(String.valueOf(this.iFromPay)) != -1) {
            if (this.iFromPay == 2) {
                payInUnicom();
            } else if (this.iFromPay == 0) {
                payInYidong();
            } else if (this.iFromPay == 1) {
                payInEgame();
            }
        }
    }

    private void payInUnicom() {
        Utils.getInstances().pay(this, this.PAY_CODE_UNICOM[this.mPayIndex], new UnipayPayResultListener() {
            public void PayResult(String arg0, int arg1, int arg2, String arg3) {
                switch (arg1) {
                    case 1:
                        DiabloLOL.this.setPayment();
                        BLHelper.purchaseComplete(DiabloLOL.this.PRO_ID_Str[DiabloLOL.this.mPayIndex], 1);
                        BLHelper.closeShieldLayer();
                        Log.e("qq", "Unicom支付成功");
                        return;
                    case 2:
                        BLHelper.closeShieldLayer();
                        Log.e("qq", "Unicom支付Fail");
                        return;
                    case 3:
                        BLHelper.closeShieldLayer();
                        Log.e("qq", "Unicom支付cancel");
                        return;
                    default:
                        Log.e("qq", "Unicom支付Default");
                        return;
                }
            }
        });
    }

    private void payInYidong() {
        if (LOLConstant.sCMCC_OPEN == 0) {
            BLHelper.showShieldLayer("正在处理,请稍后.....");
        }
        GameInterface.doBilling(this, true, true, this.PAY_CODE_MM[this.mPayIndex], null, this.payCallback);
    }

    public void payInEgame() {
        HashMap<String, String> payParams = new HashMap();
        payParams.put(EgamePay.PAY_PARAMS_KEY_TOOLS_ALIAS, this.PAY_CODE_SMS[this.mPayIndex]);
        if (this.iOpen == -1) {
            this.iOpen = BLHelper.getOpenCTCC("ctcc", this, true);
        }
        Log.e("qq", "iOpen=" + this.iOpen);
        if (this.iOpen == 1) {
            this.gameManager.gameConfig.PaySdkUIForCP = 1;
        } else {
            this.gameManager.gameConfig.PaySdkUIForCP = 0;
        }
        this.gameManager.EGamePay(payParams, new EgamePayListener() {
            public void paySuccess(Map<String, String> map) {
                DiabloLOL.this.setPayment();
                BLHelper.purchaseComplete(DiabloLOL.this.PRO_ID_Str[DiabloLOL.this.mPayIndex], 1);
                BLHelper.closeShieldLayer();
                Log.e("qq", "Egame支付成功");
                DiabloLOL.this.mPayIndex = -1;
            }

            public void payFailed(Map<String, String> map, int arg1) {
                BLHelper.closeShieldLayer();
                Log.e("qq", "Egame支付Fail==" + arg1);
                DiabloLOL.this.mPayIndex = -1;
            }

            public void payCancel(Map<String, String> map) {
                BLHelper.closeShieldLayer();
                Log.e("qq", "Egame支付Cancel");
                DiabloLOL.this.mPayIndex = -1;
            }
        });
    }

免费评分

参与人数 115吾爱币 +107 热心值 +110 收起 理由
丶咖啡猫丶 + 1 + 1 谢谢@Thanks!
gfjykldd + 1 + 1 用心讨论,共获提升!
幽客楚楠 + 1 + 1 谢谢@Thanks!
marksha + 1 + 1 我很赞同!
sxiaoxixi + 1 谢谢楼主,期待很久了
君名。 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
so66 + 1 我很赞同!
ilovjhy + 1 我很赞同!
style城 + 1 我很赞同!
SYD缇缇丝 + 1 谢谢@Thanks!
CZWHAO + 1 + 1 热心回复!
corspo + 1 + 1 已答复!
小灰灰~ + 1 + 1 热心回复!
nande77 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Helloyou + 1 + 1 谢谢@Thanks!
堂前燕 + 1 + 1 热心回复!
君仔码头 + 1 用心讨论,共获提升!
Hackerpro + 1 + 1 用心讨论,共获提升!
半夜挑灯复习 + 1 我很赞同!
LIC + 1 + 1 谢谢@Thanks!
shock-c + 1 + 1 谢谢@Thanks!
18773878204 + 1 + 1 谢谢@Thanks!
sunnylds7 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhiyi1120 + 1 + 1 谢谢@Thanks!
你是个儿吗 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
free_dragon + 1 + 1 谢谢@Thanks!
qaz003 + 1 + 1 谢谢@Thanks!
流觞丶千爱 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
superzhangxue + 1 + 1 热心回复!
s277321929 + 1 + 1 &amp;lt;font style=&amp;quot;vertical-align: inherit;&amp;quot;&amp;gt;&amp;lt;font style=
lockltd + 1 + 1 谢谢@Thanks!
bouc + 1 + 1 谢谢@Thanks!
Smi + 1 用心讨论,共获提升!
会飞的丑小鸭 + 1 + 1 用心讨论,共获提升!
再睡一夏丶 + 1 + 1 有时间了来学!
Verseau + 1 + 1 谢谢@Thanks!
给我熊猫的女孩 + 1 + 1 谢谢@Thanks!
傲气小猪 + 1 + 1 热心回复!
完美蚂蚁 + 1 + 1 谢谢@Thanks!
dghhtf + 1 + 1 谢谢@Thanks!
sunsun102 + 1 + 1 用心讨论,共获提升!
逐梦 + 1 + 1 热心回复!
-1s + 1 + 1 热心回复!
好严苛 + 1 + 1 热心回复!
a42010316 + 1 + 1 谢谢@Thanks!
非凡i + 1 我很赞同!
52破解☆ + 1 + 1 我很赞同!
诚恳的怪隐刺客 + 1 + 1 支持支持
dncxp + 1 + 1 热心回复!
王毛 + 1 + 1 用心讨论,共获提升!
蓝色858 + 1 + 1 谢谢@Thanks!
Dicker + 1 + 1 谢谢@Thanks!
bdk236 + 1 + 1 我很赞同!
不爱哭 + 1 + 1 谢谢@Thanks!
Akesudia + 1 + 1 用心讨论,共获提升!
曹霏 + 1 + 1 用心讨论,共获提升!
陈北玄 + 1 + 1 我很赞同!
phptools + 1 + 1 鼓励转贴优秀软件安全工具和文档!
740099713 + 1 + 1 已答复!
忆丶往昔 + 1 + 1 谢谢@Thanks!
孤星s + 1 进游戏提示XX破解什么弄?
soyiC + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
imqhl + 1 + 1 谢谢@Thanks!
jackliqiao + 1 + 1 鼓励转贴优秀软件安全工具和文档!
mlwy + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
车大炮 + 1 + 1 谢谢@Thanks!
海盗小K + 1 + 1 我很赞同!
wizarder + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zamliage + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kicebeauty + 1 + 1 用心讨论,共获提升!
南哥哥i~ + 1 + 1 谢谢@Thanks!
每天会一点点 + 1 + 1 热心回复!
wcj1997 + 1 + 1 已答复!
海底总动员 + 1 + 1 我很赞同!
尘灬封 + 1 + 1 用心讨论,共获提升!
iamcjsyr + 1 + 1 谢谢@Thanks!
石琢 + 1 + 1 热心回复!
rhw200851 + 1 + 1 用心讨论,共获提升!
温华 + 1 + 1 热心回复!
xiaoleilll + 1 谢谢@Thanks!
maloneshaw + 1 + 1 头疼
cao15829773416 + 1 + 1 我很赞同!
helloword121 + 1 + 1 谢谢@Thanks!
凉风秋月 + 1 + 1 热心回复!
吾2破解 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
2864095098 + 1 + 1 热心回复!
a476376832 + 1 + 1 我很赞同!
q297252649 + 1 + 1 我也是买了东西就必须退出 华为的
妩美 + 1 + 1 热心回复!
zy1234 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
wxk0248 + 1 游戏启动界面有广告,购买东西以后弹窗会卡住,只能退出
沙漠一滩水 + 1 + 1 谢谢@Thanks!
旱章鱼 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qxyokok + 1 + 1 用心讨论,共获提升!
铅笔刀 + 2 + 1 谢谢@Thanks!
YYL7535 + 1 + 1 谢谢@Thanks!
执念晓芪 + 1 + 1 谢谢@Thanks!
JFJKE + 1 + 1 热心回复!
BYD-唐 + 1 + 1 谢谢@Thanks!
MagicnoBob + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

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

推荐
Mr.A 发表于 2017-6-29 13:21
本帖最后由 Mr.A 于 2017-6-29 13:23 编辑

这是我搜索到的校验的方法,这个怎么改?

.method public static w(Landroid/content/Context;)Ljava/lang/String;
.locals 4

.prologue
const/4 v1, 0x0

.line 844
invoke-virtual {p0}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager;

move-result-object v0

.line 845
const/16 v2, 0x40

.line 848
:try_start_0
invoke-static {p0}, Lu/aly/bt;->v(Landroid/content/Context;)Ljava/lang/String;

move-result-object v3

invoke-virtual {v0, v3, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
:try_end_0
.catch Landroid/content/pm/PackageManager$NameNotFoundException; {:try_start_0 .. :try_end_0} :catch_0

move-result-object v0

.line 852
:goto_0
iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;

.line 853
const/4 v2, 0x0

aget-object v0, v0, v2

invoke-virtual {v0}, Landroid/content/pm/Signature;->toByteArray()[B

move-result-object v0

.line 854
new-instance v2, Ljava/io/ByteArrayInputStream;

invoke-direct {v2, v0}, Ljava/io/ByteArrayInputStream;-><init>([B)V

.line 857
:try_start_1
const-string v0, "X509"

invoke-static {v0}, Ljava/security/cert/CertificateFactory;->getInstance(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;
:try_end_1
.catch Ljava/security/cert/CertificateException; {:try_start_1 .. :try_end_1} :catch_1

move-result-object v0

.line 863
:goto_1
:try_start_2
invoke-virtual {v0, v2}, Ljava/security/cert/CertificateFactory;->generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;

move-result-object v0

check-cast v0, Ljava/security/cert/X509Certificate;
:try_end_2
.catch Ljava/security/cert/CertificateException; {:try_start_2 .. :try_end_2} :catch_2

.line 869
:goto_2
:try_start_3
const-string v2, "MD5"

invoke-static {v2}, Ljava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;

move-result-object v2

.line 870
invoke-virtual {v0}, Ljava/security/cert/X509Certificate;->getEncoded()[B

move-result-object v0

invoke-virtual {v2, v0}, Ljava/security/MessageDigest;->digest([B)[B

move-result-object v0

.line 871
invoke-static {v0}, Lu/aly/bt;->a([B)Ljava/lang/String;
:try_end_3
.catch Ljava/security/NoSuchAlgorithmException; {:try_start_3 .. :try_end_3} :catch_3
.catch Ljava/security/cert/CertificateEncodingException; {:try_start_3 .. :try_end_3} :catch_4

move-result-object v1

.line 877
:goto_3
return-object v1

.line 849
:catch_0
move-exception v0

.line 850
invoke-virtual {v0}, Landroid/content/pm/PackageManager$NameNotFoundException;->printStackTrace()V

move-object v0, v1

goto :goto_0

.line 858
:catch_1
move-exception v0

.line 859
invoke-virtual {v0}, Ljava/security/cert/CertificateException;->printStackTrace()V

move-object v0, v1

goto :goto_1

.line 864
:catch_2
move-exception v0

.line 865
invoke-virtual {v0}, Ljava/security/cert/CertificateException;->printStackTrace()V

move-object v0, v1

goto :goto_2

.line 872
:catch_3
move-exception v0

.line 873
invoke-virtual {v0}, Ljava/security/NoSuchAlgorithmException;->printStackTrace()V

goto :goto_3

.line 874
:catch_4
move-exception v0

.line 875
invoke-virtual {v0}, Ljava/security/cert/CertificateEncodingException;->printStackTrace()V

goto :goto_3

.end method

免费评分

参与人数 7吾爱币 +7 热心值 +6 收起 理由
merlinjun + 1 + 1 我很赞同!
ttimasdf + 1 这个不是最终的check函数,只是获取当前app的签名并返回md5哈希。要找调用.
jiaokai123 + 1 + 1 我很赞同!
dghhtf + 1 + 1 谢谢@Thanks!
helloword121 + 1 + 1 谢谢@Thanks!
sweet告白气球 + 1 + 1 谢谢@Thanks!太长了,我没看,哈哈
wcof + 1 + 1 已答复!

查看全部评分

推荐
 楼主| dryzh 发表于 2017-6-29 13:35 |楼主
Mr.A 发表于 2017-6-29 13:21
这是我搜索到的校验的方法,这个怎么改?[md].method public static w(Landroid/content/Context;)Ljava/la ...

你这个是什么游戏?怎么代码不一样啊?找到了.也要分析逻辑的,看看是哪一个有用的..可以试试改改看有没有效果.这个游戏找signatures刚好在黑名单类里这个才有用.class public Lcn/mycompany/addblackname/utils/utils;
推荐
 楼主| dryzh 发表于 2018-1-7 23:12 |楼主
沙发
 楼主| dryzh 发表于 2017-6-28 22:46 |楼主
本帖最后由 dryzh 于 2018-7-11 09:44 编辑

百度说分享违规,请大家自己动手找彩蛋.


真机安装还是一直卡在"正在处理,请稍后......"的童鞋请下载下面我修复过的版本(可以手机点击下载在线安装)

腾讯加固?误报吧?!!!

[v1.16.1移动联通电信全网通+第三方腾讯支付接口版] 链接: https://pan.baidu.com/s/1i5OiXNZ 密码: vh7u

[v1.15.1移动联通电信全网通+第三方腾讯支付接口版]  链接: https://pan.baidu.com/s/1bLxtjo 密码: teyv

[v1.14.1移动短信支付接口修复版] 链接: https://pan.baidu.com/s/1slTpHUH 密码: rt4r

最新测试版(全网通+第三方腾讯支付非统一伪装接口版本,各支付接口都不一样,发现有问题修复后的版本都会在这个链接重新上传)


3#
Slice1129 发表于 2017-6-28 22:53
看的是无名团队吧
4#
来一发呗 发表于 2017-6-28 22:54 来自手机
这游戏好玩不
5#
by爱 发表于 2017-6-28 23:01
非常感谢!66666
6#
 楼主| dryzh 发表于 2017-6-28 23:03 |楼主

还行吧..你可以下载一个安装来玩玩.
7#
夏雨微凉 发表于 2017-6-29 00:26
感谢分享经验教程!
8#
ma181475839 发表于 2017-6-29 01:01
来个卡通战争的
9#
haoxiujie 发表于 2017-6-29 01:36
谢谢楼主 支持原创!
10#
dszsdyx 发表于 2017-6-29 02:53
这个很厉害,学习了,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-23 02:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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