18+
Тень: Книга 1. Кто?

Объем: 74 бумажных стр.

Формат: epub, fb2, pdfRead, mobi

Подробнее

Оглавление

Пролог. Тот, кто смотрит

Глава 1. Падение

Глава 2. Код в машине

Глава 3. Второй сигнал

Глава 4. Архив

Глава 5. Ночной гость

Глава 6. Семья

Глава 7. Подготовка

Глава 8. Бункер

Глава 9. Погоня

Глава 10. Последний рубеж

Глава 11. Убежище

Глава 12. Сигнал

Эпилог

Пролог. Тот, кто смотрит

Август 2015 года. За день до испытаний.


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


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


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


— Я знаю, что будет с испытуемыми, — ответил второй голос. Горбунов узнал его не сразу — это был Сухов, чиновник из ведомства, который появлялся на заводе раз в месяц с проверками. — Но это их выбор. Подписанные бумаги, согласия, гонорары. Они знают, на что идут.


Горбунов замер на площадке. Сердце колотилось где-то в горле. Он не должен был этого слышать.


— Знают? — Круглов усмехнулся, и в этой усмешке не было ничего человеческого. — Они знают, что получат деньги. Остальное — наша забота. И ваша, Виктор Павлович. Если информация утечет, вы сядете первым.


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


Но запах уже въелся в память. Запах подвала — сырость, медь, и еще что-то сладковато-химическое, как от растворителя.


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


Глава 1. Падение

Завод №47 «УралМетТяжМаш», Цех №3, 02:17


Гул крана-мостовика никогда не прекращался полностью.


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


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


Этой ночью гул прервался.


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


Алексей сидел в серверной на втором ярусе, в стеклянной будке, отгороженной от цеха. Он читал техдокументацию на новую партию контроллеров, пил остывший кофе из пластикового стаканчика. В наушниках играл «ДДТ» — старая привычка, чтобы не слышать заводского гула, когда хочется побыть одному. Юрий Шевчук хрипел про осень, про небо, про то, что «что такое осень — это камни над нами». Глупые строчки, но почему-то именно они лезли в голову в самые неподходящие моменты.


Он дернулся так, что стаканчик упал, расплескав коричневую жижу по столу. Монитор HMI — человеко-машинного интерфейса — мигнул красным. На черном фоне загорелась надпись:


EMERGENCY STOP — CRANE 3—17

ОСТАНОВКА АВАРИЙНАЯ — КРАН 3—17


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


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


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


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


Он увидел тело метров за двадцать.


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


Глаза были открыты.


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


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


Мастер цеха. Сорок восемь лет. Двадцать семь из них — на этом заводе.


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


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


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


Кто-то упал. Или кого-то столкнули.


Алексей достал ноутбук из рюкзака. Руки дрожали, когда он открывал крышку и тянул патч-корд из кармана. Он подключился к сервисному порту PLC крана — Siemens S7—1500, старая рабочая лошадка, которую ставили на все краны еще десять лет назад. Запустил TIA Portal — программу, которую знал как свои пять пальцев. Вошел в диагностический буфер.


На экране побежали строки. Последняя запись была сделана в 02:16:47.


*Diagnostic buffer entry 0x2521 — User-defined message from OB82*

Текст: «КТО-то смотрит через меня»


Алексей моргнул. Прочитал еще раз. Текст не изменился.


— Что за черт, — прошептал он.


OB82 — это блок обработки прерываний по авариям. Туда не пишут пользовательские сообщения. Туда нельзя написать пользовательское сообщение. Только если… только если кто-то специально не перепрошил блок, добавив эту функцию.


Через четыре секунды после этого сообщения в логе стояла запись:


CPU stop request via hardware interrupt.

Запрос остановки CPU через аппаратное прерывание.


А через семь секунд:


Power-off event simulation on hoist motor drive.

Событие отключения питания на приводе подъемного двигателя.


Алексей обновил экран. Запись висела на месте. «КТО-то смотрит через меня». Но что-то было не так. Он переключился в режим просмотра сырых данных буфера — тот, в котором работал только когда нужно было отлаживать сложные глюки. И увидел.


Перед записью стоял флаг подмены.


Replaced by backdoor routine.

Заменено бэкдор-процедурой.


Кто-то не стер строку, кто-то подменил ее. Через скрытую функцию, вшитую прямо в прошивку CPU. В официальном логе, который увидят завтра комиссия и начальник цеха, будет только одна запись:


Emergency Stop activated at 02:17:03 by limit switch violation.

