安卓逆向--简单游戏破解

(文章仅用于记录学习过程,相关破解技术仅限于研究使用,不准用于非法目的,否则后果自负)

说明

学习逆向基础之后就开始真实实战,这边我是跟着这篇文章看到逆向资源,虽然文章是17年的文章,但是毕竟是在学习吗,不要管时间勒.这里采用和文章不同的方法

使用工具

1:apltool
2: jadx
3:sublime Text2

看源码

这个apk是一个简单的切水果应用,并没有加壳,我们直接将apk拖进jadx里面去


image.png

我们打开将失败字符串转为unicode,也就是\u5931\u8d25,(ps:失败怎么来的,可以玩下游戏点下支付然后取消)我们搜索看看

image.png

我们看到这个命名,com.mydefinemmpay.tool.Mymmpay,这个明显就是一个管理支付的类,

看下后面的方法payResultFalse,这是支付失败的意思吗?我们点进去看看,这边有3个方法,分别是支付成功,支付失败,支付取消,看来我们找对了类,这个类就是管理支付的
方法名

我们接着看下哪里调用了payResultSuccees(),我们看到在当前类的doBilling方法调用了payResultSuccees,也就是同一个类下面
这边调用了
//doBilling方法
public void doBilling() {
        float totalMoney = Float.valueOf(RecordOpreate.getInstance().getData(RecordOpreate.totalMoey)).floatValue();
        Printlog("-------totalMoney--------" + totalMoney);
        Printlog("-------MessageUtil.getInstance().limitMoney--------" + MessageUtil.getInstance().limitMoney);
        WinPayResult.getInstance();
        this.payCodeMoney = WinPayResult.Tmone[payId - WinPayResult.addPayCode];
        showDebug("\u5f00\u59cb\u652f\u4ed8\uff1a;\n\u5df2\u7ecf\u6d88\u8d39\uff1a" + totalMoney + ";\n" + "\u652f\u4ed8\u4e0a\u9650\uff1a" + MessageUtil.getInstance().limitMoney + ";\n" + "\u5546\u54c1\u91d1\u989d\uff1a" + WinPayResult.Tmone[payId - WinPayResult.addPayCode] + ";\n" + "\u652f\u4ed8\u4ee3\u7801\uff1a" + this.mPaycode + ";\n");
        if (totalMoney >= MessageUtil.getInstance().limitMoney) {
            ((Activity) this.context).runOnUiThread(new Runnable() {
                public void run() {
                    MymmPay.this.payResultSuccess();
                }
            });
        } else if (this.onlineNumName.equals("EMPTY")) {
            payResultSuccess();
        } else {
            System.out.println("tianlibao" + tanLibao());
            if (!tanLibao()) {
                payResultFalse();
            } else if (MessageUtil.getInstance().free.equals("1")) {
                payResultSuccess();
            } else {
                Printlog("paysuss-----" + this.paysuss);
                Printlog("theymoney-----" + WinPayResult.Tmone[payId - WinPayResult.addPayCode]);
                String sdkKind = MessageUtil.getInstance().sdkKind;
                if (sdkKind.equals("0")) {
                    if (mgif == null) {
                        showDebug("\u9519\u8bef\uff1a\u54aa\u5495sdk\u4e3a\u7a7a");
                    } else if (getLibKind() == 0) {
                        mgif.pay();
                    } else if (getLibKind() == 1) {
                        if (this.cardKind != 0) {
                            osif.pay();
                        } else if (this.migfalseTime >= 1) {
                            osif.pay();
                        } else {
                            mgif.pay();
                        }
                    } else if (getLibKind() == 2) {
                        osif.pay();
                    }
                }
                if (sdkKind.equals("1")) {
                    if (osif == null) {
                        showDebug("\u9519\u8bef\uff1aothersdk\u4e3a\u7a7a");
                    } else if (getLibKind() == 0) {
                        osif.pay();
                    } else if (this.cardKind == 0) {
                        mgif.pay();
                    } else {
                        osif.pay();
                    }
                }
                if (sdkKind.equals("2")) {
                    if (osif2 == null) {
                        showDebug("\u9519\u8bef\uff1aother2\u4e3a\u7a7a");
                    } else {
                        osif2.pay();
                    }
                }
                if (sdkKind.equals("3")) {
                    if (osif3 == null) {
                        showDebug("\u9519\u8bef\uff1aother3sdk\u4e3a\u7a7a");
                    } else {
                        osif3.pay();
                    }
                }
                if (!sdkKind.equals("4")) {
                    return;
                }
                if (osif4 == null) {
                    showDebug("\u9519\u8bef\uff1aother4sdk\u4e3a\u7a7a");
                } else {
                    osif4.pay();
                }
            }
        }
    }

