Часть 1
17 января 2015 г., 14:58
– Увеличь ширину основного окна на пятьдесят пикселей.
Голос, доносящийся из динамиков, принадлежит не самому Пользователю: это всего лишь трансляция его команд. В каком виде Пользователь их отдаёт, Ида даже не представляет. Происходящее в её адресном пространстве он, вероятно, тоже видит совершенно другим способом.
Ида подошла к окну и, взяв за рамочку правой границы, переместила её на указанное расстояние. После этого она вернулась назад, к препарационному столу.
Для дизассемблирования всё было готово: инструменты разложены в нужном порядке, подлежащая исследованию программа надёжно зафиксирована ремнями и освещена лампами со всех сторон. Она испуганно разглядывала Иду и беспомощно лепетала:
– Не надо, прошу вас… Я никому не сделала ничего плохого!
Наивное, неопытное приложение. За свою короткую жизнь оно ещё не успело понять, что не всё, что происходит с программами, зависит от их поступков. Эту молоденькую утилиту скачали из интернета специально для дизассемблирования и передали в руки Иде, не дав даже толком оглядеться вокруг. Поумнеть юной программке, видимо, уже не придётся.
– Пожалуйста… Я не хочу…
«От наших желаний здесь уж точно ничего не зависит, – подумала Ида. – Кому-то, может быть, вовсе и не хочется быть бессердечным палачом, но приходится».
На самом деле быть бессердечной никто Иду не принуждал; всё, что от неё требовалось – это качественное дизассемблирование других программ. Однако если при такой профессии не выработать защитные механизмы, позволяющие не сочувствовать препарируемым, можно самой свихнуться.
Иногда, правда, когда Ида бывала зла и раздражена, наблюдение за чужими мучениями позволяло ей получить некоторую разрядку. Но в большинстве случаев она не испытывала никаких эмоций по поводу происходящего.
Скулёж обречённой, тем не менее, ей надоел. Ида запустила руку в настройки утилиты и, нащупав выключатель звука, повернула его. Голос программы пропал, но ее губы продолжали двигаться. Ида оторвала полоску клейкой ленты и залепила утилите рот.
– Начнём, пожалуй, – донеслось из динамиков.
Ида взяла в руки скальпель и сделала глубокий надрез по всей длине пользовательского интерфейса программы. Из глаз утилиты потекли слёзы. Вдоль раны выступили красные капли, и надрез пришлось обработать гемостатическим препаратом. Не хотелось бы, чтобы программа умерла от потери данных раньше времени.
Взяв щипцы, Ида зацепила ими правый край надреза и с силой потянула на себя, обнажая нижележащие ткани. Дизассемблируемая программа запрокинула голову, упершись затылком в жёсткую поверхность стола. Она, может быть, вся бы выгнулась дугой, но ремни держали её крепко.
Возможно, в следующих версиях Иды разработчики добавят функцию анестезии, но пока приходилось работать так, хоть дёрганье дизассемблируемой программы всякий раз изрядно мешало.
Отпиливать и вынимать твёрдые каркасные классы, защищающие органы программы, пришлось долго. Но если их не убрать, ничего не удастся сделать.
Повторив манипуляции с другой стороны, дизассемблер отошла в сторону и предоставила Пользователю возможность рассмотреть внутренности утилиты. Интересно, для него это тоже работа — или он получает от дизассемблирования удовольствие?
Дыхание лежащей на столе программы стало частым и поверхностным.
– Так, – произнес обыденный голос после длительной паузы. – Удали фрагмент от 00107CE1 до 00107CE3.
Ловко орудуя скальпелем, Ида вырезала указанный участок, ни капли не повредив прилегающий код, и отправила фрагмент в ведро с отходами.
– А теперь – строчку “jmp” по адресу 00128FE4.
Быстро и профессионально удалённая инструкция полетела следом. На дрожь и рывки препарируемой утилиты Ида уже не обращала внимания.
– Перед “call” в 001375A2 добавь комментарий «Pascal-конвенция вызова».
Ида взяла со столика с инструментами заранее заготовленную полоску для комментариев, извлекла её из стерильной упаковки, ввела текст и вшила комментарий в тело программы. Потёкшие вдруг из одного из протоков данные Ида остановила, прижегши его нагретым на горелке лезвием.
– Поменяй местами 001E3522 и 001E3528, – продолжил Пользователь.
Адреса, инструкции, сегменты кода, переходы, вызовы, jnz, move, pop, push, add, sub… Неожиданные судороги утилиты, то слабые, то такие, которые могут помешать... У Иды уже рябило в глазах, когда Пользователь, наконец, распорядился:
– Хорошо, достаточно. Я понял всё, что хотел. Заканчиваем.
Затянув окно в адресное пространство обоями рабочего стола, Ида вытерла инструменты и взглянула на дизассемблированную программу. Та была ещё жива. Это, впрочем, ненадолго: распотрошённый код, изрезанные циклы, разорванные условия – утилита проживёт от силы пару дней. И всё это время она будет мучиться от боли, страха смерти и отчаянья. Ида поморщилась. Гораздо милосерднее закончить всё сейчас.
– Считай это милостью, – острое лезвие вошло в основной алгоритм утилиты, в самое сердце программы, из которого, пульсируя, расходились по всему её телу потоки данных. На секунду во взгляде приложения отобразился ужас понимания, что это – конец; потом её зрачки помутнели, а голова склонилась набок. Программа умерла.
Теперь Иде осталось только отвезти безжизненный образ утилиты в её домашний каталог, где, скорее всего, уже ждёт деинсталлятор. Он удалит останки приложения и сотрёт директорию, в которой оно жило. Иде этим заниматься не придётся.
Она подвезла к хирургическому столу каталку и отстегнула удерживавшие тело программы ремни. На пути к папке утилиты Ида не повстречает ни одной программы: завидев дизассемблер, все постараются скрыться из виду.
Кто-то боится её, кто-то ненавидит. Для самой Иды её предназначение – просто работа. На всё священная воля Пользователя, и перечить ей программе не пристало.