Аварийная остановка активирована в 02:17:03 нарушением концевика.


Ни слова про «КТО». Ни слова про бэкдор.


Алексей знал: diagnostic buffer PLC не предназначен для хранения пользовательских строк. Он используется только для системных событий. Значит, кто-то специально модифицировал прошивку, добавив блок кода, который записывает сообщения в буфер. Это не глюк — это бэкдор. И тот, кто его установил, понимал в программировании PLC лучше любого инженера на заводе. Лучше, чем сам Алексей. Лучше, чем Горбунов. Лучше, чем все вместе взятые.


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


На кране сидит бэкдор. И тот, кто его активировал, знает PLC лучше, чем сам Алексей. Лучше, чем Горбунов. Лучше, чем все инженеры завода вместе взятые.


Сзади послышались шаги. Тяжелые, быстрые, с металлическим лязгом — подошвы, подбитые сталью.


Охрана.


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


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


— Твою мать, — выдохнул прапорщик, увидев тело. — Это ж Горбунов?


— Да, — ответил Алексей. Голос прозвучал спокойнее, чем он ожидал.


— Вызывай скорую, — прапорщик толкнул парня в плечо. — И начальника охраны. Живо!


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


— Готов. Шея сломана, сразу. Даже не мучился. — Он поднял глаза на Алексея. — Ты чего тут делаешь?


— Я в серверной сидел. Услышал грохот, прибежал.


— Видел кого?


— Нет. Только тело.


Прапорщик кивнул, достал рацию. Нажал кнопку, поднес к губам.


— Третий пост, это пятый. В цехе номер три труп. Да, мастер цеха. Несчастный случай. Вызывайте кого надо. Понял, жду.


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


— Ты здесь один работал?


— Один. Ночная смена, серверная.


— А Горбунов чего тут делал в такое время?


— Не знаю. Может, документацию проверял. Он часто задерживался.


Прапорщик хмыкнул, но ничего не сказал. Достал сигарету, закурил прямо в цехе. На табличку «Не курить» ему было плевать.


Алексей стоял рядом и смотрел на пустую кабину крана. «КТО-то смотрит через меня». Строка жгла память, как раскаленное железо.


Он знал: завтра скажут «несчастный случай». Сорвался с галереи. Старый стал, реакция уже не та, не уследил за собой. Похоронят, помянут, забудут.


Но подмененная строка осталась в памяти. Как заноза. Как осколок стекла под кожей.


Он знал: это не конец.


Это только начало.


Глава 2. Код в машине

Завод №47, серверная АСУ ТП, 03:42


Алексей не пошел домой.


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


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


Он знал, что его вызовут. Допросят. Запишут показания. Но сначала нужно было понять.


Он вытащил из ящика стола старую флешку с бэкапом прошивки PLC. Такие бэкапы делали раз в полгода, клали в сейф и забывали. Алексей хранил копию у себя — на всякий случай. «Всякий случай» наступил.


Флешка была черная, с потертым корпусом, наклейка с надписью «S7—1500 backup 2015» почти стерлась. Алексей вставил её в USB-порт и запустил программу сравнения. Две прошивки — эталонная, годичной давности, и та, что сейчас стояла на кране 3—17. Программа задумалась на секунду, потом выдала результат.


Блок OB82 был изменен.


Алексей открыл дифф-окно и увидел это своими глазами. Кто-то добавил в стандартный код обработки прерываний несколько строк на SCL — языке структурированного текста, который использовали только опытные программисты PLC. Строки, которых там быть не должно.


*IF #event_type = 16#0A THEN*

#user_message:= «КТО-то смотрит через меня»;

