内购的游戏是小米版的滑雪大冒险,比价有意思的小游戏;通过对滑雪大冒险小游戏综合运用apk逆向、java代码分析、smali分析、动态调试等基础方法。
内购破解之前的游戏,地图和道具都需要付费:
首先还是需要使用Androidkiller对apk进行反编译,同时使用JEB获取java源码,但是在本次案例中JEB并不能反编译该apk,原因是内存太小。
因此查看该app对应的源码使用Androidkiller继承的GD-GUI软件,andkiller反编译后如图:
但是该如何下手?如何找到支付相关的模块,有几种思路:观察自带的日志信息、命令行打印出操作界面对应的页面信息,如图:
这里首先去看看日志,在点击支付的时候同时观察日志信息,还是会发现一些有价值的信息:
发现其中疑似支付相关的是:Yodo1PayHelper, startPay call ...,那我们可以查找关键词Yodo1PayHelper、startPay,在查找之后还真有相关的类和方法:
一个带有支付字样的关键词方法pay,那这就是和支付相关的,然后再看这个方法对应的java源码,以便查找相关的逻辑:
这段代码很长,逻辑又相对混乱直接看java源码分析逻辑是比较困难的,那就只有先看看代码中的一些提示信息,比如:这是已购买的商品,购买成功。
这里有很明显的逻辑逻辑判断,但是我们依旧无法知道这部分是佛在支付成功的前提下执行,或者不管支付成功或失败都会效验一下。
这种情况下要么修改smali代码然后打包运行一下,要么就动态调试一下设置一个断点,看该处逻辑是否被执行。
在Androidstudio中导入反编译后的项目目录,然后设置好断点;接着在smali源码的AndroidManifest.xml文件中,application标签下设置android:debuggable="true",然后打包安装。
安装后在adb命令下设置转发:
pid是对应的apk进程号,通过下面命令获得:
接下来就是在Androidstudio中设置远程调试端口:
然后点击运行apk,在点击debug,可以看见当我们取消支付后会停在我们设置的断点处:
以及一些堆栈信息都可以找到,可以分析出是经过了之前的逻辑代码,并且在支付不成功的情况下是跳过了的,我们只需要找到对应smali逻辑修改一下即可,最后效果如图:
在支付界面点击返回即可,购买成功!
安卓逆向更像是一场瞎猫碰上死耗子的奇遇。
领取专属 10元无门槛券
私享最新 技术干货