我们看下谁调用了doBilling方法,我们看到是当前类的pay方法调用了doBilling
image.png
//pay方法
public void pay() {
        if (XmlTran.getInstance().getAddDialog(payId + 1).equals("0")) {
            System.out.println("----------------------strdialog0-----------------:" + XmlTran.getInstance().getAddDialog(payId + 1));
            doBilling();
            return;
        }
        System.out.println("----------------------strdialog1-----------------:" + XmlTran.getInstance().getAddDialog(payId + 1));
        if (MessageUtil.getInstance().Um_Number.equals("1")) {
            Printlog("--------------00000000000----------------");
            new Builder(this.context).setMessage(XmlTran.getInstance().getAddDialog(payId + 1)).setPositiveButton("\u8d2d\u4e70", new OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    MymmPay.this.doBilling();
                }
            }).setOnKeyListener(new OnKeyListener() {
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    if (keyCode == 4 && event.getRepeatCount() == 0) {
                        MymmPay.this.payResultFalse();
                    }
                    return false;
                }
            }).setNegativeButton("\u53d6\u6d88", new OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    MymmPay.this.payResultFalse();
                }
            }).show();
            return;
        }
        doBilling();
    }


整理思路

我们发现MymmPay这个是负责管理支付的,这个里面有pay(),doBilling(),payResultSucceed(),payResultFalse(),payResultCancel()等主要方法,整理下逻辑,点击支付,然后调用pay(),pay调用dobilling方法,然后返回结果
image.png

整理方法

有好几种方法

1:原文说的,将payResultFalse()内容替换成payResultSucceed的内容,这样支付失败和支付成功是一样都是成功,

2:pay->doBilling->我们看了下源码,doBillding()里面调用了payResultSucceed(),payResultCancel().payResultFalse(),这个类应该是一个判断类,我们直接把doBilling()内部直接调用payResultSuccess()方法,这样连判断都不用判断了

反编译

使用apktool命令将apk反编译,fruit文件夹,我这边的apk命名是fruit.apk,所以就生成了fruit文件夹,如果你不是叫fruit那就是其他文件名

apktool d fruit.apk
反编译结果

我们找MymmPay这个类的,这个类在com.mydefinemmpay.tool文件下面,打开fruit->smali->com->mydefinemmpay->tool下面

image.png

我们使用sublime Text打开MymmPay.smali(sublime text增加了smali语法高亮和提示的支持,需要的童鞋可以自己百度一下,这边就不说)

我们搜索下doBilling

//方法开头 修改前
.method public doBilling()V
    .locals 7
   .prologue
  //中间省略

//方法结尾
.end method

将方法中间删掉,然后将locals 修改为0,然后在增加payResultSuccess()方法的调用

///修改后
.method public doBilling()V
    .locals 0
    .prologue
    //其他的不要 只增加一条方法
    //只调用payResultSuccess()方法就可以
    invoke-virtual {v0}, Lcom/mydefinemmpay/tool/MymmPay;->payResultSuccess()V

return-void
.end method

完成

之后就保存,然后使用apktool重新打包生成apk文件,然后使用jarsigner重新签名安装就可以了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335