一.程序介绍
游戏界面,很脑残的一个游戏,无脑点屏幕砍怪,还不能移动,而且还要很多钱去购买
支付接口:
二.定位关键代码思路
首先明确我们的目标,破解他的收费(内购)
为了达成这个目标我们得定位到他支付校验的代码,让他支付校验的代码总是返回真即可
那么我们如何定位关键代码呢?
思路如下:
1. 查看是否有log输出
2. 根据支付sdk顺藤摸瓜,向上搜索定位(或者插入打印函数调用栈的代码,向上层调用回溯)
3. 是否有关键的字符串信息可以被利用
4. 定位控件可以用dump view,然后查找资源id的方法
5. 使用adb shell dumpsys activity top得到当前活动Activity
方法一.查看是否有日志输出
点击支付后,有关键log输出
查看字符串引用的地方正好是内购的地方
同时还有启动支付Activity的信息
方法二. 通过支付SDK向上回溯
EgamepayActivity是刚刚的支付页面,但是对其交叉引用发现没有调用者
在onCreate插入log可以发现onCreate被调用了
JEB中分析发现都调用了EgamePayProtocol这个函数,而且对该类做引用参考并没有发现调用源
全工程字符串搜索也没有找到相关调用,不犹的怀疑是在so层做了这些调用
loadLibrary看来是在so中完成的相关调用
跟进这个EgamePayListener有点像是支付成功失败取消之后的,对其做引用参考 ,发现没有引用参考
全内存搜索
从EgamePay入手,发现这里里面调用了pay方法,插入log验证也的确是对其做交叉引用,成功定位到关键点
方法三.根据游戏UI的特定字符串信息定位到关键点
方法四.通过dumpsys类可以抓到当前最顶端的Activity,通过分析Activity代码同样可以定位到关键点
方法五.通过dump view定位
在此app中不适合,因为该UI是canvas上画出来的,抓不到id 所以没法定位相关控件ID
三.内购破解
我们再次看看购买的代码逻辑
不管成功失败 都会调用OnResult(),我们跟进OnResult函数发现:
我们只要让success=0即可
我发现直接干掉if语句并没有什么用,我选择在外层调用OnResult的时候修改成0,也就是把下面这2个值都修改成0
于是操刀把paycancel干掉,修改为0即可
发现游戏内购被破解掉了
火力全开
通关了
由于研究目的,破解版apk就不放出来了