最近朋友通过微信给我分享了一个养鲲的小程序游戏,开始觉得没什么,后来渐渐的停不下手来了。游戏就是养鱼赚钱,然后用赚的钱再买鱼,最后“吞噬”合成鲲中的王者--“彩鲲”。
但是单靠养鱼赚钱太难了,高级的鱼和鲲贵的吓死人。联想到红极一时的跳一跳小游戏以及各种花式辅助,想着自己也分析一下。
一、分析日志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到底是多少。。。
后记
随便修改游戏的代码逻辑是不可取的,会失去游戏的乐趣,并且这种作弊的行为可能会导致封号。
更多有意思的内容,关注微信订阅号
网友评论