Как запустить Doom через DNS-записи и зачем это вообще нужно
Репозиторий давно не обновлялся
Последнее обновление было 6 месяцев назад.
Когда кажется, что мы видели уже все способы запустить Doom — на тестах на беременность, внутри осциллографов или в меню принтеров — появляется проект, который заставляет вспомнить основы сетевых протоколов. Речь о doom-over-dns. Идея здесь балансирует на грани безумия и инженерного изящества: автор решил использовать DNS TXT-записи как облачное хранилище для целой игры.
В чем соль задумки
Обычно DNS (Domain Name System) просто переводит понятные имена сайтов в IP-адреса. Но стандарт позволяет хранить в TXT-записях произвольный текст. Разработчик этого проекта задался вопросом: если Cloudflare позволяет бесплатно создавать тысячи таких записей и кэширует их по всему миру, почему бы не превратить их в распределенную файловую систему?
Технически это выглядит так: берется классический WAD-файл (архив с ресурсами игры), сжимается и нарезается на мелкие куски. Каждый кусок упаковывается в отдельную TXT-запись. При запуске скрипт на PowerShell просто опрашивает DNS-сервер, собирает эти кусочки прямо в оперативной памяти и «скармливает» их игровому движку.
Как это устроено внутри
Проект состоит из двух частей: загрузчика (Publisher) и самого игрового клиента.
Для реализации пришлось немного «допилить» движок managed-doom. В оригинале он использует Native AOT, который не дружит с динамической загрузкой из памяти. Автор форкнул его, перевел на .NET 8 и научил работать с потоками данных напрямую, минуя жесткий диск.
Интересные детали реализации:
- Никаких файлов на диске. Игра загружается через
Assembly.Load()и работает исключительно в RAM. - Обход лимитов. Бесплатный тариф Cloudflare позволяет хранить около 185 записей в одной зоне. Чтобы уместить целый WAD-файл (а это почти 2000 записей), автор реализовал «страйпинг» — распределение данных по нескольким доменам сразу.
- Устойчивость. Если интернет моргнул во время заливки игры в облако, скрипт умеет возобновлять загрузку по хешам, не перекачивая всё заново.
Инструкция по запуску
Чтобы повторить этот трюк, понадобится Windows 10/11 с поддержкой OpenGL. На MacOS проект не заведется из-за специфики работы с графическими библиотеками.
Сначала нужно подготовить движок и залить данные (если вы хотите использовать свои домены):
# Собираем движок
cd managed-doom
dotnet publish ManagedDoom/ManagedDoom.csproj -c Release -f net8.0 -o publish-out
# Настраиваем доступ к Cloudflare
Import-Module .\TXTRecords\TXTRecords.psm1
Set-CFCredential -ApiToken (Read-Host 'Ваш токен')
# Публикуем игру в DNS
.\Publish-DoomOverDNS.ps1 `
-PublishDir 'managed-doom\publish-out' `
-WadPath 'DOOM1.WAD' `
-Zones @('your-domain.com')
После того как записи разойдутся по серверам (пропагация может занять время), запуск превращается в одну команду:
.\Start-DoomOverDNS.ps1 -PrimaryZone 'your-domain.com'
Если не хочется ждать обновления локального кэша DNS, можно принудительно указать публичный резолвер через параметр -DnsServer '1.1.1.1'.
Практическая ценность или просто фан
Конечно, никто не будет всерьез распространять софт через DNS-записи. Это медленно, неудобно и превращает отладку в кошмар. Однако проект отлично демонстрирует две вещи.
Во-первых, возможности PowerShell 7+ и .NET по работе с памятью и сетевыми запросами. Загрузить DLL напрямую в память и выполнить её — полезный навык для понимания того, как работают современные системы защиты и, наоборот, эксплойты.
Во-вторых, это крутой пример нестандартного использования инфраструктуры. Использование DNS как бесплатного CDN с бесконечным временем жизни кэша — это архитектурный хак, который в других сценариях (например, для хранения очень мелких конфигураций или флагов) может оказаться вполне рабочим.
Кому стоит заглянуть в репозиторий
Проект будет интересен тем, кто копается во внутренностях .NET и хочет посмотреть на живой пример работы с Resolve-DnsName или потоковой обработкой данных. Ну и, конечно, всем любителям Doom, которые коллекционируют самые странные способы запуска этой легендарной игры.
Единственный минус — в текущей версии нет звука. Автор использовал заглушки NullSound, чтобы не усложнять и без того громоздкую передачу данных через текстовые записи. Но, честно говоря, когда играешь в Doom, который прилетает к тебе по кусочкам из TXT-записей, тишина кажется вполне уместной.
Попробовать проект можно здесь: resumex/doom-over-dns.
