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)
Активация после внедрения методом переноса
После срабатывания вируса необходимо
восстановить исходный код зараженного
файла во временный файл
После завершения работы вируса
запустить текст программы из временного
файла
Или можно не использовать временный
файл, восстановив рабочую версию
жертвы в том же файле, а затем заразив
ее вновь