К книге
2:5030/Эльф. Нежданный коннектГлава 7. Две секунды на ответ
16%
Глава 7. Две секунды на ответ
7

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

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

Он зафиксировал логическое противоречие, которое не имело права на существование. Система, которую он годами выстраивал, настраивал и оберегал от внешнего хаоса, дала трещину.

За переплетением кабелей, стянутых изолентой, монотонно щелкали реле рабочего US Robotics Sportster. Красные индикаторы на его передней панели хаотично вспыхивали в полумраке. Динамик издал режущий визг хэндшейка, сорвался на аналоговое шипение и замолк — попытка пробиться через помехи изношенной линии петроградской АТС снова провалилась.

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

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

Резко выдохнув, он остановил очередную попытку дозвона, дождался, пока модем отпустит линию, и только потом схватил трубку пыльного телефона. Гудки прозвучали глухо. На том конце провода долго никто не отвечал, потом сонный дежурный АТС буркнул что-то невнятное. Алексей не стал тратить время на приветствия: отрывисто потребовал проверить линию, записал номер заявки на полях распечатки и, услышав обещание «посмотреть в течение дня», бросил трубку. Чуда от АТС он не ждал. Подкрепления тоже. Оставались только логи.

* * *

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

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

Алексей не обернулся. Он лишь ткнул прокуренным пальцем в стекло ЭЛТ-монитора, оставляя на поверхности жирный отпечаток прямо поверх открытого интерфейса системного лог-файла.

— Денис, посмотри на этот бред, — голос сисопа прозвучал сухо, словно горло забило толченым стеклом.

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

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

— Смотри сюда. Вот штатный пакет от пользователя «Ольга», — глухо комментировал сисоп, подсвечивая нужную строку серым инвертированным прямоугольником курсора. — Отправлен сегодня ночью, в три часа четырнадцать минут.

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

— Размер исходящего сообщения — ровно десять килобайт, — произнес он, поправляя съехавшую на переносицу оправу очков. — Тяжелое письмо. Много текста. Давай посмотрим, как именно оно зашло.

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

— Все строго по стандарту, — сисоп провел ногтем по стеклу. — Вот отметка времени: три часа, четырнадцать минут, двенадцать секунд. Входящий звонок. Модем снимает трубку. Вот хендшейк, аппаратное согласование протоколов связи. Успешное соединение на скорости четырнадцать и четыре десятых килобита в секунду. Дальше идет прием файла по протоколу Zmodem. Бинклей фиксирует входящий архив с расширением PKT. Тоссер просыпается, подхватывает архив, распаковывает его и аккуратно кладет длинное сообщение Ольги в локальную эхобазу. Нормальная, физически обоснованная механика доставки. Весь процесс занимает реальное время, оставляет следы в каждом узле тракта.

Алексей с силой ударил по клавише Page Down. Строки лога дернулись вверх, открывая следующий блок протокола.

— А вот ответный пакет от поинта «Илья», — ровным, почти ледяным голосом констатировал сисоп.

Денис прищурился, сверяя временные метки. Его губы беззвучно зашевелились, высчитывая интервал между завершением распаковки файла Ольги и появлением в базе ответа от Ильи. Разница составляла ровно две секунды.

— Невозможно, — резко выдохнул гость. Он выпрямился, убирая руки со спинки кресла. — Две секунды? Леха, ты издеваешься?

— Читай логи, — отрезал Алексей.

Денис снова наклонился к экрану. Его взгляд заметался между окном бинклея и протоколами тоссера.

— На скорости четырнадцать и четыре десятых килобита в секунду, — голос Дениса набирал громкость, в нем прорезались металлические нотки, — только физическая передача пакета такого объема займет больше времени! А этот «Илья» должен был скачать десять килобайт Ольги, прочитать огромный текст, осмыслить написанное, набрать свой ответ на клавиатуре, упаковать файл архиватором, дозвониться до твоей ноды, пройти хендшейк и залить пакет обратно! За две долбанные секунды!

Алексей молча кивнул, подтверждая математическую правоту друга.

— И это еще не все, — сисоп переключил экран обратно на лог звонилки. — Смотри на активность бинклея. Смотри внимательно.

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

— Опять мимо модема, — констатировал он глухо.

— Ни хендшейка, ни служебного мусора, ни обрывов связи, — Алексей с нажимом потер переносицу. — В логах идеальная чистота. Лампочки на передней панели US Robotics даже не моргнули. Линия была физически свободна. Тоссер спал. Он не запускал процесс распаковки транзитного пакета. Очередное письмо просто материализовалось во входящей директории без внешнего линка.

