如何在我们的(多人)游戏中防止作弊?

时间:2009-06-06 20:47:12

标签: anti-cheat

如果你正在写游戏,你应该考虑作弊者以及如何防止他们作弊。

我不认为只有mmo多人游戏,还有单人游戏或“自制”p2p mp游戏。

当游戏完全基于服务器 - 客户端架构时,我认为这项工作几乎已经完成,但也存在墙壁黑客或其他内容。

我制作了自己的p2p游戏,一段时间后出现了骗子。他们只是使用作弊引擎并尝试过速度和记忆黑客的scriptkiddies。

大多数speedhacks挂钩gettickcount。我通过以下简单的技巧来整理速度计算器。我只是跟踪time()-GetTickCount()值,如果差异发生变化则会有作弊行为。

可以通过在某处保留散列副本并始终移动它并始终通过随机值重新散列来解决内存损坏。不匹配导致崩溃。

要完全挑选Cheat Engine,只需检查:

if (OpenFileMapping(FILE_MAP_READ,false,'CEHYPERSCANSETTINGS')!=0)
{
   // Cheat Engine runs.
}

(朋友告诉我这个,我还没有测试过。)

这些技巧排除了最多的骗子。但是当然还有更多的作弊技巧。 我打开了这个wiki,讨论了更多另外的作弊技巧以及避免它们的方法。

3 个答案:

答案 0 :(得分:55)

我认为你不应该做任何事情来阻止对单人游戏作弊。你的用户购买了这款游戏,只要他们不与别人玩,就应该能够作弊。

以下是我做过的一些事情。这些主要用于锦标赛游戏中的反作弊系统,其中资金处于危险之中,并且对用户系统的某些入侵水平被认为是可接受的。我会在休闲游戏中做一些这样的事情,因为如果你的游戏不稳定,就有可能导致他们的系统出现问题。

1)在可能的情况下,“永远不要相信客户”是您最安全的原则。在服务器上执行所有操作,并且只为客户端提供尽可能多的知识,以便在任何给定时间呈现他应该能够在屏幕上看到的内容。即如果客户不知道隐藏在墙后面的玩家的位置,则墙壁黑客不会对用户有任何好处。对于高速动作游戏来说,这可能非常困难 - 特别是现在实时阴影等是常态,即使玩家的身体可见,用户也可能需要能够看到阴影 - 但它应该始终是在您的选项的顶部。在点对点游戏上也很难做到,但是有很多方法可以限制同伴之间的知识。只有当它变得性能过高或超出您的时间/金钱预算时,才应考虑以下项目。

2)打开所有其他进程,并挂钩他们的WriteProcessMemory函数,使他们无法在游戏进程中写入内存。如果做得好,这一步将阻止所有作弊和欺骗引擎的90%。

3)做同样的事情,挂钩各种鼠标和键盘仿真功能。这将阻止许多目标机器人和其他类型的自动化机器人。

4)在游戏自己的进程中加入VirtualProtectEx / VirtualAllocEx / etc函数,并监视哪些模块正在更改保护级别或分配新的内存块。当你的游戏进行大量分配时,你必须对此狡猾,以防止它过于CPU密集,但是可以做到。

5)挂钩LoadLibrary函数并监视动态加载的所有DLL,以防止DLL注入。

6)在游戏连接上使用一些轻量级多态编码。

7)使用一些反调试技术来防止调试器附加到您的进程。谷歌反调试,你应该能找到很多东西。

8)使用自定义专有的PE打包器来防止对游戏进行有用的反汇编。

9)了解处理透明度和alpha混合的OpenGL或Direct3D函数和方法。

10)如果使用着色器,则校验和着色器和着色器常量值。

11)对玩家角色使用额外的遮挡剔除技术,以防止在他们的视线被其他几何体阻挡时完全渲染它们。它也可能对您的表现有所帮助,也可能没有帮助,但它可以防止许多问题。

答案 1 :(得分:16)

你可能会发现Cheat Proof Game Protocols这篇论文很有意思。它们都是同一个想法的变体:使用哈希作为承诺,然后在满足其他参与者行为的条件后揭示哈希承诺的含义。它很复杂,而且会影响性​​能,但有些想法可能会有用,尤其是对等游戏。

答案 2 :(得分:5)

  

当游戏完全基于服务器 - 客户端架构时,我认为这项工作几乎已经完成,但也存在墙壁黑客或其他内容。

如果你无法在服务器端运行大多数逻辑,至少尝试在每个游戏阶段分享尽可能少的状态,换句话说:保持每个玩家的主动游戏模式,并且只考虑分享当时实际相关的信息。

这不仅可以减少作弊的可能性,还可以减少协议造成的流量,即提高效率。

这种技术本身早已为人所知并应用于游戏/模拟行业,以提高渲染大型3D场景时的效率。

在那里,“视锥体剔除”用于确定场景的哪些部分实际可见,以便仅渲染相关部分。

类似地,可以使用相同的技术来限制多玩家客户端仅在它们实际相关时才接收某些更新/信息,例如,如果其他客户实际上在“相关范围”内,那么其他客户可以检索相应的更新。

仍然,区分相关性和“可见性”:两个被门隔开的玩家可能实际上并不“看到”彼此,但根据周围环境,可能会很好地听到彼此。因此,区分不同类型的“可见性”:传播可听状态不一定必须暗示传播玩家在游戏坐标中的实际位置。反之亦然:只是因为你“看到”一名球员,你不一定有权听见客户(例如想象一支步枪上的射程)。

换句话说,尝试松散地耦合您支持的更新数据包,这样它们就不会相互依赖,也可以独立地传播/订阅。

通过应用适当的封装和数据隐藏机制,可以在很大程度上控制作弊,因此多人游戏客户端通常不共享全局状态,但共享状态则直接取决于玩家的活动上下文(位置,航向,方向,速度等) )。