0x5.smali逻辑分析实战

0x5.smali逻辑分析实战


本文介绍一个手游的内购破解来加强对smali逻辑分析的理解。提纲如下:

手游样本下载地址 https://pan.baidu.com/s/1nwx2awT   密码: 6vk4
-->文中的apk修改仅用于研究学习,如涉及权益侵犯请随时联系处理。 <--

在开始分析和破解前,我们需要先安装apk使用,以确认我们的需求。



进入游戏后,我们看到有1000的初始元宝,点击后弹出充值界面,我们这里定义我们的需求为元宝的内购破解。我们先来了解一下充值流程,进入充值界面:



点击购买充值后,弹出了我们熟悉的toast信息框,内容为“游戏试玩期间不允许购买元宝或者道具”。 这里就引入了我们分析的第一步,字符串搜索。

0x1.字符串搜索
使用Android Killer将apk反编译,进入工程搜索一栏,进行字符串的搜索。如果直接搜索汉字是无法搜索到结果的,需要转化为Unicode后搜索:
                                            

搜索到两个结果,Define.smali经查看是字符串定义用的,与逻辑无关。FkddzPay.smali即为我们要找的smali,然后我们打开分析具体逻辑,也就进入到了我们的第二步。

0x2.逻辑分析
打开这个smali文件定位到信息框提示的这段代码:



根据上图可以得知,关键在于是否为试玩的判断,即我们无论如何需要去执行 cond_0,而不是显示toast信息框。
这里不再做具体修改步骤书写,提供几个思路,大家自己尝试。
1.if-nez变更为if-eqz
2.判断执行之前,定义v3为非0数据
3.判断前直接执行goto命令跳转到 cond_0

在这个判断逻辑修改完毕后,我们可以正常进入充值界面了:



此时,不管我们是直接关掉该窗口,还是都点击确认之后后再点击取消,都会得到如下的toast信息框提示:



我们先进行字符串搜索找到该提示的位置:



很显然这只是一个toast方法,我们需要知道是谁调用了它,来寻找这个逻辑在哪里。之后我们搜索shopBillingCancel发现access$800调用了它,继续顺藤摸瓜,寻找调用access$800的方法。
之后我们分析搜索的结果后,在FkddzPay$9$1.smali中定位到这个函数,并确定这里是逻辑判断的关键点。



之后我们继续顺藤摸瓜,搜索payCancel,找到调用的地方, 并全部将其修改为paySuccess:



保存后编译运行,元宝的内购破解就完成了,这里不再贴结果图片,大家自己尝试。接下来我们介绍最后一个思路。

0x3.函数替换
在程序运行过程中,未修改前,我们取消交易,调用的是payCancel,如果我们将所有payCancel的函数内容变为与paySuccess一样,则也一定会成功。
这部分相对简单,不再做具体解释,请大家自己尝试替换和测试。