热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

腾讯工程师揭密微信跳一跳小游戏那些外挂

作者:Hahn,腾讯高级UI工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。原文链接:http:wete

作者:Hahn, 腾讯高级UI工程师
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 
原文链接:http://wetest.qq.com/lab/view/364.html


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/s0532...

四、最后

反对一切使用外挂行为!

反对一切使用外挂行为!

反对一切使用外挂行为!

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


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

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

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


赞赏

推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本篇文章介绍如何将两个分别表示整数的链表进行相加,并生成一个新的链表。每个链表节点包含0到9的数值,如9-3-7和6-3相加得到1-0-0-0。通过反向处理链表、逐位相加并处理进位,最终再将结果链表反向,即可完成计算。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • Java中的基本数据类型与包装类解析
    本文探讨了Java编程语言中的8种基本数据类型及其对应的包装类。通过分析这些数据类型的特性和使用场景,以及自动拆装箱机制的实现原理,帮助开发者更好地理解和应用这些概念。 ... [详细]
  • 本文详细探讨了Android Activity中View的绘制流程和动画机制,包括Activity的生命周期、View的测量、布局和绘制过程以及动画对View的影响。通过实验验证,澄清了一些常见的误解,并提供了代码示例和执行结果。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
author-avatar
手机用户2702933671_440
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有