美文网首页Android知识
跳一跳外挂分析

跳一跳外挂分析

作者: XCG00 | 来源:发表于2018-01-02 09:32 被阅读3445次

    从微信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

    公众号

    相关文章

      网友评论

        本文标题:跳一跳外挂分析

        本文链接:https://www.haomeiwen.com/subject/xlcfnxtx.html