吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13195|回复: 45
收起左侧

[Android 分享] 安卓游戏《滚动的天空》多酷SDK支付方式破解(数据伪造)方法

  [复制链接]
vnetuser 发表于 2018-5-31 22:26
本帖最后由 vnetuser 于 2018-5-31 23:08 编辑

一、前言
本人正在学习安卓的反编译和破解,目前学到 教我兄弟学Android逆向03 破解第一个Android游戏 https://www.52pojie.cn/thread-654654-1-1.html,最后课后作业 https://www.52pojie.cn/thread-632178-1-2.html 但在后面原版APK的下载链接失效了(没有注意看后面的有补链的{:1_932:}) 只好去寻求X度来下个APK了,结果下载下来的APK和教程里的内购版购买逻辑不同,本着学习+研究的精神就用这个来练手了,走了无数次的弯路,填了自己的一个大坑,最后才初步支付成功(还不完善),于是分享出来大家共勉.

二、准备工作
原版APK:                   版本: 1.1.0.133                                          http://shouji.baidu.com/game/11379870.html
AndroidKiller:            版本: 1.3.1                                             https://down.52pojie.cn/Tools/Android_Tools/
JEB:                            版本: 2.3.13.201803121754                    https://www.52pojie.cn/thread-696860-1-1.html
蓝叠(模拟器):            版本: 3.1.11.455

三、动手
0B00:APK拖入模拟器安装->运行滚动的天空(会有广告,直接关闭)->进入道具商场(类似于购物车)->点击任意商品->其他支付->支付宝->返回 查看返回关键字
     关键词:购买未成功,请返回游戏重新购买
QQ截图001.png
0B01:APK拖入 AndroidKiller 建立工程,搜索上面的关键词中的一部分:"购买未成功"(文本转Unicode),结果如下图->双击进入smali代码编辑区:

发现在AndroidKiller无法查看java源码.
QQ截图002.png
那么开启jeb 打开APK->Bytecode->字符串->搜索上面的关键词中的一部分"购买未成功"(这里中文就可以)结果如下图:
QQ截图003.png
->双击搜索结果,进入smali代码展示区->鼠标右键->解析(快捷键Q),结果如下图
QQ截图004.png

QQ截图004-1.png

0B10:Jeb里可以看到解析后的源码了.已经很容易去阅读和分析逻辑了
        一系列的空和状态码判断,都会显示购买未成功的提示,大概结论如下:
                    A) arg9是状态返回码 3010或3014是成功的状态(这个后面会用到)
                    B) arg10里保存的订单信息,处理后经onResponse回调
下面就是回到AndroidKiller里,修改smali代码
                     A)先找到onResponse方面所在的条件分支:cond_4 (这里加个Log输出 ),
QQ截图014.png
向上查看代码,修改代码以便能执行到onResponse里(这里我所用的方式在所有的cond_XX后加一个Log输出,以便检测代码运行逻辑,新人,手法比较笨)
然后找到第一个判断点 让其跳转到cond_4 即可.....
也可以不用分析代码.自己手写个直接跳转的方法
[Bash shell] 纯文本查看 复制代码
const/4 v0,0x0
if-eqz v0, :cond_4

                    B)实现上面的跳转后就是进入onResponse的代码分析过程(我在这里遇到了第一大坑,后面会一一道来)
在jeb里搜索[方法名]关键词"onresponse"(引号内的是关键词),依然是笨重手法,列表中会过滤出带有关键词的类,点开来看很多是处理HTTP请求返回的类,也发现一些IDKSDKCallBack的匿名类,但无法区分哪一个是我们需要跟进的类,同时发现一个特点每个匿名类会有像LOG输出的东西.
QQ截图016.png
QQ截图017.png

跟进d类查看,
QQ截图018.png 正是LOG输出,而且没有加开关,以"BaseLog"为TAG正常输出
,那么我们就以"BaseLog"抓取日志
QQ截图015.png
很明显看到有
[Asm] 纯文本查看 复制代码
bdpay onResponse...{"bd_order_id":"agrl918qKkVcK1A","function_status_code":3011,"bd_order_price":"6.0","bd_order_price_original":"6.0","bd_order_status":"DK_ORDER_STATUS_FAIL","bd_order_pay_channel":"DK_ORDER_CHANNEL_ALIPAY","bd_order_product_id":"19578"}

日志的输出
继续采用0B01中的搜索[字符串]关键词"bdpay onResponse"这样很容易就找到我们的跟进对象
QQ截图019.png
结合上面抓取的日志来分析.最终会走向onSendOrderInfo
[Java] 纯文本查看 复制代码
BaiDuPay.this.mCallback.onSendOrderInfo(new IProduct() {
                            public String getProductId() {
                                return this.this$1.this$0.mProductInfo.getProductId();
                            }
                        }, 5);

