Přesměrování vektorů přerušení na tělo viru

K tomu, aby virus aktivně sledoval dění operačního systému, musí přesměrovat obsluhy vybraných přerušení na své tělo. Nejčastěji obsazovanými přerušeními je int 21h (volání jádra DOSu) a int 13h (diskové operace). Je naprosto běžné, že jeden virus obsazuje hned několik přerušení.

Pro realizaci přesměrování obsluhy přerušení má virus dvě možnosti:

Legální použití služeb DOSu 35h (čti vektor přerušení) a 25h (nastav vektor přerušení)

Tyto služby manipulují s hodnotami uloženými v tabulce vektorů přerušení (interrupt vector table). Tabulka vektorů přerušení je v paměti uložena od adresy 0000:0000 a je tvořena čtyřbajtovými položkami, reprezentujícími offsetovou (2 bajty) a segmentovou (2 bajty) část adresy obsluhy příslušného přerušení. Kapacita tabulky zahrnuje rozsah adres obsluh přerušení int 00h až int ffh. Uvedené služby načítají nebo ukládají čtyři bajty z adresy nebo na adresu 0000:(AL*4), přičemž obsah registru AL označuje požadované přerušení.

mov ax, 3521h			; sluzba 35h, preruseni int 21h
int 21h				; vlastni volani DOSu
mov word ptr cs:[old_int_21h], bx	; offsetova cast
mov word ptr cs:[old_int_21h+2], es	; segmentova cast

Nyní je tedy na adrese old_int_21h uschována hodnota adresy původní obsluhy přerušení int 21h. Tato hodnota bývá nejčastěji přímo využívána v části kódu, který provádí volání této původní obsluhy.

puvodni_obsluha:
			pushf
			db 9ah	; instrukce "call far ptr"
old_int_21h		dd ?	; adresa puvodni obsluhy

Sekvence instrukcí pushf a call far ptr je charakteristická posloupnost pro volání původní obsluhy s možností návratu do uživatelské (v tomto případě virové) obsluhy přerušení. Na úplném konci virové obsluhy int 21h bývá návrat z přerušení realizován, vzhledem k potřebě správného nastavení příznakového registru, nejčastěji instrukcí retf 2 místo klasické instrukce iret.
Po uschování adresy původní obsluhy následuje sekvence provádějící vlastní přesměrování na virovou obsluhu přerušení.

mov ax, cs
mov ds, ax			; DS=CS, segmentova cast
mov dx, offset obsluha_int_21h	; offsetova cast
mov ax, 2521h			; sluzba 25h, preruseni int 21h
int 21h				; vlastni volani DOSu

Nyní má virus zajištěno, že všechny požadavky volání služeb DOSu budou obsluhovány virem. Skutečnost obsazení přerušení int 21h je pro viry důležitá zejména z hlediska jejich replikace. Většina souborových virů monitoruje službu 4bh, provádějící spuštění programu. V tomto okamžiku se totiž začne virus zajímat, zdali právě spuštěný program je či není zavirován...

Přímý zápis do tabulky vektorů přerušení

Snahou je vyhnout se použití volání služeb DOSu 35h a 25h. Virus má, na rozdíl od první možnosti, zajištěno, že jeho operace nebudou připadně zachyceny rezidentním antivirovým hlídačem. monitorujícím nebezpečná volání DOSu. Virus sice provádí stejnou činnost, nicméně vše ve vlastní režii nezávisle na operačním systému.
Nejprve opět následuje úschova adresy původní obsluhy přerušení int 21h.

xor ax, ax			; vynulovani registru AX
mov ds, ax			; segment "interrupt vector table"
les bx, ds:[21h*4]			; nacteni adresy obsluhy do BX a ES
mov word ptr cs:[old_int_21h], bx	; offsetova cast
mov word ptr cs:[old_int_21h+2], es	; segmentova cast

Hodnota ds:[21h*4] představuje offset do tabulky vektorů přerušení pro přerušení int 21h. Instrukce les načte do registru BX slovo z adresy ds:[21h*4], a zároveň do registru ES slovo z adresy ds:[21h*4+2].
A následuje nastavení vlastního přesměrování na virovou obsluhu. Předpokládejme, že se nezměnila nulová hodnota data segmentu.

mov ds:[21h*4], offset obsluha_int_21h		; offsetova cast
mov ds:[21h*4+2], cs			; segmentova cast

Virus v tomto případě zapisuje přímo do systémové části paměti, konkrétně do tabulky vektorů přerušení.