基本上,你不能...
客户端的任何内容都需要被视为公开的。当然,您可以尝试使用各种技术来混淆 API,但总有一种方法可以对其进行逆向工程并构建您自己的机器人 API。您需要考虑到黑客可以控制客户端的所有内容。
你能保护什么?
您唯一可以保护的是您的服务器。因此,如果你想控制你的玩家能做什么或不能做什么,你必须在服务器端验证他们的每一个动作。服务器必须是事实的来源。此时,如果服务器可以检测到任何无效操作,攻击者仍然可以构建“无效”客户端,但该客户端唯一能做的就是有效操作。所以,这很容易对吧?
好吧,没那么多。尝试在服务器端验证所有内容会产生许多问题。许多与游戏运行的流畅程度有关,但您必须弄清楚如何包括网络问题,例如用户滞后。例如,如果你在保护方面走极端,它会变成这样:
- 客户端向服务器发送动作命令
- 服务器执行动作(如果有效)并将结果发送给客户端
- 客户端只是显示服务器告诉他们显示的结果。
执行并击败任何无效操作非常简单,但它完全破坏了网络不佳的任何人的用户体验。当用户按下一个键向前移动时,他期望立即向前移动。由于每个动作都会往返于服务器端,因此滞后的用户每次都会遇到缓慢的动作。
你能做什么?
最好的想法是有一个混合系统。您在服务器端进行验证,但是一旦发生,您仍然会在客户端“执行”操作。这样,用户会认为他们的动作发生在他们执行的那一刻,而实际上他们可能会在几毫秒或几秒钟后完成。您基本上是在客户端进行模拟,如果服务器向您确认一切正常,则保留该模拟。在服务器认为模拟错误的情况下,这些动作被“逆转”。
让这种系统正确是一种痛苦,但它是唯一能提供良好用户体验同时还能完全击败无效操作的东西。
更简单的方法:记录
因为,真正控制服务器端的一切可能会很痛苦,因为当需要重写历史时很难决定要做什么,一个更简单的方法是进行日志记录。你让客户做他想做的几乎任何事情,他是事实的来源,但是,在服务器端,你记录每一个动作并检测每一个无效的动作。无效的操作仍然会发生,但如果客户执行的次数过多,您可以放心地假设他不是有效的客户并 - 最终 - 禁止他。
关于混淆:努力 VS 收获
在客户端混淆东西会使攻击者更难创建机器人程序,因此它会阻止许多想成为攻击者的人,因此您将不得不处理一小部分有问题的玩家。
我不是这种技术的专家,但它类似于:
- 更改所有变量/方法名称
- 插入无用代码迷惑逆向工程师
- 加密代码(但密码仍然隐藏在代码中的某处......)
真的只是让尝试对游戏客户端进行逆向工程变得更加痛苦......