HeadExeType = record

Sign Word; {Признак ЕХЕ-файла} PartPag Word; {Часть неполного сектора в конце файла} PageCnt Word; {Количество секторов, включая неполный} ReloCnt Word; {Количество элементов

в таблице перемещения} HdrSize Word; {Длина заголовка в параграфах} MinMem Word; {Минимальный размер кучи (в параграфах)} MaxMem Word; {Максимальный размер кучи (в параграфах)} ReloSS Word; {Начальное значение сегмента стека SS} ExeSP Word; {Начальное значение указателя стека SP} ChkSum Word; {Контрольная сумма всех слов файла} ExelP Word; {Смещение точки запуска программы} ReloCS Word) {Начальное значение сегмента кода CS};

TablOff Word; {Смещение первого элемента

таблицы перемещения} Overlay Word; {Номер оверлея или 0 для

основной программы)

end; {HeadExe}

Остальные элементы заголовка содержат так называемую таблицу перемещения, предназначенную для настройки адресов загруженной программы. Таблица начинается с байта TablOff от начала файла и содержит ReloCnt четырехбитных элементов следующего вида:

type

ReloTablItem = record

ItemSeg: Word; {Сегмент перемещаемого адреса} ItemOfs: Word; {Смещение перемещаемого адреса)

end;

Признак ЕХЕ— файла хранится в поле Sign в виде символов «MZ» (код $5A4D) — с этого признака должен начинаться любой ЕХЕ—файл. Поле HdrSize содержит длину всего заголовка в параграфах (участках памяти длиной по 16 байт каждый). Поля PartPag и PageCnt определяют общую длину загружаемой в память части ЕХЕ— файла по следующей формуле:

L = (PageCnt-1)*512 + PartPag - HdrSize*16

Остальная часть файла (длина ЕХЕ— файла может быть больше L+HdrSize*16) при загрузке программы не учитывается. Обычно в остатке файла, созданного системой Турбо Паскаль, (если, разумеется, есть остаток) содержится информация, используемая встроенным отладчиком, или оверлеи.

Подавляющее большинство ЕХЕ— вирусов пристыковывает свою программу в конец файла, а для того чтобы эта программа была загружена в память и ей было передано управление, изменяет поля PartPag, PageCnt, ReloCS, ExelP 1адрес точки, куда передается управление после окончания загрузки) и, возможно, некоторые другие поля. При таком способе внедрения общая длина загружаемой в память части файла должна составлять

ExeSize => FileSize + VirusSize,

•-де FileSize — полная длина ЕХЕ— файла, a VirusSize — длина программы ви руса. Так как в остатке фала могут храниться оверлеи (или архив для сам>- —