安全软件:如何确保来电者是真实的?

信息安全 验证 服务器 软件 客户 api
2021-09-03 00:36:34

对于多人(竞技)游戏,经常存在需要检测非法玩家以便拒绝为他们服务的问题。另一方面,合法玩家当然应该被允许访问服务。

这些非法玩家是通过一种或另一种方式模拟的,但我想重点关注何时通过使用第 3 方软件进行模拟,该软件使用 1 方 API 来查询或发送信息到中央服务器。

我想了解必须如何设计此 API,以便欺诈性(第 3 方)软件无法假装它是已部署给最终用户的合法(第 1 方)软件。

客户端-服务器交互

需要明确的是,第 3 方软件是由恶意用户获取的,其中第 3 方软件已使用与服务器通信的 API 进行编译。由于 API 部署给合法用户,恶意软件的开发人员只需对该 API 进行逆向工程(可能通过去混淆)并使用它。

有没有办法让这个 API 实现一些安全协议,让非法用户根本无法访问服务器?

我曾考虑要求将一些密码发送到服务器以验证调用者,但我看不出我们如何区分真实用户和虚假用户。

2个回答

基本上,你不能...

客户端的任何内容都需要被视为公开的。当然,您可以尝试使用各种技术来混淆 API,但总有一种方法可以对其进行逆向工程并构建您自己的机器人 API。您需要考虑到黑客可以控制客户端的所有内容。

你能保护什么?

您唯一可以保护的是您的服务器。因此,如果你想控制你的玩家能做什么或不能做什么,你必须在服务器端验证他们的每一个动作。服务器必须是事实的来源。此时,如果服务器可以检测到任何无效操作,攻击者仍然可以构建“无效”客户端,但该客户端唯一能做的就是有效操作。所以,这很容易对吧?

好吧,没那么多。尝试在服务器端验证所有内容会产生许多问题。许多与游戏运行的流畅程度有关,但您必须弄清楚如何包括网络问题,例如用户滞后。例如,如果你在保护方面走极端,它会变成这样:

  • 客户端向服务器发送动作命令
  • 服务器执行动作(如果有效)并将结果发送给客户端
  • 客户端只是显示服务器告诉他们显示的结果。

执行并击败任何无效操作非常简单,但它完全破坏了网络不佳的任何人的用户体验。当用户按下一个键向前移动时,他期望立即向前移动。由于每个动作都会往返于服务器端,因此滞后的用户每次都会遇到缓慢的动作。

你能做什么?

最好的想法是有一个混合系统。您在服务器端进行验证,但是一旦发生,您仍然会在客户端“执行”操作。这样,用户会认为他们的动作发生在他们执行的那一刻,而实际上他们可能会在几毫秒或几秒钟后完成。您基本上是在客户端进行模拟,如果服务器向您确认一切正常,则保留该模拟。在服务器认为模拟错误的情况下,这些动作被“逆转”。

让这种系统正确是一种痛苦,但它是唯一能提供良好用户体验同时还能完全击败无效操作的东西。

更简单的方法:记录

因为,真正控制服务器端的一切可能会很痛苦,因为当需要重写历史时很难决定要做什么,一个更简单的方法是进行日志记录。你让客户做他想做的几乎任何事情,他是事实的来源,但是,在服务器端,你记录每一个动作并检测每一个无效的动作。无效的操作仍然会发生,但如果客户执行的次数过多,您可以放心地假设他不是有效的客户并 - 最终 - 禁止他。

关于混淆:努力 VS 收获

在客户端混淆东西会使攻击者更难创建机器人程序,因此它会阻止许多想成为攻击者的人,因此您将不得不处理一小部分有问题的玩家。

我不是这种技术的专家,但它类似于:

  • 更改所有变量/方法名称
  • 插入无用代码迷惑逆向工程师
  • 加密代码(但密码仍然隐藏在代码中的某处......)

真的只是让尝试对游戏客户端进行逆向工程变得更加痛苦......

这是在线竞技游戏必须面对的最大问题之一。不幸的是,没有简单的解决方案。检测机器人或恶意用户的最有效方法是通过行为分析。