[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 7, Sep 1998                                           file 003

                             - S P R E A D E R -
                             Описание технологии
                                                     by FRiZER


                       Идея: Alternative Coder // TAVC
              Реализация и отлов части глюков: Thesaurus // TAVC
      Доведение до ума и отлов оставшихся глюков: FRiZER // independent

        Вирус содержит таблицу вида

        <смещение команды/блока команд>, <длина команды/блока команд>

        Hаходя  очередной  .com-файл, он ищет в нем соответствующие куски
     кода  и  оформляет  таблицу.  Если  участок  кода  не  найден, то он
     дописывается  в  конец  заражаемого  файла. Только после всего этого
     первые  n  байт  жертвы  записываются в конец программы (n = размеру
     части  вируса,  включающего таблицу комманд). Таким образом, не зная
     первоначальную  длину файла, полностью удалить вирус из него нельзя,
     т.к.  невозможно  различить  конец старого файла и начало участка не
     найденых  блоков  кода, т.е. после излечения в конце файла останется
     болтаться кусок мусора.
        Также  для  различных файлов будет различное приращение длины при
     заражении.

        Дальше.  Вирус  не имеет подозрительного кода (это не относится к
     только  что  откомпилированному исходнику ;) - он разбросан по всему
     телу жертвы. Есть только обработчики Int 1h и Int 3h. В каждом блоке
     (в процессе выполнения кода вируса) первая команда генерирует Int 1.
     Обработчик    смотрит    на    адрес    возврата    и   сравнивает с
     <смещение>+<длина>.  Если  не  равны,  то  трассировка прекращается,
     после  блока  ставится  breakpoint  и  он  запускается. Иначе - блок
     состоит  из  одной  команды,  переходим  к следующему. Hомера блоков
     индексируются  регистром  bp. Соответственно, меняя bp, можно делать
     переходы  из одного блока в другой, циклы и т.п. Команды 'Int xx' не
     трассируются,   а  эмулируются  (см.  исходник).  В  зависимости  от
     заражаемого  файла,  к  нему  приписывается  разное количество кода.
     Почти  наверняка  CD  21  ни к одному файлу приписано не будет, т.к.
     есть в программах.

        В  вирусе  полно отладочной информации (выключаемо), в которой не
     сложно разобраться.

     основной файл - main.asm
     файл myxa.bat - для генерации жертв
                   - без параметров источником будет являться test.coz
                   - если указать имя файла, то он его сделает жертвами.
     extrcode.asm  - выделяет код вируса (который в code.inc) в отдельный
                     файл в целях отладки.

        Если  есть  желание  написать собственный вирус, использующий эту
     технологию, то нужно помнить о некоторых ее особенностях:

     1) Если на метку передается управление с помощью "lea bp,@label", то
        нужно  в  code.inc  после  label: в первой же метке @m??? ставить
        nop, причем команда nop не должна быть начало блока.

     2) Вызов прерывания ( CD?? ) не должен быть первой командой в блоке,
        иначе  команды,  следующие  за  CD??  выполнятьсе не будут. Нужно
        либо  ставить  CD??  в  середину блока, либо просто как отдельную
        команду.

     3) В  блоке,  в отличие от команды, "lea bp,@label" не одно и то же,
        что jmp label => команды в блоке, следующие после "lea bp,@label"
        будут выполняться до окончания блока.

     4) Всяческие циклы и другие вещи,  выполняющиеся по многу раз, лучше
        делать  отдельным  блоком.  Хоть шансов найти такой блок в жертве
        практически никаких, зато хоть вирь тормозить не будет.

     5) При выполнении  блока генерации таблицы  команда после блока, где
        она  происходит,  заменена  на  int3  (CCh),  и, следовательно, в
        следующем поколении там будет уже не оригинальная команда, а int3
        с  остатками  команды.  Это  учтено в блоке создания таблицы, так
        что,  при  создании  своего виря на основе этой технологии, лучше
        использовать  блок  начинающийся  с метки infect_by_next до метки
        stop_infect, либо учитывать это и решать проблему самостоятельно.