【问题标题】:Cheat Prevention by Code Generation通过代码生成防止作弊
【发布时间】:2015-04-06 15:53:23
【问题描述】:

这种反作弊技术是否适用于使用私人服务器(公开未知的可执行文件)的多人游戏:

当客户端启动游戏时,它会每天自动更新(使用启动器)。服务器也会自行更新。 除非有真正的补丁,否则更新仅包括游戏对象内存布局、网络代码和着色器的更改。 这是使用自动生成和随机化 (C++) 类的自动化系统完成的。 也许它还可以将假对象添加到层次结构中,以使识别对象更加困难。

通过这种方式,我希望以比破解者更快的速度更新游戏,并将逆向工程、更新和发布/更新新作弊。

这会奏效吗?或者黑客能以某种方式绕过这种机制吗? 他们会每天做这项工作,还是可以在某个时候将其自动化? 我可以做些什么来改进这个系统?

从长远来看,随机化内存布局似乎没有帮助,因为通过在可执行文件中执行函数调用并从该代码中提取指针偏移量,可以或多或少地轻松提取布局。 所以为了有效地防止这种情况,调用结构和代码本身也需要随机化。

有没有好的方法来做到这一点?这对自动破解有效吗?

【问题讨论】:

  • 想想这对玩家来说有多糟糕,如果完全没有理由(没有补丁)你强制更新并延迟玩家体验你的游戏
  • @BeyelerStudios 如果延迟只有几秒钟,您永远不会注意到它;我玩过没有这种保护的游戏(据我所知),并且已经有很多延迟加载资产,为您的精确驱动程序集编译着色器,操作系统等。
  • 任何更改都是潜在的问题来源(性能问题和错误)。每个补丁都需要一个完整的 QA 周期。你有资源每天验证整个游戏吗?
  • @ecreif:如果更新很小,那么破解者很快就会找出变化。如果它很大,那么连接速度较慢的人(比如我的)或每月下载限制的人(比如我的)会很快放弃尝试玩游戏。
  • @ecreif:您可能希望如此,但事实并非如此。可执行文件是结构化的,“纯机器代码”很容易转换为可读形式。使用反汇编程序和 diff 工具的几分钟将向您准确显示更改的内容。如果更改很小,则无需花费太多时间就可以弄清楚如何修改作弊以适应它们。如果它们很大,那么下载量也很大。

标签: c++ multiplayer anti-cheat cheat-engine


【解决方案1】:

客户端技术军备竞赛是完全错误的做法。你将永远比一群有太多空闲时间的孩子更好或更快。您无法与一大群没有成本(除了不做功课)的攻击者竞争,而您的行为会花费您的时间和金钱。这是一场你将输掉的比赛,无论是在经济上还是最终结果上。

人们可以作弊有两种方式:

  1. 获取其他人没有的信息(例如穿墙查看)
  2. 自动化其他人必须手动完成的游戏玩法(“耕种”)

有两种方法可以阻止人们这样做:

  1. 停止向客户提供该信息。将其保存在服务器上。
  2. 停止让您的游戏中不好玩的部分。人们只会把无聊的部分自动化,他们不会玩无聊的游戏。让它变得有趣,没有人会浪费时间尝试自动化它。如果您的游戏出现自动化,请认真思考如何改进您的游戏,而不是在技术上与机器人作战。

记住那句老话:“客户在敌人手中。”

【讨论】:

  • 一切:完全确认!
  • @ecreif 没错。我不觉得 nvoigt 不了解(许多)在线游戏中作弊的本质。您可以删除所有枯燥的部分并保留在服务器上的所有内容旁边,但仍然有作弊的能力/目的。
  • @ecreif 我确实想知道您如何相信自己能够以一种不会导致自动攻击的方式自动化您的更改。
  • @ecreif 我完全理解射手作弊的本质。但是好的秘籍会附加到您的显卡驱动程序并分析输出多边形,因此您在代码中所做的任何事情都是无用的。就我个人而言,我玩过的最好的在线射击游戏都受到了部落的严格监控。如果可以安装您的服务器,以便组可以拥有自己的监管,那么一切都很好。
  • 因为随着时间的推移,如果您不手动操作,“随机”将变得“显而易见”。如果他破解了他的游戏并且没有得到任何进一步的更新怎么办。游戏还能正常运行,还是您正在检查它是否已更新?你在检查什么?如果他伪造了那个,所以你认为它已经更新了怎么办?如果您在玩游戏然后推出更新怎么办 - 是否有一半的玩家被踢出并且必须进行更新,或者是否存在允许两组更改的特赦期?
【解决方案2】:

我不知道这样的系统是否能成功避免作弊,但我会担心生产和维护这样的系统。比如你说

这是使用自动生成和自动生成的系统完成的 随机化(C++)类。也许它也可以在 层次结构使识别对象更难。

  • 随机化一个类是什么意思?这绝非小事。
  • 最终会发现假对象(死代码)

无论如何,我怀疑您是否能够对代码的关键部分执行某种有效的混淆,而不会出现严重的缺陷,例如性能下降或完全错误的计算(例如浮点演算)。如果您有两种不同的机制来计算相同的值,那么您最终会在同一组输入中得到不同的结果。

【讨论】:

  • 给你一个提示。我使用 google 协议缓冲区来描述通过网络发送的某些游戏对象和消息。我可以使用反射api自动更改描述添加随机数据并且仍然有一个有效的接口
  • @ecreif 如果您混淆发送到客户端的数据,那么就不会生成 C++ 类,对吗?或者我遗漏了您提到的反射 API 的一些内容?
  • 没有。 Google 协议缓冲区生成用于序列化的 C++ 类。所以我只是在实际描述和类生成器之间放置了一个随机器。这将为服务器和客户端生成新代码
  • @ecreif 我的错;但这不会对使用接收到的数据的其余代码执行任何类型的混淆;所以这实际上是没有用的,除非你也隐藏你对数据所做的事情。
  • 我想将生成的类不仅用于网络代码,还用于我所有游戏对象的数据表示。所以理论上数据的使用也是模糊的。但是当然有代码并没有真正改变。我想知道是否有技术来混淆它。也许改变 .cpp 链接的顺序?从真正的黑客那里听到弱点所在的经验真的很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2023-03-17
  • 2012-03-16
  • 1970-01-01
  • 2013-02-08
  • 2022-08-18
  • 1970-01-01
相关资源
最近更新 更多