![]() |
![]() |
|
Přesměrování vektorů přerušení na tělo viruK 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. 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. 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]. 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í. |
||
![]() |
![]() |