揭密微信跳一跳小游戏那些外挂

WeTest 导读

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



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

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

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

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

一、梳理

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

1、距离判断:

● 简单方案:像素点判断

● 进阶方案:OpenCV 图像分析

2、按压模拟:

● 简单方案:adb/wda 指令

● 进阶方案:机械臂模拟手指点击(原创)

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

二、距离判断

1. 像素点判断

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

如上图所示,我们先定义了「棋子」和「棋盘」,需要找到的两个目标点用橙色点标注,首先针对棋子的目标点的判断,可以这么做:

相关代码:

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

当然还有一些其他方法来尽量缩小棋盘中心点的检测区域,这里简单介绍下:

当然,如果恰好跳到中心点,下一个棋盘中间会有白色点,则可以直接匹配中心点的色值,得到棋盘中心点,这种情况基本百发百中:

相关代码:

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

总结一下,目前这个方案基本没有太大问题,但如果跳一跳游戏把背景改成了非线性渐变,或随机飘落一些物体,或棋盘表面更加复杂,那这里的算法就基本不可用了。

2. OpenCV 图像分析

基于像素点的判断低效而且不够健壮,而利用 OpenCV 计算机视觉库则可以从图像分析层面进一步简化判断逻辑提升效率,首先采用该方法的跳一跳小游戏「辅助程序」来自 wechat_jump_jump。它是这么得到棋子的位置的:

相关代码:

接下来找棋盘的中心点,假如下一个棋盘存在白色的示意点,同样采用上面的模板匹配方法进行匹配,若匹配不上(匹配值小于某阈值,也许下个棋盘本身就是白色,所以灰度图分辨不出),则采用第二种方案:

这里是否准确的精髓就在于高斯滤波去除图像噪音的临界点以及 Canny 函数中阈值的设定,需要不断调整参数到最优状态。

相关代码:

三、按压模拟

1. adb/wda 指令

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

当然,如果嫌配置麻烦,还可以通过 Android 的 AirDrop App 或 iOS 的 QuickTime 把手机屏幕投到电脑中,然后通过 Python 的 Pillow 库来截取投屏的内容,再做进一步的图像识别工作。

还有一点值得一提,按压时间这部分还是有优化的空间,前面提到了跳跃距离和按压时间基本是线性关系,但越到后面可以越发现,距离并非和按压时间绝对成线性比例,因为游戏本身不是一个纯 2D 的平面场景(2.5D),所以我们测量到的直线距离在 2.5D 场景中是有变化的,虽然影响不大,但在游戏后期棋盘越来越小,距离越来越大时,容易凸现出问题来,所以关于距离的计算有几种不同的解决:

拟合函数的细节可以参考:

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. 机械臂模拟手指点击

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

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

视频链接:https://v.qq.com/x/page/s05329u9gun.html

 四、最后

反对一切使用外挂行为!

反对一切使用外挂行为!

反对一切使用外挂行为!

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



关于腾讯WeTest手游安全测试团队

腾讯WeTest手游安全测试团队从2011年初开始对手游安全领域进行探索和技术积累,旨在通过提前发现游戏版本的安全漏洞,预警风险,打造出业界领先的手游安全测试技术方案,在工具上已经支持所有腾讯在研和运营的手游项目。团队通过使用与正式服同样的游戏客户端和服务器,模拟外挂工作室制作外挂的过程,依靠自身的技术积累来提高专业程度,持续保持漏洞的发现率。

目前提供了专家测试服务,希望通过提前发现游戏版本的安全漏洞,预警风险,帮助提高腾讯游戏的品牌和口碑。

服务目前已经对外开放,点击http://wetest.qq.com/product/sr   即可使用

原文地址:https://www.cnblogs.com/wetest/p/8313488.html

时间: 2024-08-03 13:43:10

揭密微信跳一跳小游戏那些外挂的相关文章

[原创]用C#实现微信“跳一跳”小游戏的自动跳跃助手

一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“打飞机”游戏,这游戏玩法简单,但加上了积分排名功能后,却成了“装逼”的地方,于是很多人花钱花时间的刷积分抢排名.后来越来越多的聪明的“程序哥们”弄出了不同方式不同花样的跳一跳助手(外挂?),有用JS实现的.有JAVA实现的.有Python实现的,有直接物理模式的.有机械化的.有量尺子的等等,简直是百花齐放啊…… 赶一下潮流,刚好有点时间,于是花了一个下午时间,我也弄了一个C#版本的简单实现.