— База приняла его так, будто файл уже лежал локально, — Денис отступил от стола и прошелся по тесной комнате до потертого дивана, поднимая облачко пыли с ковра. — Удаленный пользователь не может раз за разом писать ответы напрямую на твой жесткий диск. Совершенно без телефонного соединения. Это не разовый баг маршрутизации, Леха. Кто-то намеренно генерирует трафик прямо у тебя под носом, ломая саму архитектуру почтового обмена.

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

— Покажи заголовки, — сказал он тише, сдерживая нарастающее напряжение. — Путь, метки времени. Служебку целиком. Я хочу видеть, как это собрано.

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

Гость поправил очки и мрачно, с расстановкой произнес вслух строчку кода:

— «MSGID: 2:5030/77.777 0000002A». И следом — «FMPT 777».

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

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

Денис дернул плечом, скидывая оцепенение, и снова ткнул пальцем в мерцающее стекло.

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

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

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

Письма сменяли друг друга, сливаясь в сплошную ленту чужого диалога. Денис жадно выхватывал куски текста из разных длинных ответов Ильи. В одном абзаце мелькало высокопарное обращение «досточтимая леди», в другом разворачивалось детализированное, пугающе реалистичное описание «мраморных шпилей, пронзающих пепельное небо», в третьем — тяжеловесные, философские пассажи о природе свободы воли. Никакого технического сленга. Никаких привычных фидошных сокращений.

Денис неловко переступил с ноги на ногу, чувствуя, как внутри закипает глухая, иррациональная ревность.

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

Алексей даже не повернул головы. Он сидел неподвижно, уставившись в синее свечение редактора.

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

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

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

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

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

Синяя панель интерфейса дернулась. Список сообщений сместился вниз, уступая место свежим данным. В самом верху материализовался новый заголовок от Ильи, адресованный Ольге. В служебной колонке красовался безупречный MSGID, сгенерированный секунду назад. Тоссер спал. Лампочки на корпусе US Robotics оставались темными. Письмо просто легло напрямую в файлы базы, проигнорировав все узлы обработки, словно его набрали прямо с клавиатуры Алексея.

Розовый пузырь не выдержал внутреннего давления.

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

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

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

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

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

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

— Закрытые структуры, — упрямо продолжил он, глядя прямо в воспаленные глаза сисопа. — Спецслужбы, правительственные лаборатории, кто угодно с неограниченным бюджетом. Кто-то тестирует новую систему тотального перехвата, анализа и подмены трафика прямо на узлах связи. Это может быть троян, криво спрятанная резидентная программа. Она цепляется к ключевым словам в письмах, лепит ответы по словарю, имитирует задержки там, где нужно, и делает вид, что за ней сидит живой человек. А Ольга, по его версии, стала не случайной жертвой, а удобной точкой входа: её письма давали алгоритму живой материал для имитации ответа.

Алексей тяжело покачал головой. Он категорически отвергал красивую, параноидальную, но бездушную теорию друга.

— Ты не читаешь текст, Денис. Ты смотришь только на метки времени и размеры пакетов, — сисоп снова ткнул пальцем в стекло, где сквозь синий фон проступали витиеватые, странные строчки Ильи. — Ни одна утилита не способна оперировать такими понятиями. Утилита не пишет про «вековые древа с серебристой листвой». Машина не станет так долго, путано и искренне объяснять концепцию свободы воли. Бот не способен демонстрировать человеческую эмпатию. Тут кто-то живой. Очень странный, мыслящий совершенно иными категориями, но живой.

Алексей замолчал, его взгляд снова стал холодным, отсекающим лишние эмоции.

— Но в одном ты абсолютно прав. Я признаю технический факт.

Сисоп придвинулся вплотную к столу и положил ладони на потертую клавиатуру.

— Этот Илья, кем бы он ни был — живым человеком, свихнувшимся гением математики или системным призраком — паразитирует на моем почтовом тракте. Он сидит внутри программного обеспечения тоссера. Он полностью игнорирует процесс дозвона.

Алексей решительно свернул окно GoldED. На экране развернулись классические синие панели файлового менеджера Norton Commander. Сисоп перешел в системный каталог с батниками и конфигурационными файлами, нажал Shift+F4 и создал новый пустой текстовый документ.

