最近朋友通过微信给我分享了一个养鲲的小程序游戏,开始觉得没什么,后来渐渐的停不下手来了。游戏就是养鱼赚钱,然后用赚的钱再买鱼,最后“吞噬”合成鲲中的王者--“彩鲲”。

但是单靠养鱼赚钱太难了,高级的鱼和鲲贵的吓死人。联想到红极一时的跳一跳小游戏以及各种花式辅助,想着自己也分析一下。
一、分析日志Log信息
Android系统及其程序日志一般都是通过LogCat输出的,通过logcat的输出内容,我们能看出很多端倪。市场上虽然有一小撮app直接使用Android自带的工具类,但是大部分的app都封装了自己的Log工具类。
首先,我们从log方面入手。解压apk,查看一下目录文件,在lib中发现了可疑的log相关的文件,libwechatxlog.so。

简单的浏览一下内容,看起来跟log很有强的相关性,导出函数也多以xlog为开头。

接下来去dex中搜索xlog,在XLogSetup类发现了关键词Boolean isLogcatOpen,判断应该是打开Logcat的开关。

到这里,我们可以观察一下keep_setupXLog的参数。方法中一共有7个参数,我们最为关心的是给isLogcatOpen赋值的那个boolean参数,也就是第6个参数。并且是由Xlog.setConsoleLogOpen(isLogcatOpen.booleanValue())控制开关。接着注意到在代码中“public static Xlog xlog = new Xlog()” 创建了一个xLog的对象,根据其功能,看起来xLog像是一个工具类。

搜索一下xLog,到Xlog类看一看。

这里xLog实现了一个接口a。XLoggerInfo看上去就是日志的组成结构,logWriter写出的信息也正好是XLoggerInfo的相关日志组成信息。

interface a的结构和android系统的日志结构类似,并且也设定了不同的日志级别。

在接口实现的x类中,我们看到了具体到各个级别的log输出。其调用参数“str, "", "", Process.myTid(), Process.myPid(), Thread.currentThread().getId().......”也和XLogInfo的结构一致。

所以hook住这个参数并打印,就能得到对应的日志信息了。
二、Log日志
有了日志,我们就可以进一步的分析了。查看日志,发现了WxaPkgRuntimeReader Tag打印的信息,看名字猜测是小程序的运行时的相关日志。

根据标签MicroMsg.WxaPkgRuntimeReader,找到对应的类。通过分析(查阅资料)得知,public static String a(g gVar, String str)方法所返回的就是js源码。

继续hook该方法,然后把js文件存到本地即可。
三、修改源码
dump下来源码后,就可以查看相关的逻辑。我们的目标是不花钱就可以购买巨贵无比的鲲,搜索代码,最终发现消费钱币的地方:this.currentCoin = this.currentCoin - t;。那么我们将减号替换成加号,就可以越买越多了。

四、实际效果
简单写一个xposed插件,hook上面分析的过函数。

通过日志把相关信息打印出来,可以看到是hook成功的了。

到游戏中实际体验一下,不减钱随便买,轻松合成了最高级别的鲲。钱由于是累加的,已经多到不会念了,6935D到底是多少。。。

后记
随便修改游戏的代码逻辑是不可取的,会失去游戏的乐趣,并且这种作弊的行为可能会导致封号。

网友评论