EXE-вирусы для MS DOS

Download Report

Transcript EXE-вирусы для MS DOS

EXE-вирусы для MS DOS
Неверов А.В.
Форматы EXE-файлов
Формат файла
Операционная
система
MZ
MS DOS
NE (New Exe)
Windows 3.x
PE (Portable
Executible)
Windows 9x
Windows NT
Формат EXE-программы для
MS DOS
Бинарный код файла
MZ-заголовок
Код
Данные
Формат MZ-заголовка
00
10
0
1
2
M
Z
PartPag
PageCnt
ChkSum
ExeIP
ExeSP
3
4
5
6
7
ReloCnt
8
9
A
B
HdrSize
MinMem
ReloCS
TabOff
Relocation Table
Overlay
00
00
C
D
MaxMem
E
F
ReloSS
20
30
…
1F0
200
00
00
00
00
00
00
00
00
00
00
00
00
00
00
Значение полей MZ-заголовка
Смещение
Наименование
Значение
+00h
Сигнатура
Поле
+02h
PartPag
Размер последней (неполной) страницы
+04h
PageCnt
Количество страниц в файле (участков размером по 512
байт)
+06h
ReloCnt
Количество элементов в таблице настройки адресов
(Relocation Table)
+08h
HdrSize
Длина заголовка в параграфах
+0Ah
MinMem
Минимальный объем памяти (в параграфах), которую
нужно выделить после загруженного модуля
+0Ch
MaxMem
Максимальный объем памяти (в параграфах), которую
можно выделить после загруженного модуля
+0Eh
ReloSS
Сегментное смещение начала сегмента стека (для
настройки регистра SS)
+10h
ExeSP
Значение SP, указанное при входе
сигнатуры стандартного заголовка содержит
значение MZ (4Dh 5Ah). Оно определяет формат
заголовка, а следовательно и всего exe-файла
Значение полей MZ-заголовка
+12h
ChkSum
Контрольная сумма
+14h
ExeIP
Значение IP, указанное при входе (точка входа в
программу)
+16h
ReloCS
Сегментное смещение
настройки регистра CS)
+18h
TabOff
Смещение в файле первого элемента таблицы настройки
адресов (обычно 1Сh)
+1Ah
Overlay
Номер для загруженного оверлейного модуля. Для
коренного модуля это поле рано 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)
Активация после внедрения методом переноса
 После срабатывания вируса необходимо
восстановить исходный код зараженного
файла во временный файл
 После завершения работы вируса
запустить текст программы из временного
файла
 Или можно не использовать временный
файл, восстановив рабочую версию
жертвы в том же файле, а затем заразив
ее вновь