WRITE_TO_DIAGBUF (#user_message);

END_IF;


Если тип события — аппаратное прерывание, записать в диагностический буфер сообщение «КТО-то смотрит через меня».


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


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


Он открыл глаза и снова посмотрел на экран. Горбунов оставил еще сообщения. Не только последнее. Алексей пролистал диагностический буфер назад.


*02:16:47 — «КТО-то смотрит через меня»*

01:58:12 — «Они читают holding registers»

23:41:19 (предыдущая смена) — «Архив 2015. Не открывай»

22:09:55 — «Виктор знает»


Виктор. Виктор Серов. Бригадир участка кранов. Мужик лет пятидесяти, с тяжелым взглядом и руками, вечно в масле. Они с Горбуновым работали вместе лет десять, пили чай в одной комнате, материли одно начальство. Если Горбунов кому-то и доверял, то только Серову.


Или боялся его?


Алексей открыл Modbus-трафик за последние сорок восемь часов. Wireshark на зеркальном порту коммутатора. Modbus — древний, как само понятие автоматизации, протокол, по которому SCADA-системы общаются с контроллерами. Читать регистры, писать регистры. Ничего сложного.


Кто-то писал в holding registers крана по адресу 40001–40010. Не с локального HMI, который висел на стене в кабине крановщика. С другого узла в заводской сети. IP-адрес принадлежал подсети 192.168.47.0/24 — внутренней сети завода. Значит, команда пришла не извне, а из цеха.


Алексей выделил пакеты, посмотрел содержимое.


Function Code 06 — Write Single Register (команда записи в одиночный регистр).

Адрес 40007 — значение 0xDEAD.


0xDEAD — «dead» в шестнадцатеричном коде. Четыре буквы, которые не могли оказаться здесь случайно. Кто-то писал их с определенной целью.


Алексей полез в документацию на PLC. Распечатки, которые он возил с собой годами, замусоленные, с пометками на полях. Адрес 40007. Регистр маскировки аварийных сигналов.


Если записать в него 0xDEAD, система временно отключала контроль перегрузки мотора. Ровно на семь секунд. Ровно столько, чтобы крюк с траверсой, на котором висел груз, мог упасть под собственным весом.


Горбунов не сорвался. Его убили.


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


Он вспомнил Чечню. Две командировки, два года, упакованные в адреналин и кровь. Тогда он тоже видел смерть — не одну. Но та смерть была на войне, там было понятно: враг, приказ, долг. А здесь? Завод, коллега, PLC? Это было за гранью понимания.


Он провел рукой по лицу, чувствуя щетину. Когда он брился в последний раз? Кажется, позавчера. Надо будет привести себя в порядок, если придется идти к следователям.


Дверь серверной открылась без стука.


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


Виктор Серов.


В робе, руки в карманах. Запах перегара и дешевых сигарет. Лицо красное, опухшее — то ли от недосыпа, то ли от того, что только что накатил за покойника.


— Ты чего копаешь, Лёха? — Голос низкий, как гул крана. — Утром комиссия придет. Несчастный случай. Всё.


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


— Сергей оставил записи. В логе.


— Глюк. Старый PLC, память битая. Я такие глюки видел — волосы дыбом. Бывает.


— Память не врёт, Витя. И бэкдор в прошивке сам не появляется.


Тишина. Только вентиляторы гудят.


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


— Забудь. Тебе же лучше. Жена, дочка…


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


— Семью подставляешь.


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


— Угрожаешь?


— Советую. По-хорошему.


В этот момент телефон Алексея завибрировал. Он глянул на экран — неизвестный номер.


Он нажал отбой.


Через три секунды — снова.


Серов усмехнулся. Криво, одними уголками губ.


— Ответь. Может, важно.


Алексей взял трубку.


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


Потом голос. Искаженный, металлический, с модуляциями.


— КТО следующий?


Гудки.


Алексей опустил телефон. Смотрел на экран, где горела надпись «Вызов завершен». Потом перевел взгляд на Серова.


Тот смотрел прямо. Без улыбки.


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


— Ты знаешь, кто это? — спросил он Серова.


Серов молчал секунду, другую. Потом шагнул к двери.


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


Дверь закрылась. Шаги стихли в коридоре.


Алексей остался один. Он посмотрел на телефон, потом на монитор, где все еще висели строки лога. «КТО-то смотрит через меня».


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


Он вспомнил развод. Как собирал вещи в квартире, где они жили с Ириной десять лет. Как Маша, тогда еще пятилетняя, стояла в коридоре и спрашивала: «Папа, ты уезжаешь? А когда приедешь?» Как он не мог ответить, потому что в горле стоял ком.


Ирина потом говорила: «Ты никогда не был с нами, Лёша. Ты был с завода. Твоя настоящая жена — этот чертов PLC».


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


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


Почему он не идет в полицию? Потому что в полиции сидел старый приятель Серова. Потому что его собственные манипуляции с PLC — нарушение инструкций, за которое могут выгнать с волчьим билетом. Потому что кто-то явно хочет, чтобы он копал дальше. Или чтобы замолчал навсегда.


Алексей выключил монитор, сунул ноутбук в рюкзак и вышел в ночь.


18+

Книга предназначена
для читателей старше 18 лет

Бесплатный фрагмент закончился.

Купите книгу, чтобы продолжить чтение.