— Если оно орудует внутри, мы поймаем его за руку и разберем на байты, — процедил Алексей сквозь зубы.

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

Денис мгновенно понял задумку. Он пододвинул шаткую табуретку, сел рядом с креслом Алексея и начал диктовать параметры для захвата данных, работая с сисопом в едином, слаженном ритме двух технарей, вышедших на тропу кибер-охоты. Они настраивали систему тотальной, параноидальной слежки за адресом 2:5030/77.777.

Алексей с каменным лицом прописывал команды пакетного файла: снять текущий снимок директории через `dir` с фиксацией дат и размеров с точностью до байта, скопировать все подозрительные базы в отдельный защищенный каталог, прогнать утилиту побайтового сравнения `fc /b` по контрольным копиям. Каждое прерывание, каждое изменение размера файлов JAM-базы должно было логироваться.

Денис вытащил из пластиковой стопки чистую пятидюймовую дискету, положил черный квадрат прямо перед клавиатурой и прилепил рядом плотную черную наклейку: сначала на носитель запишут эталонный срез, а уже потом закроют прорезь защиты от записи. Алексей кивнул, подтверждая правильность хода. Если неизвестная программа действительно умела менять файлы в базе и подчищать следы, доверять только жесткому диску было самоубийством. Они решили вести двойной след: быстрый рабочий снимок на винчестере и холодный, эталонный срез — на физическом носителе. Денис выхватил шариковую ручку и корявыми печатными буквами вывел на бумажной наклейке дискеты: `ILLYA-777 WATCH`.

Затем они сверили время, готовясь к синхронизации логов. Алексей открыл последнюю запись лога BinkleyTerm, Денис посмотрел на красные цифры электронных часов в правом верхнем углу панелей Norton Commander, а затем перевел взгляд на потертые наручные «Электроника», лежавшие возле паяльника на краю стола. Разброс между системным таймером материнской платы и наручными часами составлял ровно сорок две секунды. Алексей коротко ругнулся, ударил по клавишам и вписал высчитанную поправку прямо в строку комментария создаваемого файла. В их детективном расследовании каждая секунда превращалась в улику. Если новое письмо материализуется между двумя отметками, они будут точно знать, какой из таймеров врет.

Для калибровки ловушки они прогнали пустой, холостой цикл. Алексей тщательно, проверяя каждую букву, вписал в батник прямые пути к директории почтовой базы. Команды копировали не всю папку целиком, а конкретные критические узлы архитектуры JAM: сам текстовый массив сообщений, файл индексов и файл заголовков — `messages.jhr`, `messages.jdx` и `messages.jdt`. Батник фиксировал их размер и контрольные суммы. Следом в созданный подкаталог WATCH\0001 падал свежий, обрезанный по времени срез `BINKLEY.LOG`. Логика капкана была железобетонной, опирающейся на фундаментальные принципы операционной системы. Если Илья отправляет новое письмо, объем индексного файла `messages.jdx` неизбежно меняется. Если при этом в логе звонилки нет записи о соединении, а тоссер не фиксирует обработку внешнего архива — факт локальной генерации трафика будет доказан с математической безупречностью.

Система отработала тестовый прогон. Файлы остались нетронутыми. Утилита `fc /b` побайтово сверила массивы данных до и после мнимого полла, выдав на черный экран короткую успокаивающую строчку: `FC: no differences encountered`. Алексей позволил себе шумно выдохнуть. Созданная ими ловушка выглядела топорно, представляя собой нагромождение костылей командной строки, но она работала. Это были те законы машинной логики, которым сисоп еще мог безоговорочно доверять.

Он нажал F2 во встроенном текстовом редакторе, сохраняя итоговый вариант файла `catch.bat`. Денис сидел рядом, замерев и не сводя напряженного взгляда с командной строки. В полумраке душной комнаты, насквозь прокуренной и пропахшей сладкой химической персиковой жвачкой, толстые стекла его очков холодно отражали зеленоватое свечение текстового курсора.

Алексей ударил по клавише Enter.

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

С этой секунды поинт 77.777 официально перестал быть забавным глюком или странной аномалией маршрутизации. Два технаря молчаливо признали его критической угрозой безопасности всей питерской сети. Они замерли перед мерцающим ЭЛТ-экраном, окруженные хаосом бумажных распечаток логов, ожидая, когда неосязаемый Илья сделает следующий невозможный шаг и намертво захлопнет на себе челюсти программного капкана.

Предыдущая главаГлава 7 из 45Следующая глава