一个关于破坏服务器的黑客游戏的后端是如何创建的

一个关于破坏服务器的黑客游戏的后端是如何创建的
我们继续告诉你我们破坏服务器的激光任务是如何安排的。 从上一个开始 关于解决任务的文章.

游戏后端总共有 6 个架构单元,我们将在本文中进行分析:

  1. 负责游戏机制的游戏实体后端
  2. VPS 上的后端和站点数据交换总线
  3. 从后端请求(游戏元素)到 Arduino 和现场硬件的转换器
  4. Arduino负责控制继电器,接收翻译器的命令并进行实际工作
  5. 实际装置:风扇、花环、落地灯等。
  6. 前端 - Falcon 网站本身,玩家可以从中控制设备

让我们逐一逐一进行介绍。

游戏实体后端

后端是作为 Spring Boot 应用程序实现的:它有几个休息控制器、一个 Websocket 端点和具有游戏逻辑的服务。

只有三个控制器:

  • 威震天。 当前的威震天页面是通过 GET 请求发送的:打开电源之前和之后。 激光通过 POST 请求发射。
  • 映射波形符页面,以便通过页面名称提供它们。 Tilde 生成的导出页面不包含原始名称,而是包含内部 ID 和合规性信息。
  • 验证码控制器为伪高负载服务器验证码提供服务。

Websocket 端点用于控制小工具:灯、花环和字母。 它被选择向所有玩家同步显示设备的当前状态:是否打开或关闭、是否处于活动状态、当前在墙上点亮的字母是什么颜色。 为了使打开激光的任务变得更加困难,我们使用相同的登录名和密码 admin/admin 添加了对花环和激光的授权。

玩家可以通过打开花环并用激光重复相同的操作来测试它。

我们选择如此简单的登录密码对是为了不让玩家进行不必要的选择。

为了使任务变得更有趣,来自 mongodb 的对象 ID 被用作房间中的设备标识符。

ObjectId 包含一个时间戳:两个随机值,其中一个是根据设备标识符获取的,第二个是根据生成它的进程的 pid 和计数器值获取的。 我想让标识符定期生成并使用不同的 pid 进程,但使用通用计数器,这样激光设备标识符的选择会更有趣。 然而,最终,每个人​​都从仅计数器值不同的标识符开始。 这可能使该步骤过于简单,不需要分析 objectId 结构。

后端请求的翻译器

Python脚本,他致力于计时器并将其从游戏抽象转化为物理模型。 例如“打开落地灯”→“打开继电器N2”。

该脚本连接到 RabbitMQ 队列并将请求从队列传输到 Arduino。 它还实现了并行灯开关的逻辑:与一些设备一起,它们上面的灯被打开,例如,当威震天最初供电时,它被舞台灯照亮。 整个场景的摄影灯光设计是一个单独的故事,讲述了我们的项目联合制片人和制作设计师 Ilya Serov 的伟大工作,我们将在另一篇文章中讲述它。

翻译人员还负责使用计时器启动碎纸机并将图像传输到电视的逻辑:启动碎纸机的计时器、尖叫的水豚、游戏结束时的广告。

生成威震天令牌的逻辑是如何构建的

试拍

每 25 秒生成一个新令牌,可用于以 10/10 功率打开激光器 255 秒。 链接到 带有威震天代码的 github.

然后激光器冷却 1 分钟 - 在此期间它不可用并且不接受新的射击请求。

这种力量不足以烧断绳子,但任何玩家都可以发射威震天并看到激光束的作用。

MD5哈希算法用于生成令牌。 计划成功了 MD5来自MD5+计数器+秘密 对于战斗令牌,对于测试令牌没有秘密。

MD5 是对我们的后台 Pavel 所做的一个商业项目的引用。 就在几年前这个项目使用了MD5,当他告诉项目架构师这是一个过时的加密算法时,他们就从MD5开始使用MD5。 由于我们决定做一个最菜鸟的项目,他记住了一切并决定做一个小参考。

战斗射击

威震天的战斗模式为 100 瓦 3% 激光功率。 这足以在 2 分钟内烧断支撑重物的绳子,破坏水族箱并使服务器充满水。

我们在项目的Github上留下了一些提示:即代币生成代码,从中可以了解到测试代币和战斗代币是根据同一个计数器指标生成的。 在战斗令牌的情况下,除了计数器值之外,还使用盐,除了最后两个字符之外,它几乎完全留在这个要点的更改历史中。

知道了这些数据,就可以对盐的最后 2 个符号进行排序,并实际上发现使用了来自 Lost 的数字(转换为十六进制系统)。

然后,玩家必须捕获计数器值(通过分析测试令牌)并使用下一个计数器值和上一步选择的盐生成战斗令牌。

