文/Hahn, 腾讯高级UI工程师

张小龙:这个游戏发布以后,其实它的效果有点超出我们的预期,我们自己开玩笑说,这个游戏突然变成了有史以来可能用户规模最大的一个游戏,因为它的DAU大概到了1点几亿,但同时出现了很多外挂,我没有想到这么小的一款游戏也会有那么多外挂,我朋友圈的朋友也打出了特别高的分,但是我相信不是他自己打出来的。

1 月 15 日微信在广州召开 2018 年的微信公开课 Pro,张小龙不仅当场玩了一把跳一跳游戏并取得了900多的高分,还特别提到了跳一跳小游戏的外挂:


在跳一跳这样一个小的游戏里面,如果一个用户看到里面有一堆外挂得了很高的分,对其他一些每天在练习,试图把自己的水平提高,而打一个高分的人就很不公平,他可能就没有动力继续去练习,继续超越自己个人的最高分数。所以这样一个行为,外挂行为其实会破坏整个系统的规则,并且让规则立即变得失效。

所以,我们这个小游戏发布以后,我们就开始花了很多很多时间来打击外挂。

本着钻研技术的学习态度,我对目前几款比较火的外挂进行了源码分析,总结出了它们的一些破解思路,其实这些作者都并非恶意,作为一个程序员,还有什么比用技术挑战规则,突破极限要有成就感呢?

一、梳理

跳一跳的游戏可以细分为两步骤:距离判断 + 按压模拟,这两步都有下面这些解决方案:

1、距离判断:
 

  • 简单方案:像素点判断
    • 进阶方案:OpenCV 图像分析

    2、按压模拟:
     
    • 简单方案:adb/wda 指令
    • 进阶方案:机械臂模拟手指点击(原创)

    下面逐一介绍这里的实现方法,非常有意思。

    二、距离判断

    1. 像素点判断

    该方法采用自目前最火的跳一跳小游戏「辅助程序」:wechat_jump_game。

    130624wqtev9tw9emrrekk.png
    而针对棋盘中心点的确认的思路则是这样的:

    130948zvzov64e4oz6ocgl.png
    但棋盘种类比较多,形状也各异,而且棋盘表面并非纯色,还有其他颜色,所以即使像素判断的代码里增加了很多特殊 case,依旧不能做到非常完美:

    131126so2maabi4v2vbedb.png
    三、按压模拟

    1. adb/wda 指令

    这两个分别是针对 Android 和 iOS 的命令行工具,可以将手机和电脑连接起来,并通过命令行发送指令,指令中就包含了屏幕的截图和按压模拟。不过 iOS 配置起来稍微麻烦一点,具体操作指引可以参考 这里。其核心的命令有:

    131305l07sm17whbvjh8w0.png
    当然,如果嫌配置麻烦,还可以通过 Android 的 AirDrop App 或 iOS 的 QuickTime 把手机屏幕投到电脑中,然后通过 Python 的 Pillow 库来截取投屏的内容,再做进一步的图像识别工作。还有一点值得一提,按压时间这部分还是有优化的空间,前面提到了跳跃距离和按压时间基本是线性关系,但越到后面可以越发现,距离并非和按压时间绝对成线性比例,因为游戏本身不是一个纯 2D 的平面场景(2.5D),所以我们测量到的直线距离在 2.5D 场景中是有变化的,虽然影响不大,但在游戏后期棋盘越来越小,距离越来越大时,容易凸现出问题来,所以关于距离的计算有几种不同的解决:

    131306y4rcha8nnz8ama4v.jpg
    拟合函数的细节可以参考:

    1)https://github.com/metowolf/JumpJumpHelper
    2)https://github.com/wangshub/wechat_jump_game/issues/744
    3)https://github.com/wangshub/wechat_jump_game/pull/841

    2. 机械臂模拟手指点击

    本着学术探究的态度,结合之前折腾开源硬件的经历,所以也斗胆想给跳一跳小游戏增加一点动手环节,把触摸模拟这一操作通过机械臂来物理完成,于是在万能淘宝里淘了一个一百多快钱的机械臂和部分配件,自己编写了控制代码,把按压时间传输作为机械臂按下的停留时间,想法确定后便开始购置物品:

    131307bcjmomjejdd4fxcf.jpg
    到货后折腾一两个晚上,最后成功搭建好了,大家看看效果(电容笔偶尔还是会触碰不良)。


    四、最后

    反对一切使用外挂行为!

    反对一切使用外挂行为!

    反对一切使用外挂行为!

    通过对外挂程序源码的研读,学习到了非常多创新的思维,这也算是外挂留给代码世界的果实。


    via:Gad

    锐亚教育

    锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