帧同步(LockStep)该如何反外挂
在中国的游戏环境下,反挂已经成为了游戏开发的重中之重,甚至能决定一款游戏的生死,吃鸡就是一个典型的案例。
目前参与了了一款动作射击的MOBA类游戏的开发,同步方案上选择了帧同步技术(LockStep而非snapshots以下同)。那么就有很多人担心起来,客户端会跑全部逻辑帧同步该如何反外挂,和状态同步有什么区别呢?
首先我们来分析一下手游的风险和外挂的分类,这里推荐腾讯游戏安全中心的文章,有着非常详细深入的介绍。
手游的风险:
• 静态修改文件:将游戏解包修改资源 ,配置,代码等之后再重新打包
○ 修改资源,例如替换游戏的贴图做广告,修改玩家碰撞资源 或删除部分关键资源使玩家可以作弊等
○ 修改代码,直接修改游戏代码,实现无敌,免CD,无限伤害等等
○ 修改配置,修改策划配表等
• 动态篡改逻辑:通过注入和钩子的方式,在游戏运行时修改游戏代码,修改游戏内存等
○ 修改代码,运行时注入进程直接修改游戏代码或者钩住关键逻辑函数修改逻辑,实现无敌,免CD,无限伤害等等
○ 修改内存,例如烧饼,葫芦侠等修改器,在游戏运行时修改堆栈和全局变量等
• 游戏协议
○ 篡改游戏协议,直接修改协议的内容,修改结算结果,修改伤害数值,修改血量等等
○ 重复游戏协议,例如多次重复伤害协议
• 其他,按键精灵。脚本宏,盗号,恶意发言,打金工作室等,这些和同步技术无关,暂不做详细讨论
外挂的分类 :
摘自腾讯游戏安全实验室
从上文可以看出外挂的主要方式还是修改客户端的资源,代码,和内存。因此反外挂的手段也不外乎以下几种:
• 服务器计算关键逻辑。例如一些MMO战斗逻辑泡在服务端
• 服务器验证客户端逻辑。包括通过完整战斗逻辑验证和数值范围验证,例如早期的酷跑(可能误杀牛逼的玩家)
• 包体加密加签名加验证,防止破解包体。例如一些第三方加固,Unity的MonoDll加密,代码混淆等
• 加密本地保存的一些文件。例如对加密PlayerPrefs文件
• 加密和扰动运行时内存中关键数据(例如血量数据等)。例如崩3等
• 防注入检测(杀死注入进程或者发现注入之后杀死自己)
• 虚拟机加密
• 加速检测,防止修改本地时间的变速齿轮
• 穿墙检测,客户端对关键碰撞做校验
• 集成守护进程以及守护进程的自我加密更新
• 鼠标宏,按键精灵等进程检测,防止玩家使用这些工具
• 增加举报系统查证封号
• 通过暴力机关严厉打击外挂制作者(个人感觉非常有效)
• 其他
但很遗憾,因为理论上再牛逼的客户端也是可以破解的,所以客户端的东西都是不可信任的。就像市面上也有很多第三方的加固工具,反作弊插件等,但不管用什么eye,什么火眼精睛,该作弊的还是作弊。因此反外挂的核心还是在于是否服务器是否计算了关键逻辑,就像Unreal老大说的The Server Is The Man。而和同步技术和客户端是否跑完整逻辑关系不大(严格说是有一点关系)。不管是状态同步还是帧同步,只要做到了服务器有完整逻辑并验证,绝大部分外挂都可以防掉(例如锁血挂,穿墙挂,加速挂等)。
对于状态同步来说关键逻辑在服务器的比重越高反外挂就越完美。最极端的例子就是就是云游戏,服务器计算所有逻辑和画面,客户端只是显示图像,基本上杜绝了所有其他外挂(除了按键精灵,鼠标宏,手速挂等可以模拟玩家操作,捕捉像素计算操作,只能通过进程检测,举报,法律打击等其他方案)。
而对于帧同步来说,我们同样可以在服务器验证完整的战斗逻辑。一般分为两种:
1. 实时验证。例如战斗实时运行战斗逻辑和客户端不断同步验证关键数据的hash,和状态同步类似。但这种方案服务器负载较高,运维成本高昂;
2. 离线验证。这是帧同步的优势,战斗结束后服务器收集整场的操作序列,然后加速播放战斗(几十上百倍),最后校验结果,例如刀塔传奇。这个好处是服务器不用实时跑战斗,只需在结束时花几百ms即可验证一场战斗,大幅降低服务器成本。
如果是这种验证方式帧同步也一样能防掉绝大部分外挂,但是会多一个弱点就是全图挂。因为客户端有了所有玩家的位置信息,所以无法防掉全图挂。
那么如果这么说,只要服务器跑逻辑就行了,为什么外挂还这么泛滥呢?其实因为种种原因很多游戏服务器并没有完整的逻辑和校验,对于绝大部分游戏使用状态同步来说有以下一些原因:
1. 性能问题。服务器运行完整逻辑开销很高(特别是一些复杂运算,例如物理弹道等),因此将部分逻辑放在客户端分布运算
2. 因为开发效率和开发能力的限制。例如开发技能,如果所有逻辑都在客户端开发就会简单很多,响应也非常及时。如果要涉及服务器和客户端同步,就会多很多工作量特别是一些位移技能,很多逻辑可能还要写两份(帧同步更高效更容易实现打击感也是这个原因,很多动作游戏,MOBA游戏也会选择帧同步)
3. 经验问题。一些公司在反外挂上经验不足重视程度不够,特别是国外游戏环境较好法律健全
4. 为了极致的体验。例如为了降低网络延迟,很多游戏会让客户端预表现和加入延迟补偿,在一定范围内信任客户端(特别是FPS游戏,状态同步在延迟感上有较优势)
5. 为了弱网体验。为了让玩家在网络极差甚至断线的情况下也能玩,将绝大部分逻辑都放在客户端
6. 多种原因混合,其他一些个别问题。
但是以上的问题对于帧同步来说不也一样吗?如果为了成本和快速开发,服务器不跑逻辑不也一样抓瞎吗?其实帧同步会更简单一些。对帧同步来说有以下几种情况:
1.基于RelayServer多人PVP。这种会相对简单很多,因为每个客户端都计算了完整逻辑,作弊玩家修改的只是本地数据无法影响其他玩家,只能自嗨。最终结果服务器只要简单的比较投票就可以找到作弊者,除非作弊的玩家多余非作弊的玩家并且作弊玩家还要修改一样的数据(有点比特币算力的意思:),另外也可以在游戏运行时不断生成关键数据的hash码,随时校验;
2.基于P2P的多人PVP。和RS差不多但是无法防主机作弊了,参考魔兽争霸,但网游基本不会使用;
3.双人PVP和单机。这就没办法了,只能服务器做校验;
综上所述,因为天然的客户端强一致性,总体来说帧同步在防外挂上甚至会更简单一些(参考王者荣耀)。但成也萧何败也萧何,正因为这个机制的问题,无法完全防住全图挂,也因此甚至有MOBA游戏,同时使用两种同步机制来保证线上赛和线下赛的公平和体验。
转载自知乎:https://zhuanlan.zhihu.com/p/34014063
帧同步(LockStep)该如何反外挂的更多相关文章
- 游戏中的网络同步机制——Lockstep(帧同步)
本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...
- 基于御安全APK加固的游戏反外挂方案
一. 前言 随着移动互联网的兴起,移动游戏市场近几年突然爆发,收入规模快速增长.根据第三方数据统计,国内移动游戏2015年市场规模已达514.6亿.由于手游市场强势兴起,而且后续增长势头会愈加猛烈.火 ...
- 动作手游实时PVP帧同步方案(客户端)
1.概述 1.1.基于UDP的帧同步方案 在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下: 高一致性.如果每一帧的输入都同步 ...
- GJM :动作手游实时PVP 帧同步(客户端)[转载]
原帖地址:http://gad.qq.com/article/detail/7171195 原文作者:唐声福 原帖备注:版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 1.概述 1.1.基于U ...
- Unity3D RTS游戏中帧同步实现
帧同步技术是早期RTS游戏常用的一种同步技术,本篇文章要给大家介绍的是RTX游戏中帧同步实现,帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏,想要了解更多帧同步的知识,继续往下 ...
- nProtect APPGuard安卓反外挂分析
工具与环境: IDA7.0 JEB2.2.5 Nexus 5 Android 4.4 目录: 一:app简单分析与java层反编译 二: compatible.so反调试与反反调试 三: compat ...
- [SimplePlayer] 3. 视频帧同步
Frame Rate 帧率代表的是每一秒所播放的视频图像数目.通常,视频都会有固定的帧率,具体点地说是每一帧的时间间隔都是一样的,这种情况简称为CFR(Constant Frame Rate);另外一 ...
- [Golang] 开源一个帧同步服务器
具体看README吧 https://github.com/bailu1901/lockstepserver
- 手游后台PVP系统网络同步方案总结
游戏程序 平台类型: 程序设计: 编程语言: 引擎/SDK: 概述 PVP系统俨然成为现在新手游的上线标配,手游Pvp系统体验是否优秀,很大程度上决定了游戏的品质.从最近半年上线的新手 ...
随机推荐
- Android官方命令深入分析之Device Monitor
Android Device Monitor是一个提供了图形化界面的可以对Android应用进行调试和分析的独立的工具.Monitor工具不需要IDE环境,比如Android Studio.包括以下工 ...
- ROS_Kinetic_01 在ubuntu 16.04安装ROS Kinetic 2017.01更新
ROS_Kinetic系列学习(一),在ubuntu 16.04安装ROS Kinetic. Celebrating 9 Years of ROS! ubuntu16.04已经发布半年多了,ROS的K ...
- Dynamics CRM 2013 subgrid刷新后刷新主表单
项目中会遇到这样的需求,会根据subgrid中的数据变化去更新主表单中的某个或多个字段值,一般的做法就是写插件根据subgrid中实体数据的变化在后台更新主表数据库,但后台更新了要反映到前台就得使用刷 ...
- JSP编译成Servlet(一)语法树的生成——语法解析
一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...
- PHP中关于foreach的简单的用法总结
在php中使用循环方式输出数组里面的内容有好多种方式,我们既可以采用数组迭代循环的方式,当然也可以采用下面的foreach方法,日常开发中用到的最多就是它.下面我们就先看一下它的用法吧: //语法是: ...
- [WinForm]最小化到系统托盘,右键退出
1.拉出一个notifyIcon1到用户界面,也可以NEW一个 2.拉出一个ContextMenuStrip控件,命名为mymenu,集合中增加退出 3.notifyIcon1的属性ContextMe ...
- 常见Css样式
css就是就是会使用文档,css2.0中文手册下载地址:http://download.csdn.net/my <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- javascript的介绍,实现和输出以及语法-javascript学习之旅(1)
javascript的介绍 : 1.javascript死互联网最流行的脚本语言,可用于web和html,并且可用于服务器,pc和移动端 2.javascript脚本语言: 1.是一种轻量级的脚本语言 ...
- 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...
- AngularJS进阶(一)深入理解ANGULARUI路由_UI-ROUTER
深入理解ANGULARUI路由_UI-ROUTER 最近在用 ionic写个webapp 看到几个demo中路由有好几种,搞的有点晕,查下资料研究下,做个笔记,其中大部分为摘抄别人的,做个说明免得被人 ...