张小龙:这个游戏发布以后其实它的效果有点超出我们的预期我们自己开玩笑说10组我们自己开玩笑说这个游戏突然变成了有史以来可能用户规模最大的一个游戏因为它的DAU大概到了1点几亿但同时出现了很多外挂我没有想到这么小的一款游戏也会有那么多外挂我朋友圈的朋友也打出了特别高的分但是我相信不是他自己打出来的。
1 月 15 日微信在广州召开 2018 年的微信公开课 Pro张小龙不仅当场玩了一把跳一跳游戏并取得了900多的高分还特别提到了跳一跳小游戏的外挂:
所以我们这个小游戏发布以后我们就开始花了很多很多时间来打击外挂。
本着钻研技术的学习态度我对目前几款比较火的外挂进行了源码分析总结出了它们的一些破解思路其实这些作者都并非恶意作为一个程序员还有什么比用技术挑战规则突破极限要有成就感呢?
1、距离判断:
● 简单方案:像素点判断
● 进阶方案:OpenCV 图像分析
2、按压模拟:
● 简单方案:adb/wda 指令
● 进阶方案:机械臂模拟手指点击(原创)
下面逐一介绍这里的实现方法非常有意思。
二、距离判断1. 像素点判断
该方法采用自目前最火的跳一跳小游戏「辅助程序」:wechat_jump_game。
如上图所示我们先定义了「棋子」和「棋盘」需要找到的两个目标点用橙色点标注首先针对棋子的目标点的判断可以这么做:
相关代码:
而针对棋盘中心点的确认的思路则是这样的:
当然还有一些其他方法来尽量缩小棋盘中心点的检测区域这里简单介绍下:
当然如果恰好跳到中心点下一个棋盘中间会有白色点则可以直接匹配中心点的色值得到棋盘中心点这种情况基本百发百中:
相关代码:
但棋盘种类比较多形状也各异而且棋盘表面并非纯色还有其他颜色所以即使像素判断的代码里增加了很多特殊 case依旧不能做到非常完美:
总结一下目前这个方案基本没有太大问题但如果跳一跳游戏把背景改成了非线性渐变或随机飘落一些物体或棋盘表面更加复杂那这里的算法就基本不可用了。
2. OpenCV 图像分析
基于像素点的判断低效而且不够健壮而利用 OpenCV 计算机视觉库则可以从图像分析层面进一步简化判断逻辑提升效率首先采用该方法的跳一跳小游戏「辅助程序」来自 wechat_jump_jump。它是这么得到棋子的位置的:
相关代码:
接下来找棋盘的中心点假如下一个棋盘存在白色的示意点同样采用上面的模板匹配方法进行匹配若匹配不上(匹配值小于某阈值也许下个棋盘本身就是白色所以灰度图分辨不出)则采用第二种方案:
这里是否准确的精髓就在于高斯滤波去除图像噪音的临界点以及 Canny 函数中阈值的设定需要不断调整参数到最优状态。
相关代码: