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í.