Перейти к содержанию

- 4 -

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

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

Я вышел из дома и уже почти дошел до магазина, как пришла СМСка от Макса: «будь дома, сейчас заеду». Придется вернуться, потом схожу. Наверно у Макса что-то важное.

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

— Если ты кому-то скажешь о том, откуда у тебя исходники, я тебя прибью. — Макс протягивал мне флешку. — Знаешь, что такое хадака-дзимэ(1)?

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

Я помотал головой, крепко сжимая флешку в кулаке.

— Ну вот если проболтаешься — узнаешь.
— Я понял. А как ты… У вас же флешки нельзя втыкать в банковские компы?
— Пришлось свой лаптоп из дома притащить, на него скинуть. На работу к восьми из-за тебя приперся, чтобы никто не спалил, что я свой комп в банковскую сеть втыкаю.
— А что, разве можно посторонние устройства втыкать в банковскую сеть?
— Конечно, нельзя. Но у нас в разработке есть отдельная полулегальная сеть, там нет контроля, потому что нам часто надо всякие тестовые устройства втыкать. А админы делают вид, что не в курсе.
— А что ты мне там вчера впаривал про вашу безопасность?
— Эта сеть изолированная, из нее нельзя попасть на промышленные системы, только на тестовые. Вообще я не понял, тебе уже не нужны исходники?
— Нужны-нужны, спасибо большое!
— Вот то-то! Все, я почесал назад, у меня уже обеденный перерыв заканчивается. Кстати, бутерброд мне сделаешь?
— Да ты вчера все сожрал. А я еще не успел сходить в магазин.
— А не надо спать до обеда! Я ему исходники принес, все правила нарушил, а он… — с этими словами Макс оставил меня одного в коридоре, с флешкой в руке.

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

В проекте было примерно полторы тысячи файлов, более четырехсот тысяч строк смешанного C и C++ кода. Да, я не представлял себе тяжесть задачи, когда просил исходники. А ведь результат вовсе не гарантирован, очень возможно, что в этой темной комнате нет кошки. Понять такой объем незнакомого кода за короткое время — задача практически неподъемная. Хотя… может, это и не нужно, достаточно изолировать подозрительные места и исследовать их.

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

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

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

Солнце отражалось в окнах панельных домов на улице Сергея Эйзенштейна. Интересно, что бы сказал суперстар рижского архитектурного модерна Михаил Эйзенштейн(1) про типовые бетонные дома на улице, носящей имя его сына? От этой мысли меня отвлек рев двигателей — на трассе что-то происходило, тренировка или гонка, в любом случае мне туда не попасть. Наверно, в обычный день я бы вернулся домой, но мне определенно надо подумать. Я решил сгонять до озера Лиласте и обратно, это около шестидесяти километров, как раз голова проветрится за пару часов.

  1. Знаменитый режиссер, уроженец Риги, Сергей Эйзенштейн был сыном известного рижского архитектора Михаила Эйзенштейна, спроектировавшего несколько домов в стиле модерн в центре Риги.

Как только я выехал на Таллинское шоссе и вошел в рабочий ритм, мысли вернулись к прежней задаче. Что я мог упустить? Ладно, строки с именем пользователя и с именами очередей можно спрятать так, что сразу и не заметишь, но ведь имена функций не спрячешь, они должны быть. Или их тоже можно спрятать? Как бы я это сделал?

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

Зайдя домой, даже не сняв шлем, я рванулся к компу и запустил поиск по исходникам. Ну давай, найди мне то, что я хочу! Есть! Два вызова одной специфичной функции, которая тут вряд ли нужна, и параметры выглядят подозрительно — собираются по кусочкам из разных источников, притом это размазано по коду. Причина может быть только одна — кто-то хотел что-то спрятать. Я что-то нащупал, а дальше мне, как археологу, надо аккуратно очистить находку от земли и вытащить на свет. Теперь можно не торопиться. И наконец снять шлем, да. Я запустил стираться спортивную форму, сходил в душ, заварил свежий чай. Судя по всему, его понадобится много. Было даже что-то приятное в затягивании — раз я напал на след, то я пройду по нему до самого конца, что бы там ни оказалось, можно не спешить.

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

— Ты с ума сошел! В курсе, который час?
— Чувак, извини, я стормозил, не посмотрел на часы. Я все нашел!
— Что нашел?
— Нашел, как все было сделано! Леху действительно подставили, и очень хитро!
— Молодец, завтра расскажешь.
— Да, хорошо. Извини, старик. Ты там не один, как я понимаю.
— Ну да.
— Ладно, скажи только, кто такой kenobi? Кто у вас такой любитель Star Wars?
— Точно kenobi? — голос Макса вдруг резко изменился. Он явно знал обладателя этого имени.
— Точнее быть не может.
— Жди, сейчас приеду.

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