—-Creaked by B.S. 6/26/2017 9:22:40 PM
无聊练手,当作学习Android优秀源码的笔记
仅供学习研究,请勿用作商业用途,如若喜欢请支持正版!
最新版原程序:
(v1.18.1)
http://www.anzhi.com/pkg/ced9_com.DBGame.DiabloLOL.anzhi.html
(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.18.1) 链接: https://pan.baidu.com/s/1kRKTw96hJh1k7RHTrJowwQ 密码: rscw
(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://mm.10086.cn/android
腾讯应用宝: http://android.myapp.com/
360手机助手: http://zhushou.360.cn/
百度旗下安卓市场: http://apk.hiapk.com/
应用汇安卓市场: http://www.appchina.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”
1 | .method public static getAPPSecretString(Landroid/content/Context;)Ljava/lang/String; |
去验证的修改方法很多种,还可以在下面的类里定位到check方法函数.
根据经验可以去看看onCreate有没可用的信息,一般初始化在这里有处理.
.class public Lcom/DBGame/DiabloLOL/DiabloLOL;
.super Lorg/cocos2dx/lib/Cocos2dxActivity;
.source “DiabloLOL.java”
1 | .method protected onCreate(Landroid/os/Bundle;)V |
顺便广告的也可以看看能不能处理了
1 | #前面还有若干代码 |
看到Lcn/mycompany/addblackname/AddBlackName;->Check()V是在添加黑名单的类里,
查看方法,处理check()V
1 | .method public static Check()V |
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
1 | .method public static showInterAD(Ljava/lang/String;)V |
去除选英雄和副本的横幅广告:
1 |
|
修改下面类里的方法
.class public Lcom/DBGame/Common/BLHelper;
.super Ljava/lang/Object;
.source “BLHelper.java”
1 | .method public static showBanner(Ljava/lang/String;)V |
可以再去下面类里看看,消息处理的地方
.method public handleMessage(Landroid/os/Message;)V
.class Lcom/DBGame/DiabloLOL/DiabloLOL$3;
.super Landroid/os/Handler;
.source “DiabloLOL.java”
1 | case 200: |
对应的smali
1 | .line 650 |
消息处理的代码如下:
1 | public void handleMessage(Message msg) { |
顺便也解决下其他的函数,
.method private showBanner()V和.method private showInterAd(I)V
处理掉直接返回
.class public Lcom/DBGame/DiabloLOL/DiabloLOL;
.super Lorg/cocos2dx/lib/Cocos2dxActivity;
.source “DiabloLOL.java”
1 | .method private showBanner()V |
去除今日推荐5秒闪屏广告:
.class public Lcn/cmgame/billing/api/game/main/Tool;
.super Ljava/lang/Object;
1 | .method public static adSplashShow(Landroid/app/Activity;Ljava/lang/Class;Ljava/lang/Class;Landroid/os/Handler;)Z |
3. 内购破解:
去除可能会产生费用的危险权限:
AndroidManifest.xml里搜索
android.permission.SEND_SMS
android.permission.CALL_PHONE
删掉
1 | <uses-permission android:name="android.permission.SEND_SMS"/> |
补充一个强大的函数
不需要支付购买?!!!竟然有这函数(分析v1.15.1腾讯渠道第三方支付版发现的)
invoke-direct {p0}, Lcom/DBGame/DiabloLOL/DiabloLOL;->buyWithoutPay()V
在第三方支付里可以直接调用上面的函数,直接购买成功
.method public payThird(Ljava/lang/String;)V
1 | public void paySuccess(Map<String, String> paramAnonymousMap) |
将原来的buyWithoutPay模拟上面的paySuccess成功代码处理一下,要不然只能第一次购买成功.
1 | private void buyWithoutPay() |
经过修正过的不支付购买函数
1 | private void buyWithoutPay() { |
修正后的buyWithoutPay对应的smali
1 | .method private buyWithoutPay()V |
电信支付接口:
logcat字符串定位,
Egame支付成功
Egame支付Cancel
order id:
搜索上面字符串,向上分析,回溯分析.
.class public Lcn/egame/terminal/paysdk/EgamePay;
.super Ljava/lang/Object;
.source “EgamePay.java”
1 | .method public static pay(Landroid/app/Activity;Ljava/util/Map;Lcn/egame/terminal/paysdk/EgamePayListener;)V |
还可以用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”
1 | .method public PayResult(Ljava/lang/String;IILjava/lang/String;)V |
移动支付接口:
logcat定位字符串,
购买道具:[
] 成功!
] 失败!
在下面类修改
.class Lcom/DBGame/DiabloLOL/DiabloLOL$5;
.super Ljava/lang/Object;
.source “DiabloLOL.java”
1 | .method public onResult(ILjava/lang/String;Ljava/lang/Object;)V |
4. 统一支付接口:
统一为电信的吧.可以直接成功,没那么多弹窗支付
定位字符串
电信初始化成功
1 | .method protected onCreate(Landroid/os/Bundle;)V |
进入getSimType方法函数处理结果然后赋值给iFromPay
1 | private int getSimType() { |
直接return 1;伪装为电信,支付接口统一完毕.请参看本文开头的SIM类型表格
我第一次比较麻烦的改法如下,
1 | .method private getSimType()I |
也可以直接return 0,伪装为移动,统一为移动支付.
1 | .method private getSimType()I |
然后处理移动短信支付的函数方法payInYidong(),移动短信支付的另外一种破解方法,
.class Lcom/DBGame/DiabloLOL/DiabloLOL$5;
.super Ljava/lang/Object;
.source “DiabloLOL.java”
把移动购买成功的代码,就是:pswitch_0里两个goto :goto_0之间的有效代码,直接搬到payInYidong()里,放到:cond_0和return-void之间.
1 | .line 755 |
最后应该变为java源码如下面的样子:
1 | private void payInYidong() { |
有童靴反应真机内购,会卡在”正在处理,请稍后…..”,其实这个要等一会的,等一会儿就消失了.
不愿意等太长时间,那么就干脆干掉她,如下,只要上面说的两个goto :goto_0夹着那段代码,另外记得这里面的代码,需要合并处理this指针问题哟.
1 | private void payInYidong() { |
补充一个统一伪装为联通,游戏联盟支付后,直接领取游戏联盟包月,铂金会员礼包
找字符串
purchaseMonthlyContract>>>command is {“command”:”month_order_25”
purchaseMonthlyContract>>>respond is {“md5”:””,”msg”:”用户取消”,”result”:3,”firstOrder”:””}
purchaseMonthlyContract>>>respond is
purchaseMonthlyContract>>>command is
修改purchaseMonthlyContract函数如下
1 | .method public purchaseMonthlyContract(I)V |
几种支付方式如下:(短信,联通,移动,Egame支付)
其中电信用的是Egame支付
1 | private void payInDuanXin() { |
另一种新的统一支付的方法:
短信支付统一调用 buyWithoutPay
例如,修改移动支付
1 | .line 719 |
修改短信支付函数 payInDuanXin
1 | private void payInDuanXin() { |
修改后的 payInDuanXin 函数变为
1 | private void payInDuanXin() { |
统一为短信支付或者调用强大buyWithoutPay的函数
1 | invoke-direct {p0}, Lcom/DBGame/DiabloLOL/DiabloLOL;->payInDuanXin()V |
anzhi平台的 payInAnzhi 函数替换为 payInDuanXin 或者 buyWithoutPay
修改 handleMessage 函数
1 | .class Lcom/DBGame/DiabloLOL/DiabloLOL$4; |
handleMessage 原函数为
1 | public void handleMessage(Message msg) { |