EXE-вирусы для MS DOS Неверов А.В.
Форматы EXE-файлов Формат файлаОперационная система MZMS DOS NE (New Exe)Windows 3.x PE (Portable Executible) Windows 9x Windows NT
Формат EXE-программы для MS DOS
Бинарный код файла MZ-заголовок Код Данные
Формат MZ-заголовка Relocation Table ABCDEF 00MZPartPagPageCntReloCntHdrSizeMinMemMaxMemReloSS 10ExeSPChkSumExeIPReloCSTabOffOverlay … 1F
Значение полей MZ-заголовка СмещениеНаименованиеЗначение +00hСигнатураПоле сигнатуры стандартного заголовка содержит значение MZ (4Dh 5Ah). Оно определяет формат заголовка, а следовательно и всего exe-файла +02hPartPagРазмер последней (неполной) страницы +04hPageCntКоличество страниц в файле (участков размером по 512 байт) +06hReloCntКоличество элементов в таблице настройки адресов (Relocation Table) +08hHdrSizeДлина заголовка в параграфах +0AhMinMemМинимальный объем памяти (в параграфах), которую нужно выделить после загруженного модуля +0ChMaxMemМаксимальный объем памяти (в параграфах), которую можно выделить после загруженного модуля +0EhReloSSСегментное смещение начала сегмента стека (для настройки регистра SS) +10hExeSPЗначение SP, указанное при входе
Значение полей MZ-заголовка +12hChkSumКонтрольная сумма +14hExeIPЗначение IP, указанное при входе (точка входа в программу) +16hReloCSСегментное смещение начала сегмента кода (для настройки регистра CS) +18hTabOffСмещение в файле первого элемента таблицы настройки адресов (обычно 1Сh) +1AhOverlayНомер для загруженного оверлейного модуля. Для коренного модуля это поле рано 0 +1СhНачало таблицы настройки адресов (Relocation Table) Каждый элемент таблицы занимает 4 байта и имеет формат segment:offset – длинные адреса элементов программы, которые содержат настраиваемые сегментные адреса. Сегмент (segment) принято называть входным сегментом – I_SEG, а смещение (offset) – входным смещением – I_OFF
Загрузка MZ-файла 1) Определяется участок памяти с размером, достаточным для загрузки программы. 2) Формируется и заполняется MCB для переменных среды. 3) Создается и заполняется блок памяти для PSP (сегмент:0000h – PSP, сегмент+0010h:0000h – программа). В PSP заносятся необходимые значения. 4) Устанавливается адрес DTA равный PSP:0080h. 5) В рабочую область загрузчика считывается форматированная часть MZ-заголовка (без Relocation Table). 6) Вычисляется длина загрузочного модуля по формуле Size = ((PageCnt * 512) – (HdrSize * 16)) – PartPag.
Загрузка MZ-файла 7) Вычисляется сегментный адрес для загрузки START_SEG = PSP + 10h. 8) Определяется смещение загрузочного модуля в файле, равное HdrSize * 16. 9) Считывается в память загрузочный модуль, начиная с адреса START_SEG:0000h. 10) Для каждого элемента в таблицу настройки адресов выполняются следующие операции: a) считываются значения входных смещения и сегмента I_OFF и I_SEG; б) вычисляется новое значение сегмента RELO_SEG = START_SEG + I_SEG; в) читается слово по адресу RELO_SEG:I_OFF; г) к прочитанному слову прибавляется значение START_SEG; д) полученное значение запоминается по тому же адресу - RELO_SEG:I_OFF. 11) Распределяется память для программы в соответствии с MinMem и MaxMem.
Загрузка MZ-файла 12) Инициализируются регистры: а) DS = ES = PSP (таким образом, после загрузки exe-программы регистры DS и ES указывают не на сегменты данных, а на PSP. Следовательно, чтобы программа работала корректно, программист должен самостоятельно выполнить инициализацию этих регистров); б) AX = результат правильности инициализации драйверов, указанных в командной строке; в) SS = ReloSS + START_SEG; SP = ExeSP; г) CS = ReloCS + START_SEG; IP = ExeIP.
Типы вирусов для EXE-программ в MS DOS Вандалы (Overwrite) Спутники (Companion) Создание COM-спутника Переименование EXE-файла Внедряемые (Parasitic) Стандартное заражение Внедрение методом сдвига Внедрение переносом
Вандалы (Overwrite) Считать тело вируса в буфер Найти подходящую жертву Открыть найденный exe-файл Проверить зараженность файла Записать текст вируса в начало файла (поверх имеющейся информации)
Спутники (Companion) Создание COM-спутника Если в командной строке есть параметры для запускаемого файла – сохранить их Найти exe-файл Проверить наличие «спутника» Скопировать тело вируса под именем.COM Передать управление зараженному файлу. При необходимости передать ему параметры командной строки
Спутники (Companion) Переименование EXE-файла Сохранить параметры командной строки Найти exe-файл Проверить, имеется ли для него спутник с именем, выбранным для инфицирования Скопировать жертву по выбранным именем Записать текст вируса в файл со старым именем жертвы Вернуть управление инфицированному файлу. При необходимости передать ему параметры командной строки
Внедряемые (Parasitic) Стандартное заражение EXE-файла Текст вируса записывается в конец файла Чтобы вирус получил управление возможно два приема: Модификация MZ-заголовка Модификация одной из инструкций сегмента кода, как правило, первой
Внедряемые (Parasitic) Внедрение методом сдвига Найти жертву Проверить зараженность Считать тело жертвы (полностью) в буфер Записать тело вируса Записать тело жертвы
Внедряемые (Parasitic) Активация после внедрения методом сдвига Создать временный файл Переписать в него текст жертвы После выполнения вируса передать управление файлу жертвы Если есть необходимость, то перед запуском сохранить параметры командной строки, а при передаче управления вернуть их жертве
Внедряемые (Parasitic) Внедрение методом переноса Из начала файла считывается фрагмент файла, равный по длине телу вируса Данный фрагмент записывается в конец заражаемого файла На его место записывается тело вируса
Внедряемые (Parasitic) Активация после внедрения методом переноса После срабатывания вируса необходимо восстановить исходный код зараженного файла во временный файл После завершения работы вируса запустить текст программы из временного файла Или можно не использовать временный файл, восстановив рабочую версию жертвы в том же файле, а затем заразив ее вновь