一款捕鱼手游分析 —— 实现无限购买金币

时间:2019-06-14  来源:未知   作者:admin

这个小游戏我采用的是日志分析法和字符串分析法,打开 AndroidKiller,将 APK 文件拖入进来,等待它分析完,分析完成后,我们可以得知入口在 .LogoAcivity,如下:

点开 Android 选项卡,找到模拟器设备,打开日志窗口,首先查找捕鱼进程,目的是过滤其他进程的日志信息,如下:

锁定目标进程后,点确定,然后开始对其进程进行监控,回到游戏,点击购买 10 元金币礼包,尝试购买,在日志这一端产生了大量日志信息,如下:

从以上图可以得出,有付费代码,有失败代码,貌似跟 DX 这两个字符有关,除了能得知这些信息,好像并不能获取其它有价值的信息,回到游戏界面,当你购买时,会有一个 Toast 提示,为购买失败,我们可以尝试搜索这个字符串,但在这有一个提示,这个字符串是中文,所以应该搜索它的 UNICODE 码,如下:

搜索结果如下:

从以上这个图,可以得出处理购买位于 IAPHandler 这个 smali 文件中,并且该方法名为 buyFail,在获取这两条信息后,接下来需要看下它的源码文件,个人比较喜欢用 jadx 来查看,打开 jadx,加载捕鱼 APK 文件,定位到 IAPHandler,浏览整个文件,会发现如下有用信息:

这里用了 Handler 消息机制,并且还看到了 BUY_OK 字眼,既然用到了 Handler 消息机制,那必然存在发消息,所以这里有个关键点,抓住发消息的函数,jadx 这个软件提供了一个非常使得之处,那就是可以进行文本搜索,打开菜单上的文本搜索,输入 sendMessage,接索结果如下:

搜出来的 sendMessage 函数非常多,我们需要过滤下,在上图已用红色圈出,其中传入一个参数为 IAPHandler.BUY_OK,所以说这个函数正是我们要找的,双击进去,如下:

在这里,new 了一个 EgamePayListener 监听器,该监听器里有三个方法,分别为 paySuccess、payFailed、payCancel,而且在 DXSend 方法里,还记得刚开始用日志分析吗?有个 DX 字眼,而这个方法名里也有 DX,说明离成功也不远了。通过仔细发现,这三个方法里主要是 OderFinish,如下:

这三处只有第二个参数不一样,这个方法应该是处理是否给予你金币,1 代表给予,0 代表不给予,有了这条信息后,返回到 smali 文件中去修改,由于 DXSend 这个方法在 IAPListener smali 文件中,而上述的三种方法是匿名内部类里方法,所以我们直接去 IAPListener$数字 中的 smali 文件找,而此时恰好只有一个,所以就能很快定位到上述三种方法所在 smali 文件中代码的位置,如下:

现在只需要定位到那个第二个参数的位置,即把 0 改成 1 即可,通过 jadx 可知,代码在 210 行处,这也就是使用 jadx 的一个好处(可以迅速定位),如下:

修改为 1 后,利用 AndroidKiller 编译功能,将 smali 文件重新打包并签名成 APK 文件,将 APK 文件装入到模拟器中(把之前卸载),打开尝试购买,如下:

购买成功了,当然它提示购买失败字样,原因是上面只是改动了第二个参数,而发送消息的 ID 并没有改,所以它还会显示购买失败,然而事实已购买成功了。

软件安装后:

打开后,界面如下:

在点开商城后,尝试购买金币,会提示购买失败,如下:

下面,将会对这款手游进行逆向分析,在分析之前,我们来说下,在 Android 逆向分析中,常见有如下的几种方法:

在上一小节中,我们是直接跳到标号 :cond_2 处执行,在那些跳过的代码中,为发送消息的代码,如下:

通过上图可以得知,发送消息的 ID 为 10004,这几处本来是弹出支付信息消息框的,下面将会把这个功能改成 Toast 提示,只需要将消息 ID 0x2714 改成 0x2715 即可,如下:

改完之后,同时也需将前面的 goto :cond_2 这句删除,移动到每个 sendMessage 的后面,最后还需做的工作就是修改字符串,在 AndroidKiller 中,搜索字符串购买失败,将该字符串修改为 \u51e1\u51e1\u535a\u5ba2\u4e3a\u60a8\u63d0\u4f9b\u514d\u8d39\u91d1\u5e01\uff0c\u795d\u60a8\u73a9\u7684\u6109\u5feb\uff01,如下:

注意:中文字符需要它的 UNICODE 码。最终打包并签名为 APK 文件安装到模拟器中运行,如下:

当在游戏点击购买时,会有一个温馨提示,是不是觉得很酷 _

链接:https://pan.baidu.com/s/1_6bzypp6Ij88L_CjcAhG8g
提取码:3jpi

我们知道,游戏启动时会在 onCreate 方法处开始执行,所以我们只需在 onCreate 方法末尾处插入一个 Toast 就可以了,如下:

修改完成后,打包签名运行于模拟器中,如下:

好了,整个捕鱼手游到此就分析修改完成了,下面会给出样本。

(本文完)

0x01 初探捕鱼

  • 字符串分析法;
  • 自下而上分析 —— 栈回溯分析法;
  • 自上而下分析 —— 入口类分析法;
  • 日志分析法;

0x02 去除游戏对话框

0x03 增加购买金币提示信息

0x04 增加游戏启动的提示信息

标题:一款捕鱼手游分析 —— 实现无限购买金币
作者:猫猫、有点乖

还记得刚开始弹出的那个要你支付的对话框吗?虽然已实现可以购买,但是每次购买前都会弹出支付信息,所以本小节将会去除这个支付信息支付框。由上面一小节可知,购买金币功能由方法 OrderFish 里,我们重新清空日志,点击购买,在弹出支付信息后,日志捕获后如下:

在上图圈出中,有 order = 5125375,那么这里调用的是 order 方法,这里有一个思路,那就是 OrderFish 方法执行在前,所以在如下地方进行跳转:

标号 :cond_2 处的代码如下:

其中需要将 const/4 v0, 0x00 改成 const/4 v0, 0x01,然后就直接跳转到 OrderFinish 处执行。这样目的就达成了。

0x00 前述

捕鱼手游虽然现在没以前那么火,但是也可作为人们的一种娱乐休闲方式,倘若捕鱼游戏内涉及资金双向流动,那么该游戏就具有了赌博的性质,然而现在事实也确实如此,在这方面也不过多讲,大家都懂!好了,废话不多说,不久前,博主获得了一个捕鱼类型的手游 —— 全民捕鱼,虽说这游戏运营者现在不再运营,但是还能玩,但是不能购买里面的金币,所以本文将会教大家怎么实现无限购买金币功能,样本会在文末给出。