如何保护客户端反作弊 [关闭]

Posted

技术标签:

【中文标题】如何保护客户端反作弊 [关闭]【英文标题】:How to secure client-side anti-cheat [closed] 【发布时间】:2012-11-29 09:23:36 【问题描述】:

首先,

我想表明我知道从客户端发送的任何信息都不能被信任,因为它可以被欺骗。我对通过隐蔽性来阻止 99.9% 的潜在作弊者以及实时检测确实绕过安全性的程序的能力感兴趣。

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

我只觉得这对于更有经验的人来说比较困难,所以我对其他可能难以绕过的方法持开放态度。

我只对可能的实现感兴趣,而不是如何不可能有客户端反作弊,我只是想让它变得非常非常困难。

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

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

1) 打开所有其他进程,并钩住它们的 WriteProcessMemory 函数,这样它们就无法写入游戏中的内存 过程。正确完成这一步将阻止 90% 的所有作弊和 作弊引擎。

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

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

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

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

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

7) 使用定制的专有 PE 打包程序来防止有用的反汇编 你的游戏。

8) 连接到您的 OpenGL 或 Direct3D 函数和方法 具有透明度和 Alpha 混合。

9) 如果使用着色器,校验和你的着色器和着色器常数 价值观。

10) 对玩家角色使用额外的遮挡剔除技术 以防止它们在视线到达时被渲染 它们被其他几何图形阻挡。它可能对您有帮助也可能没有帮助 性能也很好,但它会防止许多墙黑客。

【问题讨论】:

该列表阻止 99.9% 作弊者的列表。是的,该列表中的所有内容都是可绕过的,因为您可以做的所有事情都是可绕过的。 我仍然讨厌通过默默无闻来投票的安全性。默默无闻也会惹恼合法玩家/用户。 添加 Denuvo、Steam 和其他一些保护。撒上仙尘,聘请牧师和营销人员。而且它最终还是会被打破。请参阅刺客信条和其他的。 【参考方案1】:

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

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

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

请注意不要在客户端计算机中打开攻击向量。阅读“随机给出的任何内存部分”听起来很可怕。您可以通过散列(不小)内存块并检查已知值来减少这种情况。

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

更新:

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

如果您这样做,并且您在注入的代码中有错误,您可能会破坏您客户的整台机器的稳定性。这似乎具有侵略性。您在哪个版本的 Windows 上运行?有什么权限?我很确定破解者可以安排从您无权挂钩的进程(例如您在普通用户进程中运行的管理进程)运行他的漏洞利用程序。此外,出于显而易见的原因,您还需要挂钩 GetProcAddress

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

这并不像听起来那么糟糕,因为您只需要在本地进程中执行此操作。

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

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

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

这是另一个会让你被杀毒软件注意到的。

【讨论】:

【参考方案2】:

我完全同意这里的其他人所说的——其中一些(打开所有其他进程并挂钩 WriteProcessMemory、鼠标/键盘仿真功能)是疯狂和可笑的——尤其是因为用户可以通过放弃特权来绕过这一点你的过程。这样做肯定会激怒一些用户。

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

【讨论】:

【参考方案3】:

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

但是您是对的,可以检查内存中是否存在通常由作弊者使用的不良软件,例如就像自我射击游戏中的壁挂一样。

恕我直言,您需要检查来自客户端的数据是否看起来有效并且对作弊做出反应。

关于您的更新: 请不要挂钩所有其他程序,这有点疯狂,而且它可能会让您的程序被检测为 root 工具包或类似的东西。

【讨论】:

以上是关于如何保护客户端反作弊 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

关于CNKI论文防作弊系统的问题

反作弊基本概念与机器学习的应用

浅谈广告反作弊

浅谈广告反作弊

移动互联网广告 - 第六更 - 移动广告的作弊方法及反作弊 - 2016/12/07

浅谈活动场景下的图算法在反作弊应用