Android知识

跳一跳外挂分析

2018-01-02  本文已影响3445人  XCG00

从微信6.6.1版本更新后,除了小程序入口增多外,还开放了小程序游戏,其中最火热的当属跳一跳,从发布当天开始大家就在拼命刷分,力争在排行榜中占据第一。

刚开始玩的时候,能上几十分时手感就已经算是很好了,朋友圈里有人刷到了两百多分就已经被膜拜了,但是最近经常有爆出上千分的截图以及排名,直接让很多人望而却步,直到发现了……

image

(文末附github地址)

按照作者的描述,配置好python环境,打开手机USB调试运行起来后,就发现游戏自动进行,而且跳的位置相当精确,甚至能连续多次跳在中心点上,这种中心点的额外加成最高达到32分。

一个多小时的时候,实在耐不住性子,就终止了程序,此时分数已经超过了5000分了。

image

但是在排行榜中我的分数居然是0,所以这里腾讯应该是做了一个最大值的反作弊(暂且称为人类极限值吧),此时恍然大悟,为什么有些人能跑更多的分数,但是民间流传的最高得分都是3999。

实验做完了,作为技术人员,绝逼按耐不住要去分析原理。

这里使用的是一个python脚本,原理其实相当简单,关键步骤就三步:

  1. adb 命令截图

  2. 分析截图中棋子与下一跳的距离

  3. adb 命令跳转

跳转需要设定点击的时间长短,而时间是由位置距离决定的,所以重点在于如何计算出跳跃距离。

从代码里看到,跳跃距离是通过勾股定理计算得出,而关键数据在于通过find_piece_and_board函数得到的棋子底盘中心点的位置piece_x

piece_y和下一跳上平面中心点的位置board_x

board_y

image

重点聚焦在find_piece_and_board函数中,先看一下截到的图。

image

首先,屏幕的上半部分和下半部分都不会有主要游戏元素,所以可以被直接忽略,假设重要的部分只有中间的1/3的长度;而棋子和下一跳也不会太靠近左右两边,所以作者也将x轴进行了8等分。

首先确定下一跳最高点的y轴坐标,直接遍历出第一次颜色跃变的点。当然这里还有个前提条件,就是下一跳位于游戏画面偏上方的位置(位于棋子的左上方或右上方)。

image

确定了下一跳最高点y轴的值之后,就开始寻找棋子底座的坐标。此时棋子的范围就在scan_start_y 与 屏幕的 2/3 的位置之间。

image

从代码里可以看出,默认棋子的颜色RGB范围在(50,53,95)与(60,63,110)之间。使用某工具网站查看结果如下:

(50,53,95)

image

(60,63,110)

image

其中,piece_base_height_1_2

是经验值,通过配置文件获取,不同的手机不同的分辨率可能有不同的值。

然后是确认下一跳上表面中心点的x轴,始终是跟左侧边界颜色做对比,色差超过一定值就记录一次,最后算平均。

image

y轴的方式差不多,就是换了个方向,色差小于某个值才算是在下一跳上表面区域内。

image

最终这些关键值都计算得出后,就可以执行模拟点击了。

从刚刚的分析中很容易发现,想针对此脚本进行反作弊相当容易,至少有三点可以做:

所以,可能很快这个游戏就会有改进版本,趁着还能用……

github地址:
https://github.com/wangshub/wechat_jump_game

公众号
上一篇下一篇

猜你喜欢

热点阅读