Игорь Гульев - Создаем вирус и антивирус
Приложения
В приложениях приведена информация, которая может быть полезна программистам не только при написании вирусов, но и при создании других программ. Описано более 100 различных функций DOS, AMIBIOS и DPMI (в том числе недокументированные).
Приложение А Форматы заголовков EXE-файлов
Формат заголовка обычного EXE-файла
В начале EXE-файла расположена форматированная часть заголовка EXE-файла (Таблица А-1).
Далее следует таблица настройки адресов (Relocation Table), состоящая из длинных указателей (смещение: сегмент) на те слова в загрузочном модуле, которые содержат настраиваемые сегментные адреса. Примечание: элементы таблицы настройки могут быть расположены не по порядку.
Таблица А-1. Формат заголовка обычного EXE-файла
Формат заголовка NE-executable EXE-файла
В состав старого заголовка входят:
– обычный EXE-заголовок (Таблица A-2);
– зарезервированная часть;
– указатель на новый заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала нового заголовка);
– DOS-программа (STUB).
Таблица A-2. Формат обычного EXE-заголовка в NE-executable EXE-файле
В состав нового заголовка входят:
– инфоблок (Таблица A-3);
– таблица сегментов (Таблица A-4);
– таблица ресурсов (Таблица A-5);
Таблица A-3. Формат NE-заголовка
Таблица A-4. Формат таблицы сегментов
Таблица A-5. Формат таблицы ресурсов
– таблица резидентных имен;
– таблица ссылок на модули;
– таблица импортируемых имен;
– таблица входов (Таблицы A-6 и A-7);
– таблица нерезидентных имен.
В заголовке нового стиля содержится вся информация, необходимая для сегментированного исполняемого файла – заголовки таблицы сегментов, ресурсов и имен.
Сразу за заголовком находится таблица сегментов. В ней содержится описание каждого сегмента исполняемого файла.
Таблица ресурсов. Ресурсами являются все основные объекты интерфейса – диалоговые окна, меню, курсоры, растровые изображения, значки и так далее.
Формат таблицы ресурсов (смещения относительно начала входа каждого ресурса). Значения в диапазоне смещений 02-12h повторяются в таблице до тех пор, пока величина по смещению 02h не станет равной нулю. Значения в диапазоне от 0Ah до 12h повторяются столько раз, сколько указано по адресу 04h.
Таблица A-6. Таблица входов перемещаемого сегментаТаблица A-7. Таблица входов фиксированного сегмента
Таблица резидентных имен. В ней содержатся строки, идентифицирующие экспортируемые функции исполняемого файла. Постоянно находятся в памяти и никогда не сбрасываются на диск. Верхний и нижний регистры различаются, ноль в конце отсутствует.
Данные в таблице находятся в виде:
– длина строки (равна нулю, если в таблице нет дополнительных строк);
– строка резидентного имени (первая строка – имя модуля);
– порядковый номер, идентифицирующий строку. Может использоваться в качестве индексного выхода в таблицу.
Таблица ссылок на модули. В ней содержится список смещений имен модулей, хранящихся в таблице импортируемых имен. Каждый вход в таблице есть двубайтное последовательное число.
Таблица импортируемых имен. В ней записаны имена модулей, импортируемых в исполняемый файл. Каждый вход состоит из двух частей – байта длины строки и собственно строки.
Таблица входов. В ней содержатся группы точек входа в исполняемый файл.
Эти группы создаются редактором связей и последовательно пронумерованы (начиная с 1). Каждая группа начинается с двухбайтного заголовка, который содержит число входов в группе (00h – конец таблицы) и дополнительную информацию о сегменте (FFh – перемещаемый, FEh – вход относится к константе, определенной внутри модуля, иначе вход является индексом сегмента). Для перемещаемых сегментов каждый вход состоит из шести байт, а для фиксированных – из трех.
Таблица нерезидентных имен. Содержит имена экспортируемых функций, содержащихся в исполняемом файле. Эти имена не всегда остаются резидентными в памяти. Структура полностью совпадает со структурой таблицы резидентных имен.
Сегменты кода и данных. Если в сегменте кода содержатся вызовы функций, определенных в других сегментах, то для таких вызовов необходимо использовать таблицы перемещений. Они располагаются непосредственно за кодом или данными в сегменте. В двух первых байтах содержится число элементов таблицы.
Таблица содержит:
– тип адресации (только сегмент, только смещение, или и то, и другое);
– тип перемещения (внутренняя ссылка, импортируемый порядковый номер, импортируемое имя);
– номер сегмента или порядковый ID (для внутренних ссылок);
– индекс таблицы ссылок или порядковый номер функции;
– индекс таблицы ссылок или смещение таблицы имен (для импортируемых имен).
Формат заголовка PE-executable EXE-файла
В состав старого заголовка входят:
– обычный EXE-заголовок (Таблица A-8);
– зарезервированная часть;
– указатель на PE-заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению 18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала PE-заголовка);
– DOS-программа (STUB).
В состав нового заголовка входят:
– PE-заголовок (Таблица A-9);
– таблица объектов (Таблица A-10);
– таблицы ресурсов, импортируемых и экспортируемых имен, настройки адресов.Таблица A-8. Формат обычного EXE-заголовка в PE-executable EXE-файле
Таблица A-9. Формат PE-заголовка
Таблица A-10. Формат таблицы объектов
Приложение Б Функции DOS (INT 21h)
DOS, функция 00h
Завершить программу
Вход:
AH=00h
CS – сегмент PSP завершающегося процесса
Описание. Передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20h (Terminate). Регистр CS должен указывать на PSP. Восстанавливает векторы прерываний DOS 22h-24h (Завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. Выполняет сброс файловых буферов. Файлы должны быть предварительно закрыты, если их длина изменилась.
Примечание.
Данная функция не рекомендуется к использованию. Для выхода из программы лучше использовать функцию DOS 4Ch.
DOS, функция 01h Считать со стандартного устройства вводаВход:
AH=01hВыход: AL – символ, полученный из стандартного ввода
Описание. Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При обнаружении Ctrl-Break выполняется INT 23h.
Примечание.
Ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и другие) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.
DOS, функция 02h Записать в стандартное устройство выводаВход:
AH=02h
DL – символ, выводимый в стандартный выводОписание.
Посылает символ из DL в стандартное устройство вывода. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23h.
DOS, функция 03h Считать символа со стандартного вспомогательного устройстваВход:
AH=03hВыход: AL – символ, введенный со стандартного вспомогательного устройства
Описание. Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL.
Примечание.
Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битные слова. Команда DOS MODE используется для установки иных характеристик.
DOS, функция 04h Записать символ в стандартное вспомогательное устройствоВход:
AH=04h
DL – символ, выводимый в стандартное вспомогательное устройствоОписание.
Посылает символ, находящийся в регистре DL, на стандартное вспомогательное устройство, COM1 или AUX.
DOS, функция 05h Вывести на принтерВход: