首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

跳一跳外挂分析

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

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

(文末附github地址)

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

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

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

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

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

adb 命令截图

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

adb 命令跳转

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

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

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

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

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

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

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

(50,53,95)

(60,63,110)

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

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

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

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

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

定制棋子,改变形状和颜色

定制下一跳上表面,使得颜色不均匀

定制背景颜色,有更多的色差

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

github地址:

https://github.com/wangshub/wechat_jump_game

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180102G00YD800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券