计数器会随着每次测试射击且每 25 秒递增一次。 我们没有在任何地方写过这个,这应该是一个小游戏惊喜。

验证码交互服务

在游戏世界中,这与必须加载的验证码相同,才能打开风扇并通过提示打开活动挂图。 摄像头旁边是一台带有负载监控功能的笔记本电脑。

一个关于破坏服务器的黑客游戏的后端是如何创建的

服务 我计算了在监控中显示的当前负载:温度和CPU风扇。 指标被传输到时基数据库并由 grafana 绘制。

如果在最后 5 秒内有超过 50 个显示验证码的请求,则负载会增加固定 + 随机步数。 经计算,两分钟内即可达到100%负载。

事实上,服务中的逻辑比最终游戏中显示的逻辑更多:我们放置显示器的方式使得只有 CPU 风扇的旋转可见。

在任务开始时,他们想让 Grafan 可以通过 Falcon 网站访问。 但它还包含后端应用程序报告中的 springboot 指标,我们没有时间清除这些指标,因此我们决定阻止对其进行访问。 确实如此——即使在任务开始时,一些玩家就猜测该应用程序是用 springboot 框架编写的,甚至挖出了一些服务的名称。

主机和数据总线

用于将信息从后端传输到站点(运行 RabbitMQ 的 VPS 服务器)的工具。

后端和数据总线保持开启 我们的VPS。 它的性能可与您在屏幕上看到的计算机相媲美:具有 2 GB RAM 的 XNUMX 核 VPS。 由于峰值负载计划仅持续几天,因此按资源收取费用 - 这就是我们计划在短时间内加载 VPS 的客户所做的事情。 后来发现负荷比我们预期的要高,固定电费会更有利可图。 如果您执行任务,请选择线路关税 涡轮.

为了保护服务器免受 DDoSa 攻击,我们使用了 Cloudflare。

值得一提的是,VPS 经受住了一切考验。

Arduino负责控制继电器,接收翻译器的命令并进行实际工作

这更多是下一篇关于该项目的硬件部分的文章的主题:后端只是发送请求以打开特定的继电器。 碰巧后端知道几乎所有实体,并且来自它的请求看起来像“打开这个实体”。 我们这样做是为了对网站进行早期测试(我们还没有组装所有的 Arduino 和继电器),最后我们就这样留下了一切。

前端

我们很快就在波浪号上创建了该网站,花了一个工作日,为我们节省了 30 万美元的预算。

最初,我们想到简单地导出网站并添加我们缺少的逻辑,但我们遇到了禁止我们这样做的使用条款。

我们还没有准备好违反许可证,因此有两种选择:自己实现所有内容或直接联系 Tilda,讨论该项目并请求更改代码的许可。

我们选择了第二种,他们不仅半途而废,还给了我们一年的免费商业账户,对此我们非常感谢。 向他们展示索科尔的网站设计非常尴尬。

因此,我们将 js 逻辑附加到前端,用于向基本设备发送请求,并稍微更改了用于打开和关闭游戏元素的按钮的样式。

Дизайнсайта

搜索的历史值得单独写一章。

我们想要创建的不仅仅是一个老式的网站,而是一个违反所有基本设计规则的绝对恶心的网站。 同时,保持可信度也很重要:它不能破坏耳鼻喉科的故事,不能表现出作者的自命不凡,而且玩家必须相信这样的网站可以存在,甚至可以带来客户。 他带来了! 在比赛进行期间,我们两次被联系来创建网站。

起初,我自己进行了设计,尝试加入更多的 gif 和闪亮的元素。 但与我结婚 10 年的设计师丈夫回头一看,认为它“太好了”。 要打破设计规则,您需要了解它们。

一个关于破坏服务器的黑客游戏的后端是如何创建的

有几种颜色组合会引起持久的厌恶感:同样丰富的绿色和红色、灰色和粉色、蓝色和棕色。 最后,我们选择了红色和绿色的组合作为基色,添加了一只猫的动图,并从库存照片中选择了 3-4 张索科洛夫本人的照片。 我的要求只有几个:一个中年男子,穿着大了几号的不合身西装,摆出“专业影楼拍照”的姿势。 在测试中,他们向朋友展示了它并询问“你喜欢它吗?”

在设计开发过程中,我丈夫每半小时就得躺下一次;直升机开始飞行。 Pasha 在完成前端时试图打开大部分屏幕的开发者控制台 - 以保护他的眼睛。

实际设备

风扇和灯通过固态继电器安装,这样它们就不会立即以全功率打开,这样功率就会在监控的同时增加。

但我们将在下一篇文章中讨论这个问题,关于游戏的硬件部分和网站的实际构建。

敬请关注!

关于破坏服务器任务的其他文章

一个关于破坏服务器的黑客游戏的后端是如何创建的

来源: habr.com

添加评论