======================坑开始========================
于是就像A)步里改条件直接进入onSendOrderInfo 这个时候保存运行调试,但结果还是没有支付成功
跳转 onSendOrderInfo 里是不是做了什么处理呢,我就一路跟进
QQ截图012.png
继续改.继续跟进
[Java] 纯文本查看 复制代码
NativeUtil.getInstance().callPayCallback(this.a, 1);

再跟
[Java] 纯文本查看 复制代码
UnityPlayer.UnitySendMessage("NativeUtils", "payCallback", v0_1);

再跟
[Java] 纯文本查看 复制代码
private static native void nativeUnitySendMessage(String arg0, String arg1, String arg2) {
    }

这到这里就一脸懵逼了...进so文件了(不知道怎么处理了)最终没有支付成功
======================坑结束========================
倒回去重新分析onResponse后的代码,从抓取到的日志中看到"function_status_code":3011 这里应该是操作返回码,代码有判断是否为3010的判断.结合前面的代码猜想 3010应该是支付成功的返回码,开始修改代码跳过3010判断
方法一 修改判断条件为 if-eq v1, v2, :cond_3 结果支付成功了,反思上面的坑是我太急功近利了.跳过了中间的过程.才导致的支付失败
下面看效果:
QQ截图020.png

方法二(数据伪造)在初始化JSONObject对象前修改返回的数据
[Asm] 纯文本查看 复制代码
.local v0, "result":Ljava/lang/String;
    
    const-string/jumbo v1, "3011"

    const-string/jumbo v2, "3010"
    
    invoke-virtual {p1, v1, v2}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;

    move-result-object v1
 
    new-instance v0, Lorg/json/JSONObject;

    invoke-direct {v0, v1}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V

四、反思
0B00:破解要一步步来不能急功近利,要按代码逻辑走.不能跳中间任何一个环节
0B01:破解还不完善,还有个支付方式选择界面没有自动结束,大神请指点一二
QQ截图013.png
0B10:如有何不足之处,还请各位指出,吾将加以学习
另附:该支付SDK的DEMO http://app.baidu.com/docs?id=15&frompos=401043#h3-tit16

免费评分

参与人数 26威望 +2 吾爱币 +39 热心值 +26 收起 理由
peteraini + 1 + 1 谢谢@Thanks!
ajia + 1 + 1 谢谢@Thanks!
诺灬深情 + 1 + 1 谢谢@Thanks!
deffy + 1 + 1 用心讨论,共获提升!
Superman丶大鹏 + 1 + 1 热心回复!
SomnusXZY + 1 + 1 热心回复!
zhiyi1120 + 1 + 1 谢谢@Thanks!
q110 + 1 + 1 用心讨论,共获提升!
dadao815 + 1 + 1 用心讨论,共获提升!
丶青春分離曲 + 2 + 1 学习了,学习了
小枫丶 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
shuaiqi + 1 + 1 谢谢@Thanks!
Hayden. + 1 + 1 我很赞同!
慕浟佳〃井少年 + 2 + 1 我很赞同!
MaxMadcc + 1 + 1 谢谢@Thanks!
qtfreet00 + 2 + 12 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
锋霜 + 1 + 1 热心回复!
dddsza + 1 + 1 鼓励转贴优秀软件安全工具和文档!
winding + 1 + 1 过程很清晰啊
fhy129 + 1 + 1 谢谢@Thanks!
stars-one + 1 + 1 我很赞同!
IceWind + 1 + 1 谢谢@Thanks!
asd8848 + 1 + 1 谢谢@Thanks!
山治c + 1 + 1 用心讨论,共获提升!
deliverance + 1 + 1 用心讨论,共获提升!
kingaero + 1 + 1 用心讨论,共获提升!

查看全部评分

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

Hayden. 发表于 2018-6-1 16:23
不要下载百度应用里的app,全TMD是百度加进去的广告和各种垃圾代码,第三方下载不靠谱。
最好到官方网站下载,破解的时候就不会那么多逻辑。
我之前也搞了个内购,直接点击金币就到账了,不会跳到支付选择界面和支付平台,有兴趣可以看我主题,交流一二,我也是初学小白。
我现在正研究滚动天空官方原版的内购,无限球等
 楼主| vnetuser 发表于 2018-6-5 19:31
雷帅 发表于 2018-6-5 08:36
游戏取消返回提示购买成功有个网络验证的,要怎么破??

是在最后返回提示"购买未成功"的提示吗?有没有截图看下
791898456 发表于 2018-5-31 22:52
demon_lin 发表于 2018-5-31 23:14
前排支持,学习了。
kingaero 发表于 2018-5-31 23:35
俺也在学习安卓的反编译
涐懂 发表于 2018-6-1 00:51
感谢分享
cch816 发表于 2018-6-1 01:05
学习了,感谢
andobear 发表于 2018-6-1 01:19
学习了,感谢!!
feishuyushei 发表于 2018-6-1 06:49
多谢楼主分享
asd8848 发表于 2018-6-1 08:31
很精彩的一贴内购解说 感谢分享!
thornfish 发表于 2018-6-1 09:17
看到这个我就点进来支持下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-3-29 22:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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