【辅助工具】Python实现微信跳一跳

最近迷上了微信跳一跳小游戏,正好也看到知乎上有大神分享了技术贴,我也参考了好多资料,原理就是通过abd命令截取图片,python计算两个点距离,然后转化按压时间,让电脑来完成游戏.我花了很长时间才把程序跑起来,作为一名技术小白我谈谈自己的认识,尽量让大家少走弯路. 先贴上大神的github地址:https://github.com/wangshub/wechat_jump_game 准备工具 abd驱动 安卓手机 打开手机调试模式 usb线连接好手机与电脑 实现原理 获取手机实时截图 点击起始位

用Python玩微信跳一跳详细使用教程

github地址:https://github.com/wangshub/wechat_jump_game 工具介绍 Python 3 Android 手机 Adb 驱动 Python Matplot绘图 python3安装 安装pip 安装依赖包 在github地址将源码下载下来解压后,使用cd命令进入项目目录, 执行命令 pip install -r requirements.txt.会将依赖包下载下来. 下载好之后执行命令python -m pip list 安装adb驱动 下载adb驱动

python_微信 跳一跳

今天用python刷了一下微信跳一跳游戏得分数. 不是仅仅是玩一玩,而是为了把开发环境搭建好.(这个借口好) 参考: http://blog.csdn.net/LittleBeautiful/article/details/78955792 原文地址:https://www.cnblogs.com/lwbjyp/p/8213897.html

如何使用NSDL玩转微信跳一跳

目前网上介绍windows和IOS操作系统上玩微信跳一跳的有很多文章,但介绍Linux平台下的文章相对较少,所以动手操作下和大家分享,同时感谢wangshub在github上的分享: 1 下载wechat_jump_game-master 下载地址:https://github.com/wangshub/wechat_jump_game/archive/master.zip 2 解压安装并安装依赖包 pip3.4 install -r requirements.txt 操作如下:? 进入pyth

微信跳一跳

题目大意如下:微信跳一跳游戏,输入1,2,,0三个数字: 1代表跳到了下一个盒子但不在中心,得分为1,总分加1: 2代表跳到了下一个盒子且在中心:根据上次的得分计算:如果上一次得分为1,那此次得分为2,总分加2分,如果上一次得分为2,那此次得分为4,总分加4:以此类推:如上一次得分为8分,这次又跳到了盒子中心,那此次得分为10分,总分加10: 0代表没有跳到盒子上,游戏结束. ------------------------------------------------------------

.NET开发一个微信跳一跳辅助程序

昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来分把,于是就想着要是开发个辅助就好了,于是简单想了一下最高游戏 先来说下这个游戏的界面和规则: 先看看界面 规则:按住屏幕 按一定时间松开就可以跳跃,跳跃到前方的图案中得1分,图按中间得2分(连续多个中间累加2分,比如第一个2分 第二个4分 第三个6分 最高累计32分) 其它规则不说明了 整理了下实现原理,其

Adb+.net 实现微信跳一跳自动化

第一次用adb,一开始只是想试试看能不能解析出,没有看网上的现有解析方式. 需要安卓机开启usb 调试+电脑运行.打开跳一跳的界面 点击程序 [开始]按钮即可开始,别的按钮都是调试用的 主要流程是用abd 截图传到电脑开始解析,用颜色计算出起点,然后通过起点计算出终点.然后用adb模拟按压屏幕. 小部分 图片无法识别,但是不想处理了.只是随意的小程序,不想花费太多的时间了. 程序见网盘. https://pan.baidu.com/s/1i43Ijyd,密码:4wuw 觉得好用的可以在游戏结束后

【learning】微信跳一跳辅助c++实现 轻松上万 【未完待续】

写在前面 17年年底Wechat出了这个跳一跳的小游戏,今年2月份的时候简单地玩了一下,发现被游戏虐了(手太残了只能跳20多).     今天刚好有点空,于是就花了一个下午的时间写了一个跳一跳的c++辅助. 由于本OIER既不会Python,也不会安卓的USB调试,更不会单片机,故写了一一个操作安卓模拟器的辅助. 先放下效果:(只是先截个图而已,截止至目前跳了2150次,运行1小时55分钟)[未完待续] 据之前的跳一跳大赛的结果,尽管人类的第一为1.2W分,但仍然被本辅助轻松碾在地上. ----