Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Заражение файлов

Эдайн Гхэллах

Спецвыпуск Xakep, номер #035, стр. 035-048-1


6 способов заразить PE файл

Вирусы размножаются путем заражения исполняемых файлов. В Windows такими файлами являются файлы формата PE (Portable Executable), который был разработан на базе ELF (executable linkable format) из ОС Unix, что, несомненно, пошло ему на пользу.

Итак, рассмотрим устройство файла:

Файл начинается c DOS части, которая нужна лишь в целях совместимости. В самом начале располагается простая программа, единственной целью которой является вывод на экран строки: This program must be run under Win32.

Впрочем, эта часть нам не понадобится, важно знать лишь две вещи: то, что любой файл начинается с двух байт – “MZ”, и то, что по адресу 3ch от начала файла лежит смещение PE заголовка. Последний очень важен, и нужно остановиться на нем подробнее.

PE заголовок содержит довольно много полей, поэтому все, что не касается непосредственно заражения, было выброшено. Так что, если тебе нужно более обширное описание PE формата, смотри ссылки в конце статьи. Я лишь коротко пробегусь по тем полям, значения в которых нужно менять при заражении. Заголовок начинается со слова “PE” и двух нулей. Num of Objects – число размером в слово, содержащее количество секций в файле. NT header Size – используя это поле, можно получить размер всего заголовка. Он будет равен: NT header Size + 18h. Entry point RVA - смещение в файле, по которому передается управление при запуске файла. Image Base – адрес, по которому, производится загрузка файла в память (обычно 0x00400000). Object align и file align - выравнивание, важная вещь, и о нем стоит поговорить подробнее. Как видишь, оно тут двух видов: выравнивание секций (object align) и файловое выравнивание(file align). Это обусловлено спецификой работы компьютера - чтение информации с жесткого диска производится секторами, а из памяти страницами. Т.е. если файл занимает 1 байт, с диска будет все равно прочитано 512 (1 сектор). Поэтому размер файла на диске дополняется нулями (выравнивается) до определенного значения (обычно 512). То же самое в памяти, только там выравнивание обычно происходит на одну страницу (1000h). Проще говоря, выравнивание – это округление до определенной константы, нужное для оптимизации работы компьютера (или для усложнения жизни вирмейкерам, но это уж кому как). Image Size – виртуальный размер всего файла вместе с заголовками.

Прежде чем перейти к дальнейшему описанию, нужно прояснить одну важную вещь – PE файл состоит из секций. Одна секция может содержать код, данные, таблицу импорта или что-нибудь еще. Главная сложность заключается в том, что секция на диске не обязательно соответствует секции в памяти. Это происходит по нескольким причинам: отчасти из-за выравнивания, о котором было сказано выше, а еще потому, что существует такая вещь, как неинициализированные данные. К примеру, если в листинге написать: buffer rb 1000h, то размер файла на диске не увеличится ни на байт. Другое дело в памяти, здесь он будет больше ровно на 1000h. Информация о секциях хранится в специальной таблице. Она идет сразу же после PE заголовка и состоит из набора заголовков секций. Каждый заголовок описывает одну секцию файла: ее размер, адрес загрузки, параметры и т.п.

Содержание  Вперед на стр. 035-048-2