Истории о вирусах

Структура и процесс загрузки ЕХЕ-программы


В отличие от СОМ-программ, ЕХЕ-программы могут состоять из не-

скольких сегментов (кодов, данных, стека). Они могут занимать боль-

ше 64Кбайт.

ЕХЕ-файл имеет заголовок, который используется при его загрузке.

Заголовок состоит из форматированной части, содержащей сигнатуру

и данные, необходимые для загрузки ЕХЕ-файла, и таблицы для на-

стройки адресов (Relocation Table). Таблица состоит из значений в фор-

мате сегмент:смещение. К смещениям в загрузочном модуле, на которые

указывают значения в таблице, после загрузки программы в память дол-

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

При запуске ЕХЕ-программы системным загрузчиком (вызовом функ-

ции DOS 4Bh) выполняются следующие действия:



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

которого достаточен для размещения программы.

2. Создается и заполняется блок памяти для переменных среды.

3. Создается блок памяти для PSP и программы (сегментЮОООЬ - PSP;

сегмент+ООЮЬЮОООЬ - программа). В поля PSP заносятся соответ-

ствующие значения.

4. Адрес DTA устанавливается равным PSP:0080h.

5. В рабочую область загрузчика считывается форматированная часть

заголовка ЕХЕ-файла.

6. Вычисляется длина загрузочного модуля по формуле:

Si7.e=((PageCnt*5i2)-(HdrSae*i6))-Pa!tP3ig.

7. Определяется смещение загрузочного модуля в файле, равное

HdrSize*16.

8. Вычисляется сегментный адрес (START_SEG) для загрузки -

обычно это PSP+lOh.

9. Считывается в память загрузочный модуль (начиная с адреса

START_SEG:0000).

10. Для каждого входа таблицы настройки:

a) читаются слова I_OFF и I_SEG;

b) вычисляется RELC^SEG-START^SEG+LSEG;

c) читается слово по адресу RELO_SEG:I_OFF;

d) к прочитанному слову прибавляется START_SEG;

e) результат запоминается по тому же адресу (RELO_SEG:I_OFF).

11. Распределяется память для программы в соответствии с МахМет

и МтМет.

12. Инициализируются регистры, выполняется программа:

a) ES=DS°PSP;

b) АХ=результат проверки правильности идентификаторов драйве-

ров, указанных в командной строке;

c) SS°START_SEG+ReloSS, SP-ExeSP;

d) CS=START_SEG+ReloCS, IP=ExeIP.



Содержание раздела