╔═══════════════════════════════════════════╗
║ ■ ■ ║
║ █▀ █▀▄ █▀ █▀█ ▀█▀ █ █ █▀▄ █▀ █▀▀ ║
║ THE █ █▄▀ █▄ █▄█ █ █ █ █▄▀ █▄ █▄▄ ║
║ █▄ █ █ █▄ █ █ █ █▄█ █ █ █▄ ▄▄█ ║
║ ■ ■ ║
╚═══════════════════════════════════════════╝
Как заразить неоверлейный EXE-файл
-------------------------------------------------------------------------------
Данная статья рассчитана на тех, кто хотел бы сделать EXE-вирус,
но не еще не сделал, и не знает как. На самом деле это не так сложно, как оно
может показаться (после прочтения описания хэдера). Здесь я описываю
ТОЛЬКО ТЕ вещи, которые необходимы для заражения (без системной лабуды, типа
там как загрузчик EXE работает, что такое relocation table и т.д. - эту
информацио при желании можно найти).
Начнем с оригинального, но довольно полезного совета.
Значить, так, сначала вам необходимо сделать COM-вирь, хоть самый
тупой. Эт так сказать для практики. Если после многочасовой отладки он наконец
заработал, отдохните денек, и попробуйте натоптать новый COM-вирь. Смысл в том,
что новый вы сделаете ГОРАЗДО быстрее, нежели делали старый. Опыт, так сказать,
накапливается. EP. :o)
После этого, я надеюсь, вы будете готовы к факингу EXE. Главный финт
в том, что загрузчик DOS, ежели видит 'MZ' у программы, загружает ее
(а что бы он еще делал?), используя заголовок (хэдер) EXE-файла.
Жизненно важные значения в хэдере - размер программы, точка входа и
сегментные приращения регистров cs и ss. Поскольку ваш вирус имеет вид COM,
то для заражения всего-то и делов остается поставить ip=100h, sp=....
(что-нибудь побольше), а ss и cs установить на начало вируса - 10h.
Не забудте также изменить DTA! Для начала приведу коротенькую табличку
расположения сих величин в хэдере:
+00 'MZ' - Марк Збиновски, или как там его...
Видать, любил себя, шельма. Используется как
индикатор экзешности файла
(иначе будет исполняться как COM)
+02 dw ? - Остаток от деления длины файла на 512 (см далее)
+06 хрень
+08 dw ? - Размер заголовка (хэдера) в параграфах (по 16 байт)
+0A хрень
+0C хрень
+0E dw ? - Смещение сегмента модуля стека (прирост SS)
+10 dw ? - Содержание SP
+12 хрень
+14 dw ? - Содержание IP
+16 dw ? - Смещение сегмента модуля программы (прирост CS)
+18 хрень
+1A хрень
+1B хрень переменной ддины
?? большая хрень (таблица настройки адресов)
Что из этого можно вынести? Две вещи. Во-первых, в заголовке указан
размер файла. Если он совпадает с реальным, то все OK. Если же он меньше,
чем файл есть на самом деле, то значит, это оверлей, и стандартным методом
делать тут нечего. Бывает так, что указаный размер больше. Тогда юзера
порадует красивая надпись "Error in EXE file" или подобная. Указанная длина
равна [04]*512+[02] (с хэдером). Чтобы узнать точку входа на вирус,
необходимо вычесть из этого [8]*10h, то есть длину заголовка.
Во вторых, мы можем вычислить значение CS:IP (точка входа) и SS:SP.
Зачем нам это надо? Дело в том, что переход на вирус мы сделаем прямо из
хэдера (иначе никак), а стек переставлять надо на всякий случай, чтобы не
затереть заготовленные там значения.
Посмотрим теперь на примерное распределение памяти при запуске EXE:
ss:sp
┌───────────┐
│ STACK │ - РАБОТА EXE-файла -
ss:0├───────────┤
│ DATA │
├───────────┤
│ PROGRAM │
cs:0├───────────┤ cs = ds + 10h !
│ PSP │
es:0└───────────┘
ds:0
Запомните: es и ds указывают на сегментный адрес загрузки! Так как вирус
создается как COM, то вам будет необходимо вручную поставить ds равным cs.
С другой стороны, адрес загрузки оказывается прямо в es и ds, что приятно.
Что же необходимо сделать? После того как жертва найдена:
1. Прочитайте первые 16h байт (этого хватит)
2. Вычислите размер файла по схеме и сравните его с
реальным. Если он не совпадет, то пусть идет в жопу.
* 3. Сохраните данные для перехода на носитель.
4. Заполните их значением из хэдера жертвы
5. Измените CS:IP и SS:SP так, чтобы происходил переход
на вирус. (сделайте CS=SS , SP=байт 100-200)
6. Запишите в жертву новый хэдер и свой вирус
7. Верните данные носителя.
8. Тут идет запуск носителя
* - имеются в виду старые значения хэдера носителя, то есть, его
IP, SP, +SS, +CS. Как вычислить CS и SS? Берем сегментный адрес
загрузки файла (он находится например в ES - см таблицу), addим его
к заголовочным значениям CS и SS, затем прибавляем к получившимуся
значению CS еще 10h (не к CS, а к значению CS! :), и все готово.
Установку SS и SP необходимо делать с выключеными прерываниями (cli).
Переход на носитель можно осуществить двумя способами. Можно поставить
jmp far (код 0E8h, ????h, ????h), либо сделать iret, поместив перед
этим в стек флаги, младшее слово, потом старшее слово адреса.
Творите!
/ Джарод
P.S. По вопросам глюкования ваших алгоритмов заражения пишите на
[email protected] (может я в чем ошибся :)