如果你正在写游戏,你应该考虑作弊者以及如何防止他们作弊.
我不认为只有mmo多人游戏,还有单人游戏或"自制啤酒"p2p mp游戏.
当游戏完全基于服务器 - 客户端架构时,我认为这项工作几乎已经完成,但也有墙壁黑客或其他东西.
我做了自己的p2p游戏,一段时间后出现了骗子.他们只是使用作弊引擎并尝试过speedhacks和记忆黑客的scriptkiddies.
大多数speedhacks挂钩gettickcount.我通过以下简单的技巧来整理速度计算器.我只追踪time()-GetTickCount()
价值,如果差异发生变化就会有作弊行为.
可以通过在某处保留散列副本并始终移动它并始终通过随机值对其进行重新分类来整理内存损坏.不匹配导致崩溃.
要完全挑选Cheat Engine,只需检查:
if (OpenFileMapping(FILE_MAP_READ,false,'CEHYPERSCANSETTINGS')!=0) { // Cheat Engine runs. }
(朋友告诉我这个,我还没有测试过.)
这些技巧排除了最多的骗子.但是当然还有更多的作弊技巧.我打开了这个wiki,讨论了更多另外的作弊技巧以及避免它们的方法.
我不认为你应该做任何事情来阻止对单人游戏作弊.你的用户购买了游戏,他们应该能够作弊,只要他们不与别人玩.
以下是我做过的一些事情.这些主要用于锦标赛游戏中的反作弊系统,其中资金处于危险之中,并且对用户系统的某些入侵水平被认为是可接受的.我会小心在休闲游戏中做一些这样的事情,因为如果你的游戏不稳定,就有可能导致他们的系统出现问题.
1)在可能的情况下,"永远不要相信客户"是您最安全的原则.在服务器上执行所有操作,并且只为客户端提供尽可能多的知识,以便在任何给定时间呈现他应该能够在屏幕上看到的内容.即如果客户不知道隐藏在墙后面的玩家的位置,则墙壁黑客不会对用户有任何好处.对于高速动作游戏来说,这可能非常困难 - 特别是现在实时阴影等是常态,即使玩家的身体可见,用户也可能需要能够看到阴影 - 但它应该始终是在您的选项的顶部.在点对点游戏上也很难做到,但是有很多方法可以限制同伴之间的知识.只有当它变得性能过高或超出您的时间/金钱预算时,才应考虑以下项目.
2)打开所有其他进程,并挂钩它们的WriteProcessMemory函数,使它们无法写入游戏进程中的内存.做得好这一步将阻止所有作弊和作弊引擎的90%.
3)做同样的事情,挂钩各种鼠标和键盘仿真功能.这将阻止许多目标机器人和其他类型的自动化机器人.
4)在游戏自己的进程中加入VirtualProtectEx/VirtualAllocEx/etc函数,并监视哪些模块正在改变保护级别或分配新的内存块.你必须要狡猾,以防止它在你的游戏进行大量分配时过于集中CPU,但是可以做到.
5)挂钩LoadLibrary函数并监视动态加载的任何DLL,以防止DLL注入.
6)在游戏连接上使用一些轻量级多态编码.
7)使用一些反调试技术来防止调试器附加到您的进程.谷歌反调试,你应该能找到很多东西.
8)使用定制的专有PE打包器来防止有用的游戏拆卸.
9)了解处理透明度和alpha混合的OpenGL或Direct3D函数和方法.
10)如果使用着色器,则校验和着色器和着色器常量值.
11)对玩家角色使用额外的遮挡剔除技术,以防止在他们的视线被其他几何体阻挡时完全渲染它们.它也可能对您的表现有所帮助,也可能没有帮助,但它可以防止许多问题.
您可能会发现有关Cheat Proof Game Protocols的这篇论文很有趣.它们都是同一个想法的变体:使用哈希作为承诺,然后在满足其他参与者行为的条件后揭示哈希承诺的含义.它很复杂,并且会影响性能,但有些想法可能会有用,尤其是对等游戏.
当游戏完全基于服务器 - 客户端架构时,我认为这项工作几乎已经完成,但也有墙壁黑客或其他东西.
如果你不能在服务器端运行大多数逻辑,至少尝试在每个游戏阶段分享尽可能少的状态,换句话说:保持每个玩家的主动游戏模式,并且只分享信息.当时实际上是相关的.
这不仅可以降低作弊的可能性,还可以减少协议造成的流量,即提高效率.
这种技术本身早已为人所知并应用于游戏/模拟行业,以提高渲染大型3D场景时的效率.
在那里,"视锥体剔除"用于确定场景的哪些部分实际可见,从而仅渲染相关部分.
类似地,可以使用相同的技术来限制多玩家客户端仅在它们实际相关时才接收某些更新/信息,例如,如果其他客户端实际上在" 相关范围 " 内,则其他客户端可以检索相应的更新.
仍然,区分相关性和"可见性":由门隔开的两个玩家可能实际上并不"看到"彼此,但是根据周围环境,可能很好地听到彼此.因此,区分不同类型的"可见性":传播可听状态不一定必须暗示传播玩家在游戏坐标中的实际位置.反之亦然:只是因为你"看到"一名球员,你不一定有权听见客户(例如想象一支步枪上的射程).
换句话说,尝试松散地耦合您支持的更新数据包,以便它们彼此之间没有相互依赖关系,并且还可以独立地传播/订阅.
通过应用适当的封装和数据隐藏机制,可以在很大程度上控制作弊,因此多人游戏客户端通常不共享全局状态,而是共享状态直接取决于玩家的活动上下文(位置,航向,方向,速度等).