"С.П.Расторгуев, А.Е.Долгин "Как защитить информацию" (пособие по борьбе с хакерами)" - читать интересную книгу автора

метка в командах перехода и цикла; addr - адрес в командах перехода и
вызова подпрограмм.


6. ИСПОЛНЯЕМЫЙ МОДУЛЬ - ЧТО МОЖНО СДЕЛАТЬ
БЕЗ ИСХОДНЫХ ТЕКСТОВ?
Одной из самых сложных работ в программировании является
модификация исполняемых модулей при отсутствии исходных текстов. Надо
признать, что программисту не часто приходится заниматься подобными
работами, но, однако, никто не застрахован от потери собственных
исходных текстов программ. В частности, мы обратились к решению
названной задачи для того, чтобы исправить найденную в нашем пакете
ошибку. "Исходники" к тому времени были случайно уничтожены при борьбе
с вирусом. Бесполезно вспоминать и переписывать весь пакет - за тот
срок, в течении которого гарантировалось устранение любых замечаний,
мы в любом случае не успевали этого сделать. Поэтому стали искать
другие пути. В результате разработали соответствующий метод и даже
набор инструментальных средств, который с успехом применяем по сей
день.
Разумеется, приемы корректировки исполняемых модулей
предназначены профессиональным разработчикам ПО для IBM PC в среде
DOS. Поэтому опустим некоторые детали, которые профессионал должен
знать, а в качестве примера возьмем лишь EXE-файлы - более сложные для
модификации, поскольку все сказанное может быть отнесено и к
COM-файлам.
Напомним, что EXE-файл состоит из заголовка, таблицы перемещения
и собственно исполняемого кода. Информация заголовка используется
операционной системой для загрузки модуля в оперативную память.
Устанавливаются значения основных регистров, обрабатывается таблица
перемещения, а затем управление передается задаче. В ходе работы все
основные функции ввода/вывода, захвата или освобождения ОЗУ и т.п.
обрабатываются операционной системой через прерывание 21h, а значит,
всегда могут быть изменены с помощью специального драйвера, который
либо резидентно находится в памяти, либо непосредственно включен в
модифицируемый EXE-файл. Второй подход более удобен.
Для корректировки функций EXE-файла необходимо: внедрить в него
этот драйвер; осуществить передачу управления на драйвер.

ВКЛЮЧЕНИЕ В ТЕЛО EXE-файла СВОЕГО МОДУЛЯ
Вариантов включения собственного блока в существующий EXE-файл
несколько: можно добавить его в конец или в начало файла; встроить в
свободное место внутри программы или "склеить" им оба EXE-файла (свой
и модифицируемый).
Легче всего добавить дополнительные команды в конец EXE-файла и
исправить в заголовке размер загружаемой части (с учетом добавленных
байт). Однако предварительно необходимо проверить, возможна ли их
загрузка в ОЗУ. Дело в том, что задача может быть оверлейной и DOS
загрузит только ее корневой сегмент. Например, в BORLAND C++ размер
BCC.EXE более 800 кб, а объем ОЗУ всего 640 кб. Ясно, что загрузкой и
выгрузкой отдельных частей гиганта занимается специальный блок в