— Ремонт бы тебе сделать, — назидательно произнес он, — алкаш этот, Рома, квартиру жуть как запустил. Так и помер в свинарнике.
— Что, прямо тут и помер? — поинтересовался Кирилл.
— Нет, его в тот раз после очередного запоя «белка» навестила, зеленые человечки в уборной завелись и хотели беднягу для исследований на Марс забрать. Видимо, изучали влияние паленой водки на организм пьющего сантехника. Так он, от них спасаясь, в окно и вышел.
— Разбился?
— Да нет же. Какое разбился, второй этаж. В больницу увезли, переломанного. Там и умер.
Судьба бывшего владельца его нынешнего жилища Кирилла занимала мало, а вот ремонт и вправду был необходим, но он все откладывал это мероприятие на неопределенное будущее. Гости к нему заглядывали редко, а сам он с продранным линолеумом и грязными обоями уже как‑то свыкся. Да и вдоволь полюбоваться на интерьер получалось не так уж и часто: он подолгу зависал в «Синем экране», а дома проводил почти все время за экраном ноутбука, и там, в мире, где клавиши звучали громче человеческих голосов, окружающая реальность не имела никакого значения.
Борис Семенович прошел в комнату, с кряхтеньем опустился на предложенный Кириллом стул, нацепил очки и развернул перед собой школьную тетрадку в клетку, исписанную мелким бисерным почерком.
— Значится, так, — прихлопнул он ладонью тетрадный разворот, — то, что ключик берется не из воздуха, это хорошо. Идея там простая: дата как соль, серийный номер диска как персональная метка машины — склеил их, прогнал через генератор и получил ключ. Вот это первая загвоздка. Если ключ зависит от текущей даты, то вернуть файлы, зашифрованные, скажем, три недели назад, можно — но требуется знать, какое именно значение использовал троян. Не просто «март», а точное время.
Кирилл заглянул соседу через плечо, пробежал по листку глазами: почерк был мелким, но аккуратным и разборчивым, формулы лежали в клеточках, будто книжки на полке. Очень изящный и аккуратный алгоритм придумал Криптодед, просто загляденье. Где он, интересно, этому научился?
— Дату и время можно взять из метаданных самого файла, — задумчиво произнес Киря, — а лучше вытащить из нескольких и сравнить для надежности.
— Со вторым значением, которое серийный номер, все проще, — продолжил Борис Семенович, — разве что, если хозяин компьютера сменит винчестер и перенесет зашифрованные файлы туда, весь «персональный» фактор улетит в трубу. А вот если у тебя есть хотя бы один исходный файл — хоть сохраненная фотка, хоть шаблон письма, любой незашифрованный документ, — то алгоритм можно подручными методами проверить: подать предположительную дату, серийник и посмотреть, совпадает ли расклад. То есть нужен мостик — небольшая подсказка извне. Без нее ты будешь тыкаться вслепую и подбор ключа займет гораздо больше времени. Это вторая загвоздка.
Кирилл кивнул, внутренне поражаясь тому, с какой легкостью сосед рассуждает о вещах, которые большинству людей показались бы непонятной тарабарщиной. От пожилого человека в застиранной майке и вытянутых трениках ожидаешь услышать что угодно, кроме почти научной лекции по основам криптографии. Его так и подмывало поинтересоваться напрямую, откуда все‑таки у Бориса Семеновича взялись столь глубокие познания в генераторах и ключах. Не решился. Да и сам тон соседа не оставлял места расспросам: будто тот нарочно держал границу, открывая ровно столько, сколько считал нужным.
— Давайте я тогда расшифровщик набросаю, — предложил Кирилл, — сразу и проверим, как ваш алгоритм работает.
— Годится, — кивнул сосед. — А я пойду на кухню, чайник поставлю. Печенье у тебя найдется какое‑нибудь?
— Вчерашний батон только.
— Тогда я из дома сгущенки принесу. Чего пустой чай гонять?
Пока Кирилл возился с кодом, Борис Семенович поставил на плиту чайник, стукнул дверцей холодильника, о чем‑то поворчал, потом сбегал к себе и вернулся с половиной палки докторской колбасы, брикетиком сливочного масла и банкой сгущенного молока. Спустя несколько часов все было готово — Кирилл запустил декодер из командной строки, передав ему на вход требуемые параметры и путь к одному из зашифрованных файлов. Программа работала.
— Ваши файлы я к утру расшифрую, — пообещал Кирилл, с аппетитом откусив от ломтика политого сгущенкой нарезного, которые Борис Семенович аккуратно разложил на тарелочке.
— Думаю, не один я от этого вируса пострадал, — произнес сосед, — можно и другим людям помочь.
— В принципе, можно… — Кирилл прикинул в уме, что понадобится для реализации этой затеи, и потянулся за следующим куском. — Тогда надо к программе графический интерфейс приделать, чтобы было проще. Сайт какой‑нибудь можно на коленке соорудить. Да и вообще, ничто не мешает копейку за расшифровку брать — меньше, чем злодеи просят, но и чтобы не совсем даром. Подумать надо.
— Вот и подумай.
— Только расшифровщик наш именно с этой версией трояна справиться может. Если его авторы поумнеют и добавят в алгоритм настоящую случайность — скажем, вместо простой конкатенации даты и серийника станут использовать источник истинного энтропийного шума, — то весь ваш блестящий алгоритм превратится в тыкву. Ни дата, ни серийник не помогут.
— Ну да, — Борис Семенович вздохнул, — а еще автору трояна может не понравиться, что ты его бизнесу мешаешь.
Кирилл откусил еще кусок булки и на мгновение задумался: деньги за расшифровку, интерфейс, сайт на коленке… Картинка понемногу становилась не такой уж простой — слишком мелкая прибыль против возможных проблем.
— А может, бесплатно декодер выложить? — продолжил размышлять он вслух.
— Может, и так, — хмыкнул сосед, — но на всякий случай старайся лишний раз не светиться в интернете. Никаких громких рекламных объявлений, никаких больших сумм и, главное, никаких реальных имен. Чем меньше народу знает, кто именно этим занимается, тем дольше будет работать метод.
Кирилл кивнул. Он ощутил, как внутри просыпается привычный азарт — решить задачу, сделать рабочий продукт, довести его до ума. Деньги и потенциальный риск отступили на второй план.

