如何保护客户端反作弊

时间:2012-12-11 19:05:16

标签: java minecraft anti-cheat

首先,

我想表明我知道从客户端发送的任何信息都不可信,因为它可能是欺骗性的。我对通过默默无闻的安全方法感兴趣,以阻止99.9%的潜在骗子和能够检测到实时绕过安全的程序。

我对此的一些想法包括通过允许客户端扫描来自服务器的请求(通过TCP)来验证它正在保护的游戏以及任何潜在的作弊应用程序的文件和内存校验和,两者都是检测内存注入欺骗和/或欺骗内存占用。因此,旁路黑客必须侦听在SSL上发送给它的所有TCP信息,然后通过反汇编加密/解密功能来解密消息,以了解它想要什么。类似地,客户端本身可能是自我更改的,并允许它随机添加/删除功能(但由服务器保留),以便欺骗学习如何绕过它。这可能毫无意义?

我发现对于经验较丰富的人来说,这是一个中等难度,所以我对其他可能难以绕过的方法持开放态度。

我只对可能的实施感兴趣,而不是对客户端的反热是不可能的,我只是想让它变得非常困难。

添加了Minecraft和java标签,它适用于Minecraft,我知道社区足够大,有人可能会击败我的系统,但我希望通过使用不断的更新和更改,我可以通过独创性打败他们毅力。

编辑:我发现这篇文章:How to prevent cheating in our (multiplayer) games?我正在添加他的建议,所以不要复制内容,因为我正在寻找比明显更多的想法(我不确定他是否可以绕过)

  

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

     

2)做同样的事情,挂钩各种鼠标和键盘模拟   功能。这样可以防止很多瞄准机器人和其他类型的瞄准器   自动化机器人。

     

3)进入你的VirtualProtectEx / VirtualAllocEx / etc函数   游戏自己的过程和监控哪些模块正在改变保护   级别或分配新的内存块。你必须狡猾   这是为了防止你的CPU过于密集   游戏可以做很多分配,但是可以做到。

     

4)进入LoadLibrary函数并监视任何DLL   动态加载,以防止DLL注入。

     

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

     

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

     

7)使用定制的专有PE封隔器来防止有用的拆卸   你的游戏。

     

8)加入你的OpenGL或Direct3D函数和方法   透明度和alpha混合。

     

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

     

10)对玩家角色使用额外的遮挡剔除技巧   当视线到达时,防止它们被渲染   它们被其他几何体阻挡。它可能会也可能没有帮助   表现也很好,但它会阻止很多墙壁。

3 个答案:

答案 0 :(得分:9)

如果您希望您的客户尊重您和您的游戏,您应该尊重您的客户并意识到您所看到的游戏客户端机器可能用于存储有价值的信息。

  

允许客户端扫描服务器随机给出的任何内存部分

     

客户端本身可能会自行更改,并允许它随机添加/删除功能

请注意,您没有在客户端计算机中打开攻击媒介。阅读“随意给出的任何记忆部分”听起来很可怕。你可以通过散列(不小)内存块并检查已知值来减少它。

让服务器发送“随机”代码可能会使您的软件看起来像病毒/僵尸网络到防病毒/安全工具。它还使客户对潜在的利用开放。

更新

  

1)打开所有其他进程,并挂钩他们的WriteProcessMemory函数

如果您执行此操作,并且注入的代码中存在错误,则可能会破坏客户整个计算机的稳定性。这看起来很激进。你正在运行什么版本的Windows?有什么权限?我很确定一个破解者可以安排从你没有权限挂钩的进程中运行他的漏洞利用(比如你在普通用户进程中运行的管理进程)。此外,由于显而易见的原因,您还需要挂钩GetProcAddress

  

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

这个并不像听起来那么糟糕,因为你只需要在本地进程中这样做。

  

6)使用一些反调试技术来防止调试器附加到您的进程。

当然值得做(如果你有时间),但这只是一个经验丰富的饼干的减速带。请记住,他始终可以从启动时跟踪您的代码并观察或绕过您的反调试。 (这需要时间,但有些破解者喜欢这个。)

  

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

这是另一个可以让你注意到反病毒软件。

答案 1 :(得分:1)

我个人认为观察记忆等没有意义。我可以想象,当有人实现协议时,你需要处理它并使得一些废话也可能让你的服务器崩溃。

但你是对的,有可能检查内存是否有欺骗者通常使用的坏软件,例如:像egoshooters中的wallhacks。

恕我直言,您需要检查来自客户端的数据是否有效并且反应是否比作弊更多。

关于您的更新:
请不要挂钩所有其他程序,这有点疯狂,也可能让你的程序被检测为根套件或类似的东西。

答案 2 :(得分:0)

我完全同意其他人的说法 - 其中一些(打开所有其他进程并挂钩WriteProcessMemory,鼠标/键盘仿真功能)是疯狂和荒谬的 - 特别是因为用户可以通过删除权限来绕过这一点你的过程。这样做肯定会激起一些用户的愤怒。

但是如果你真的想全力以赴做恶意软件之类的疯狂事情,为什么不编写一个内核驱动程序来修补Protected标志(适用于Windows Vista及更高版本)或修补OpenProcess?后者是一种更常见的方法(见于AV软件和恶意软件);先前不太常见,但仍然可行 - 如果您可以加载KMD,您可以修补标记并绕过Microsoft签名要求。