Ночь накрыла раскаленные крыши петербургских пятиэтажек тяжелым влажным смогом, не принеся ни капли спасительной прохлады. В тесной, заставленной коробками из-под комплектующих комнате Алексея стояла липкая, невыносимая духота. Во мраке светился лишь пузатый ЭЛТ-монитор, заливая лицо сисопа мертвенной синевой. Под столом надрывно и монотонно гудел вентилятор старенького блока питания, перемалывая раскаленную пыль. Этот звук смешивался с едким запахом плавящейся канифоли, остывшего в кружке дешевого растворимого кофе и застарелого сигаретного дыма, намертво въевшегося в пожелтевшие обои.
Алексей ссутулился перед мерцающим экраном. Потная хлопковая футболка прилипла к лопаткам, но он этого не замечал. Пальцы с пожелтевшими от крепкого табака ногтями замерли над тугими клавишами механической клавиатуры. На выпуклом стекле дисплея снизу вверх бежали бесконечные, скучные строки утилиты мониторинга. Он вчитывался в логи, словно древний обезумевший жрец во внутренности жертвенного животного, пытаясь отыскать изъян в ткани цифрового мироздания.
И он его нашел.
Пальцы Алексея замерли в миллиметре от истертых пластиковых колпачков клавиатуры. Тяжелый, влажный воздух комнаты словно загустел, сдавив барабанные перепонки. На экране утилиты мониторинга ядовито-зеленым фосфором пульсировала свежая запись. Локальная база сообщений зафиксировала обновление. Адрес отправителя: 2:5030/77.777. Тот самый заблокированный поинт. Чужак снова топтал цифровые коридоры его станции.
Алексей с силой ударил по жесткой клавише «Esc». Механический щелчок ALPS-переключателя прозвучал в тишине подобно пистолетному выстрелу. Строки утилиты мгновенно схлопнулись, уступив место привычной синеве двух панелей файлового менеджера Norton Commander. Нормальный цикл доставки почты в сети Фидонет подчинялся незыблемой, вылизанной годами железной логике. Сначала оживает внешний модем, снимает трубку, принимает несущую частоту. Затем мейлер — почтовая программа — фиксирует аппаратное соединение, обменивается паролями и стягивает сжатый архив в локальную приемную директорию.
Сисоп бросил тяжелый взгляд на громоздкий черный корпус модема US Robotics Courier, лежащий на системном блоке. Ряд красных светодиодов на его лицевой панели оставался мертвенно-темным. Горели только крайние индикаторы питания и готовности терминала. Лампы «CD» — наличие несущей, и «OH» — поднятая трубка, даже не мерцали. Индикаторы приема и передачи данных «RD» и «SD» были стерильно черными. Устройство молчало. Громоздкие реле внутри корпуса не щелкали, динамик не издавал характерного цифрового шипения установки коннекта.
Чтобы исключить аппаратный сбой светодиодов, Алексей протянул руку и сорвал с рычага трубку стационарного дискового телефона, подключенного параллельно модему. В ухо ударил ровный, густой гудок городской АТС. Линия была абсолютно свободна. Никакого коннекта не существовало в природе.
Алексей вернул руки на клавиатуру, нажал «F9», открывая верхнее выпадающее меню Нортона, и перешел в каталог мейлера. Синяя полоска курсора легла на файл системного журнала «mailers.log». Клавиша «F3» развернула текст на весь экран. Глаза привычно выхватывали нужные таймстампы, игнорируя фоновый мусор. Вот вечерний звонок от двадцать четвертой ноды. Рукопожатие протокола EMSI, старт передачи по Zmodem, успешный прием трехсот килобайт запакованной почты. Время окончания сессии: 23:14.
Алексей опустил взгляд в правый нижний угол экрана. Системные часы показывали 02:47. Три с половиной часа абсолютной, задокументированной тишины. Мейлер не принял ни единого байта из внешнего мира. Входящий канал оставался девственно чист. Сисоп нажал комбинацию «Alt-F1», переключая левую панель на директорию «Inbound», куда складывались сырые, нераспакованные пакеты. Каталог пустовал. Система не принимала файлов.
Дальше по логике алгоритма в дело вступает тоссер. Почтовый сортировщик подхватывает архив, распаковывает его в оперативной памяти, считывает заголовки, проверяет права доступа и раскидывает письма по базам данных. Если тоссер просыпается, он маниакально протоколирует каждый свой шаг, оставляя за собой километровые текстовые следы.
Пальцы отбили короткую команду «cd \fido\tosser». Алексей перешел в каталог сортировщика и открыл «tossers.log». Экран показал пустоту. Никаких записей о распаковке, никаких ошибок маршрутизации. Тоссер мирно спал, не загружаясь в память. Более того, адрес 2:5030/77.777 находился в жестком бане. Сисоп нажал «F4» на файле конфигурации «setup.cfg», пролистал до раздела маршрутизации и уставился на нужную строку. Перед адресом чужака стоял знак точки с запятой, намертво комментирующий правило, а рядом был прописан параметр «Kill». Программный барьер обязан был отбросить любые попытки связи на уровне списков доступа. Тоссер физически не мог положить письмо в базу — код так не работает.
Однако в директории локальной почты лежал готовый файл сообщения. Алексей вышел из Нортона в черное окно командной строки DOS. Замигал одинокий белый курсор. Сисоп вбил команду «chkdsk C:» и нажал ввод. Система шуршала головками винчестера, сканируя структуру файловой системы. На экран поползли строки отчета.
Ошибок не нашлось. FAT-цепочки, связывающие разрозненные кластеры диска в единые файлы, были идеально согласованы. Потерянных или перекрестных секторов не существовало. Операционная система считала свежий файл абсолютно легальным. Его размер до последнего байта соответствовал норме, а время создания совпадало с текущей минутой. Письмо материализовалось на жестком диске в обход любых сетевых и почтовых алгоритмов. Оно не спускалось по гудящему медному кабелю с АТС. Не копировалось в буферы прерываний модема. Возникло из ниоткуда. Будто кто-то просунул бесплотную руку сквозь металлический кожух системного блока и напрямую намагнитил нули и единицы прямо на вращающийся с бешеным воем блин винчестера.
Алексей передернул плечами. Холодный пот потек по лопаткам, заставляя влажную футболку противно липнуть к коже. Он вернулся в файловый менеджер, навел курсор на невозможную аномалию и нажал «F3», а затем — «F4». Включился шестнадцатеричный режим просмотра. Синий экран разбился на две плотные колонки: слева — ряды шестнадцатеричных кодов машинного языка, справа — их текстовое ASCII-представление.
Вглядываясь в эту цифровую матрицу, сисоп искал скрытые маркеры, следы вирусного кода или переполнения буфера. Стандартный служебный заголовок структуры FTS-0001 выглядел идеально. Алексей отсчитывал смещения байтов. Тридцать шесть байт имени отправителя. Тридцать шесть — получателя. Семьдесят два байта темы. Поля даты, атрибутов, номеров сетей — всё было на своих местах. Текст сообщения перемежался служебными символами.
Алексей нажал «F7», вызывая окно поиска, и вбил комбинацию «^AVia». Это главный транзитный маркер Фидонета. Скрытый системный штемпель. Любая станция, пересылающая пакет дальше по цепочке, обязана прикрепить свой адрес и точное время прохождения в конец сообщения. Это цифровые паспорта маршрутизации.
Поиск выдал сухое «Not found».
Блок маршрутизации зиял девственной пустотой. Письмо нигде не путешествовало. Оно не имело истории передачи. Оно обращалось напрямую к локальной базе Алексея, полностью игнорируя саму концепцию сетевой архитектуры. Чужак не взламывал внешнюю защиту и не обходил баны. Он не использовал уязвимости софта. Илья вернулся, и его возвращение ломало фундаментальные законы земной информатики.
Очки сисопа медленно сползли на кончик мокрого от пота носа. Он не стал их поправлять. Липкий, первобытный ужас сковал внутренности, замораживая дыхание. Больше всего в жизни Алексей боялся потерять абсолютный контроль над собственным железом. Над этой машиной, которую он собирал по винтику, паял ночами, кропотливо распределял прерывания и вылизывал каждый конфигурационный файл. Здесь, внутри этого бежевого металлического ящика, он был полновластным творцом. А сейчас этот божественный контроль уплывал сквозь дрожащие пальцы. Что-то хозяйничало на его диске, плевав на пароли и права доступа. Присутствие чужака внутри машины ощущалось как физическое вторжение.
Страх мгновенно переплавился в острую, слепящую профессиональную ярость. Алексей со свистом процедил сквозь зубы отборное ругательство. Они с Денисом уже проверяли линию, маршруты и локальные листы. Обычные меры защиты не работали там, где не было нормального модемного входа. Ему нужно было доказать факт прямого физического вмешательства. Поймать этого цифрового призрака за руку, задокументировать нарушение структуры и вытащить тварь на свет.
— Ладно, умник, — хрипло прошептал Алексей. Звук голоса прозвучал сухо и чужеродно в гудящей духоте комнаты. — Ты обходишь поллы. Смеешься над маршрутными логами. Посмотрим, как ты пройдешь карантин.
Он ударил по клавишам, переходя в корневой каталог диска. Нажатием функциональной клавиши сисоп создал новую директорию, спрятав ее глубоко в дереве папок DOS, вдали от публичных эхоконференций. Посимвольно вбил имя мертвой зоны: «QUARANTINE».
Затем Алексей открыл конфигурационные файлы тоссера и прописал жесткую маршрутизацию. Свежая директория получила изолированный статус. Теперь любой пакет с конкретной служебной связкой идентификаторов должен перенаправляться только туда. Если чужак использует обычные утилиты, программа споткнется о нестандартный путь и оставит след в системном журнале.
Пальцы замерли над пластиком клавиатуры. В воспаленном мозгу сформировалась радикальная идея. Если программный барьер не сработает, придется применить крайнюю меру — загнать аномалию на отдельный носитель. Создать физически изолированный железный контур. Взять старый носитель, запереть его в пустом металлическом корпусе от сгоревшего модема и подключать только на время проверки, как жертвенный буфер. Если софт бессилен против этого невозможного трафика, спасет только мертвая железная коробка. Но пока требовалось проверить текущую гипотезу.
Чтобы зафиксировать любые изменения, Алексей набросал в текстовом редакторе агрессивный командный файл. Он сканировал состояние таблицы FAT, снимал размеры файлов в корне и вычислял контрольную сумму директории «QUARANTINE». Любая легальная операция записи неизбежно изменит архитектуру кластеров, и проверка поймает разницу состояний до и после вмешательства.
Алексей сохранил конфигурацию и запустил проверку. Черный экран моргнул, пропуская через себя белые строки вычислений. Командный файл отработал чисто. Ловушка взведена.
Сисоп тяжело откинулся на скрипучую спинку кресла, стянул с носа очки и устало потер воспаленные от недосыпа и мерцания ЭЛТ-трубки глаза. Теперь оставалось только бросить приманку.
Он снова придвинулся к столу и запустил низкоуровневый текстовый редактор. Ему нужно было сгенерировать не обычное письмо в публичной ветке вроде «RU.ANEKDOT», где Илья мог просто отмолчаться. Требовался прямой служебный запрос, встроенный в протокол обмена.
Алексей приступил к хирургической правке сырого пакета. Он вручную вбивал шестнадцатеричные коды, формируя фальшивую служебную связку. Вписал несуществующий, но синтаксически идеальный маркер «^AMSGID». Следом прикрепил клудж запроса подтверждения «^AREPLY». Почтовый робот на той стороне, получив этот пакет, не будет спрашивать своего оператора. Базовые алгоритмы Фидонета заставят его автоматически сформировать квитанцию о доставке, привязать к ней ответный идентификатор и выплюнуть обратно.
А локальное правило Алексея подхватит этот маркер и швырнет пакет прямо в изолированную бетонную камеру карантина. Обычный софт уперся бы в этот нестандартный маршрут, оставил ошибку в системном журнале мейлера, и почерк неуловимого хакера отпечатался бы в текстовом отчете. Алексей должен был доказать, что в его железо лезут без ведома операционной системы.
Алексей сохранил изменения и отправил письмо в локальную очередь.
В покоях Высокого мира царила плотная тишина. Тяжелый покой древнего леса нарушался лишь мерным потрескиванием инея на отполированных деревянных боках артефакта. Руна Охлаждения выстужала пространство, покрывая столешницу тонкой коркой льда.
Иллиэль чуть подался вперед. Мягкое зеленоватое свечение экрана легло на тонкие черты лица. Вместо письма от Ольги — его принц втайне ждал каждый вечер — руны сложились в сухой системный запрос. Латинские символы, дроби, цифры. Очередная проверка связи с земным узлом.
Для бессмертного существа, привыкшего к кристальной чистоте магических потоков, сама мысль о скрытых земных ловушках казалась мелкой и бессмысленной. Сухой узор запроса вызвал у принца лишь облегчение. Канал стабилен. Узел землян видит присутствие артефакта. Эта надежная нить между мирами гарантировала: когда Ольга дозвонится до ноды, личные письма дойдут без искажений.
Иллиэль быстро сформировал стандартный пакет-ответ. Короткое подтверждение приема. Мягкое нажатие нужной деревянной клавиши совместилось с легкой мысленной командой.
Заклинание пробудилось в недрах деревянного корпуса. Эфирный конструкт захватил сформированные данные, обволок нули и единицы золотистым коконом и скользнул по пробитому меридиану к узлу Алексея. Расстояние между мирами сжалось до неуловимой доли секунды.
Светящаяся точка материализовалась внутри гудящего системного блока в петербургской квартире. В тесном царстве зеленого текстолита, колючего кремния и окислившейся меди магия казалась пульсирующей аномалией. Эльфийское тепло парило над материнской платой, выхватывая из полумрака бочонки конденсаторов.
Сущность опустилась к широкому серому шлейфу IDE-контроллера. Заскользила вдоль выпуклых жил, следуя за магнитными векторами, и уперлась в массивный металлический панцирь жесткого диска. Физика не стала преградой. Эфир просочился сквозь герметичную крышку.
Внутри корпуса на огромной скорости выли зеркальные блины, рывками дергались считывающие головки. Конструкт ориентировался не на прописанные в конфигах пути, а на смысловую связку самого пакета. Вектор тянул прямиком к кластерам директории QUARANTINE.
Обычный софт споткнулся бы об атрибуты, файловую систему и правила тоссера. Жучок не видел барьеров DOS. Локальное программное ограничение выглядело для магии как грязная лужа на тротуарной плитке.
Светящаяся искра зависла над вращающимся диском. Короткий импульс напрямую намагнитил нужные участки. Данные легли в тело файла, в записи FAT и каталога. Операционная система получила имя, размер, дату и готовую цепочку кластеров в обход любых команд.
Доставив груз, пылинка мигнула и растворилась в фоновом излучении работающего железа.
Алексей не сводил воспаленных глаз с монитора. На выпуклом стекле светились классические пронзительно-синие панели Norton Commander.
Левая половина, отведенная под QUARANTINE, оставалась пустой. Справа привычно громоздился корень диска C:. Сисоп держал потный указательный палец на клавише Enter, циклично обновляя содержимое. Ждал строчку в логе, сбой в контрольном снимке, малейший след стороннего софта.
Гудел вентилятор блока питания, тонко свистел винчестер, ритмично клацал пластик клавиатуры.
— Покажись, — шептал Алексей.
Очередной глухой удар по клавише.
Нижняя строка дернулась. На идеальной синеве пустого каталога проступили белые символы.
00000001.MSG
Палец замер над клавиатурой. Желтый прямоугольник курсора подсветил появившийся файл, выведя внизу параметры. Размер: 214 байт. Время создания: 02:47:15. Цифры системных часов в правом верхнем углу монитора показывали ту же секунду.
Алексей вдавил Ctrl+O. Синие панели исчезли, уступив место черной пустоте командной строки.
C:\FIDO\QUARANTINE>
Команда dir выплюнула серые строчки вывода. DOS бесстрастно сообщал: файл существует, занимает один кластер, атрибуты в норме. Запущенная следом утилита chkdsk прочесала таблицу размещения файлов. Ошибок нет. Цепочка кластеров прописана корректно, перекрестных ссылок не обнаружено. Жесткий диск выделил физическое место и сохранил двести четырнадцать байт.
Алексей вернул панели командера. Клавиша Tab перебросила курсор вправо. F3 открыла файл mailer.log, комбинация Ctrl+End утянула текст в самый низ.
Последняя запись фиксировала отправку собственного пакета-приманки. Ниже зияла пустота. Система не регистрировала входящих звонков. Модем не обменивался рукопожатием, не принимал блоки данных. Телефонная линия молчала.
Сисоп закрыл лог мейлера и открыл tosser.log. Тоссер спал. Процесс не стартовал, не сканировал входящие директории, не перекладывал письмо по заданному правилу. Данные миновали все уровни защиты, провалившись сквозь архитектуру операционной системы.
Тогда Алексей открыл результаты своего контрольного BAT-файла. До обработки: каталог пуст. После обработки: файл есть. Контрольная сумма конфига не изменилась. Время последней записи `fastecho.cfg` прежнее. Снимок корня базы совпадает. Расхождение было только в одном месте — внутри `QUARANTINE`, там, куда обычный путь не вел.
Он вставил в дисковод чистую дискету с заклеенным окошком защиты от записи, снял с нее наклейку, передумал, достал другую — рабочую, без защиты, — и скопировал туда логи, вывод `dir` и сам файл. Потом снова заклеил окошко уже на копии и положил дискету отдельно, под тяжелую кружку с остывшим чаем. Для верности он записал рядом время по настенным часам и системным часам DOS: расхождение было меньше минуты, списать появление файла на сбитую дату уже не получалось. Денису он покажет не эмоции, а набор фактов: время, каталог, FAT, отсутствие звонка, отсутствие тоссера.
Данные просто оказались внутри директории. Служебные записи FAT и каталога были обновлены так аккуратно, что DOS признавал файл своим. Но ни один привычный инструмент Алексея не видел пути, которым он туда попал. Это было хуже ошибки: ошибку можно повторить.
Сжав трясущиеся руки в кулаки, Алексей вместе с креслом отъехал от стола. От гудящего бежевого системного блока теперь веяло потусторонней, непредсказуемой угрозой. Он рывком сбросил текущий режим ожидания мейлера, освобождая линию, и протянул слабеющую, покрытую липким потом руку к тяжелому красному аппарату стационарного дискового телефона, стоявшему на краю заваленного бумагами стола.
Пальцы совершенно не слушались, жалко соскальзывая с пластиковых отверстий диска. Он с мучительным трудом, сбиваясь, набрал домашний номер Дениса. Прижал холодную, жесткую пластиковую трубку к вспотевшему уху, до боли вдавливая её в кожу.
Длинные гудки АТС тянулись в ночной петербургской тишине слишком долго. Наконец, после пятого гудка, на том конце раздался щелчок снятой трубки, и сонный голос Дениса хрипло выдавил:
— Алло... кто там?
— Файл появился в карантине, — сказал Алексей. Голос у него был пустой, деревянный. — Без коннекта. Без открытия директории. Без записи в логах. Просто появился.
На том конце провода сон исчез мгновенно. Послышался глухой удар, будто Денис сел слишком резко и задел тумбочку.
— Ничего не трогай, — произнес он уже совсем другим тоном. — Даже курсор не двигай. Я сейчас приду.
Алексей остался сидеть с трубкой у уха, слушая ровный гудок отбоя. В комнате снова было слышно только вентилятор, жесткий диск и собственное дыхание, слишком громкое для человека, который еще час назад верил, что контролирует свою ноду.