Серёга обитал в вытянувшейся вдоль улицы длинной кирпичной пятиэтажке, на фасаде которой была выложена угловатой красной кладкой дата «1974». Такие дома считались здесь элитными, хотя таковыми они выглядели разве что на фоне окружающих обветшалых бараков. Лифта в подъезде не имелось, и Кирилл поднялся на самый верх по узкой и гулкой лестнице с тонкими металлическими перилами.
Дверной звонок отозвался переливчатой соловьиной трелью. Дверь открыла высокая и худощавая женщина в цветастом переднике, недовольно уставилась на Кирилла, опершись рукой о косяк и загородив ему проход.
— Мам, это ко мне, — послышался откуда‑то из коридора чуть смущенный голос владельца «Синего экрана», которого Кирилл полчаса назад предупредил о своем визите телефонным звонком.
Женщина молча посторонилась, смерив гостя еще одним подозрительным взглядом, — разговаривать она, видимо, сегодня была не в настроении.
— Здравствуйте, — кивнул ей Кирилл, переступая порог.
— На тряпочке вот тут разувайся, — засуетился подоспевший Серёга, — ботинки сразу в шкафчик убирай, у меня собака, сгрызет. Проня, фу! Фу, я сказал! Свои! Мам, ну забери его!

Выкатившийся из глубины квартиры рыжим клубком кудлатый спаниель принялся с оглушительным тявканьем крутиться под ногами. Следуя инструкции, Киря поставил обувь повыше в шкафчик и прошлепал в одних носках в комнату, вдыхая незнакомый воздух чужой квартиры. В каждом доме есть собственный аромат, впитавший в себя любимые блюда здешних обитателей, забытые разговоры, неубранные книги и мокрые следы на ковре. Этот запах — как невидимая печать, дающая понять, будет ли тебе в этом месте уютно, или все время придется бороться с внутренним дискомфортом. Так пахнет человеческая жизнь, и далеко не всегда она пахнет приятно. Но если запах есть — значит, дом живой. Здесь воздух был наполнен смесью дешевых духов, газет и влажного паркета, и эта непривычная атмосфера как минимум не раздражала.
Серёга пропустил Кирилла в небольшую комнатку с мягким диваном, письменным столом и старым платяным шкафом у стены, выгнал попытавшегося было юркнуть следом пса и поплотнее закрыл за спиной дверь. С той стороны донесся обиженный заливистый лай.
— Извини, мама не любит посторонних, — словно оправдываясь, признался он.
— Понимаю, — сказал Кирилл, усаживаясь без приглашения на диван, — у меня с отчимом такая же история была. Я на самом деле по поводу клуба пришел с тобой поговорить.
— Валяй, жги, — сразу же перешел на деловой тон Серёга. — Есть какие‑нибудь идеи?
— Скажи мне, ты знаешь, что такое ZX Spectrum? — вопросом на вопрос откликнулся Кирилл.
Сергей на мгновение задумался.
— Был вроде такой компьютер древний, — осторожно подбирая слова, произнес он, — восьмибитный еще, из девяностых. У бывшего одноклассника батя такие собирал когда‑то, он мне показывал: посмотри, мол, каким старьем предки пользовались. А что?
— Ну вот смотри. Цену, которую эти секондхендщики Тамаре предложили, мы перебить не сможем, нет у нас лишних денег. Да и на школоте местной много не заработаешь. А вот если мы соберем у нас любителей старого железа, которые и постарше, и побогаче, да информацию об этом мероприятии по всему городу распространим, это будет уже совсем другой расклад. Во‑первых, место станет известным, проходным, во‑вторых, денег принесет чуть больше, а если у нас появится постоянная тусовка серьезных дяденек за тридцать, выгнать нас оттуда будет немного сложнее, правда? В общем, я предлагаю замутить в «Экране» фестиваль ретрогейминга.
— Со «Спектрумами»? — удивленно хлопая глазами, переспросил Серёга.
— Со «Спектрумами», «Амигами», «Атари» и прочими «Апогеями» с «Микрошами». Мероприятие нужно небольшое, много народу в наш подвал все равно не поместится, но громкое.
— Да кто в нашу пердь попрется‑то? — недоверчиво протянул Серёга. — Тут же окраина мира, конец цивилизации. За Ковалёво вон обитаемая вселенная вообще заканчивается, там обрыв и жопы слонов торчат, на которых земная твердь покоится…
— Не дрейфь, Серый, попрутся, если общественность о предстоящем фестивале правильно проинформировать. Это я беру на себя. Кстати, у тебя знакомых журналистов случайно нет?
— Журналистов?.. — Сергей, все еще пребывавший в некоторой растерянности от Кириного напора, взъерошил ладонью непослушную шевелюру. — Нет… Хотя подожди, я у мамы спрошу. Ее сестра, тетя Рита, в какой‑то газете работает.
— Серёжа! — донесся из коридора требовательный женский голос — Ты на часы смотришь? Погуляй с Пронькой, а то он сейчас на полу наделает!
— Уже иду, мам! — крикнул Сергей и повернулся к своему гостю: — Пойдем, я собаку выведу, по дороге еще поболтаем.

