╔═══════════════════════════════════════════╗
                 ║ ■                                       ■ ║
                 ║      █▀ █▀▄ █▀ █▀█ ▀█▀ █ █ █▀▄ █▀ █▀▀     ║
                 ║  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] (может я в чем ошибся :)