来源:本站 发布时间:2024-06-02
这篇文章有不明白的地方可以在下方留言讨论, 另外,欢迎关注,更多有趣的前端知识
该以守望先锋举例,其他游戏同理
首先我们在守望先锋中所见到的外挂,功能无非都是辅助瞄准,透视两个主要功能。更进阶一些往细里说,也有大家听说过的包括自动近战、源氏自动刀、狂鼠自瞄根据目标距离可以计算抛物线的下落点自动帮你抬高准星等辅助功能。
可能有些人会听过一些名词比如,内存挂,脚本挂,封包挂,等等。
接下来我们详细聊聊
以目前比较流行的内存挂举例,不知道大家以前是否用过金山游侠或者八门神器这类内存修改器。其实在单机游戏中修改数值大体上跟网络游戏实现方向差不多。
游戏中所有你能看见的东西,部分你看不见的东西都会在内存里面,最直观的就是数值比如生命值,技能CD。单机游戏感受最直观,修改了某个数值马上就会提现在游戏中。
在守望先锋中有可能把某个英雄(比如死神)生命值改为十万吗?
目前看来不可能,因为平时的对战中,你的所有数值都是在和服务端交换,在屏幕中看见200这个数值仅仅只是展示,修改为十万对于服务器(权威端)和其他玩家而已还是200。
大概流程如下
玩家A:死神 -> 对某个方向开枪 -> 发送到服务端,服务端进行计算 -> 告知B玩家死亡
其他网络游戏也类似这种原理,当然还有一些比如某些吃鸡游戏就很简单直接就是玩家A开枪 击中玩家B发送到服务端,这种通常就会出现秒杀,锁血这一类外挂。
这两种主要从实现技术上来区分。脚本挂通常可以认为鼠标宏或者某些一直执行轻量机械性重复操作的程序,比如 连点工具
而封包挂完全就不同于脚本挂和内存挂了,以前某些mmorpg网游出现过,通常来做脱机外挂,可能工作室会经常使用,这种外挂制作成本挺高的,因为必须要解析客户端和服务端之间的通信协议,并且自己编程从新实现和服务端的通信。守望先锋这类应该比较少
来具体聊聊透视是怎么实现的,通常服务端会把全部角色发送到客户端,因为如果只有玩家看见的时候才告诉客户端的话就会出现延迟,服务端需要实时计算遮挡关系,需要完整的3D场景建模数据等等,计算量会成倍增长而且体验也差。
举个例子如果由服务端计算,某个敌人突然从墙后面出现,这时候才告诉客户端,客户端就需要加载模型,需要首次初始化角色,需要构建顶点索引uv,可能还需要编译这个角色shader等等很可能客户端就会卡顿一下,这时候敌人两三枪就干掉你了。
那么外挂如何做到看到所有敌人位置的呢?
通常会通过c***engine软件反编译和调试游戏程序,找出角色坐标,什么英雄,当前生命值等等属性所在的内存块偏移,总而言之就是前面说的游戏中所有你能看见的东西,部分你看不见的东西都会在内存里面。
外挂的透视,通常通过方框标注玩家所在位置,那么外挂就在游戏窗口上再打开一个透明窗口,这个窗口和守望先锋完全不同进程,然后根据读出来的坐标信息不断地绘制在这个透明窗口上,当然这就会涉及坐标转换,因为读取出来的是世界坐标xyz,需要转换为屏幕坐标xy。这就是为什么守望先锋外挂通常会要去窗口模式或者无边框窗口模式来运行
我们有了角色坐标,而对辅助瞄准来说,他要做的事情就是在你开枪时捕获鼠标键盘消息,然后帮你把准心移动到头部,同样的头部坐标也是从内存获取。
这里控制鼠标有通过驱动层模拟也有直接通过守望先锋内部写好的代码在内存call的方式,当然这两种都是软件层面都有一定的防止和检查手段。所以在江湖上还有一种U盘挂,直接假装自己是个usb鼠标,真真正正的硬件,相当于我只不过多插了个鼠标,就跟守望先锋或者某个进程毫无关系了
然后还有一种原理稍微简单一点的自瞄,它不需要读取内存,方法简单粗暴,在早期的时候大量使用。下次再继续聊。如果大家感兴趣下次一起再说说王者荣耀,格斗动作类等等全客户端计算的游戏如何防止修改数据外挂,因为按照我们上面聊的如果一个游戏数据不是在服务端计算之后发到客户端展示就会产生外挂修改客户端的数据。