Утро в «Синем экране» начиналось одинаково каждый день: тихий скрип кресел по линолеуму, приглушенный гул системных блоков и запах слегка подгоревшего кофе, который Кирилл приносил с собой из дома в термосе. Сегодня он почти опоздал: утром позвонила мама, долго выпытывала, как у него дела, хорошо ли он питается и достаточно ли теплая у сына одежда. Как минимум Кирилл был рад узнать, что со здоровьем у нее понемногу наладилось: доктора в подгорской больнице провели плановое обследование и ничего опасного больше не обнаружили.
— Ой, чуть не забыла: представляешь, я Юру вчера видела, — сообщила напоследок мама, заставив Кирилла напрячься.
Встречи с отчимом ничем хорошим обернуться не могли. В прошлом они и вовсе заканчивались рукоприкладством, после одного из которых Кирилл все‑таки упрятал его за решетку, воспользовавшись неожиданно подвернувшейся возможностью.
— И что он? — настороженно поинтересовался Киря.
— Да ничего, Кирюш. По‑моему, он меня даже не узнал. Я в продуктовый с тетей Таней пошла, и вдруг она говорит: смотри, это твой, кажется. Я глянула — и вправду он. Грязный весь, обросший какой‑то, в помойке копается, на бомжа стал похож. Бутылку в мусоре нашел, допил и в мешок спрятал, такой же грязный, как он сам. Посмотрел в мою сторону и отвернулся. Я быстрей‑быстрей идти оттуда, пока он меня не окликнул…
— Ну и хорошо, что не окликнул, — выдохнул с облегчением Кирилл.
В том, что отчим рано или поздно закончит свои дни в помойке, он ничуть не сомневался, главное, чтобы перестал портить жизнь окружающим.
Хлопнула дверь, и в клуб ввалился довольный собою Ваня Зарубин.
— Принес! — торжественно объявил он с порога.
— Чего принес? — переспросил занятый своими мыслями Кирилл, а потом вспомнил, о чем они разговаривали в прошлый раз.
— Винчестер принес, — Иван с гулким стуком выложил на стойку жесткий диск. — Блин, чуть не спалили. Но я выкрутился. Только его назад надо вернуть поскорее, пока не хватились.
Внешнего корпуса для винчестеров с USB-интерфейсом у Кирилла не имелось, поэтому он водрузил на стол запасной системник с открученной боковой крышкой, подцепил к материнской плате шлейфом принесенный Иваном диск и врубил питание. Вредоноса он обнаружил довольно быстро — он лежал в папке System32, не особо скрываясь. Поменяв расширение на ., чтобы программа случайно не запустилась, Кирилл скопировал файл на флешку, вернул винчестер законному владельцу и воткнул флешку в свой ноутбук.
Иван перегнулся через стойку, изо всех сил стараясь заглянуть в экран, и принялся сопеть Кириллу в ухо чесночным духом — видно, слопал где‑то по дороге шаверму.
PEiD сообщил, что прога написана на «плюсах» и не упакована. Кирилл загрузил файл в IDA, решив посмотреть, что у него внутри. В кармане противно затренькал телефон.
— Алло? — Кирилл прижал трубку к уху, не отвлекаясь от работы.
— Кирыч, это Сергей, — услышал он радостный и бодрый голос, — тетка нам журналиста нашла, запиши‑ка телефон. Его Жора зовут…
Зафиксировав номер в текстовом файле, Кирилл наспех набрал и отправил журналисту эсэмэску, после чего снова погрузился в исследование. Он вглядывался в графы IDA, как в старую карту средневекового города: блоки функций сходились в привычные маршруты, комментарии и имена импортов вырисовывали знакомые очертания. Кирилл узнал этот код.
Это были до боли знакомые функции сохранения копии файла и блокировки системы, тот же набор вызовов API для перехвата ввода, та же хитрая схема перерисовки окна поверх всего рабочего стола, те же проверки сочетаний клавиш и таймеры. Кирилл знал этот код до мурашек, до последнего байта — он сам написал его, прежде чем запустил в локальную сеть фирмы «Икс‑Байт», сидя на крыше соседнего здания.
А вот за пределами ядра трояна творилось странное. Следы расходились не туда, куда должен был вести чистый локальный винлокер. В бинарнике откуда‑то появились вызовы сокетов, механизмы сериализации данных и нетипичная логика — обнаружение соседних хостов в локальной сети, попытки смонтировать сетевые ша́ры, рекурсивный обход общих папок. Его простая функция блокировки компьютера теперь стала автомобилем с прицепом: после захвата экрана шел вызов подпрограммы, которая пыталась передать тело трояна по сети, прописывалась в автозагрузке на найденных машинах и запускала собственную копию для последующей активации локального блокиратора.
В нескольких местах он увидел маркеры: broadcast_scan, replicate_copy, remote_trigger. Где‑то среди дизассемблированного листинга мелькали строки вроде --lock-now-- и код, который ожидал внешней команды — возможность массового включения блокировки по расписанию или по сигналу с контролирующего сервера. Да и сам адрес этого сервера не был жестко запрограммирован, не хранился в явном или даже зашифрованном виде, он формировался динамически, по какому‑то странному алгоритму, логику которого Кирилл сейчас понять не мог.
Пальцы побелели, сжав подключенную к ноутбуку для удобства мышку. Кто‑то не просто взял его винлокер — его код сделали частью сетевого червя, способного захватить не одну машину, а целый подвал с компьютерами. А если не повезет, подобный ботнет вполне может превратить локальное заражение в настоящую глобальную эпидемию. Какой‑то неизвестный хакер без спроса позаимствовал его наработки, дополнил сетевой логикой и собрал новый бинарник.
Сердце Кирилла забилось чаще: нужно поскорее понять, кто это сделал, зачем — и, главное, можно ли остановить расползающееся заражение, пока оно не вышло из‑под контроля.

