Igiho stránka o virech
Novinky
Kniha o virech
1.Pomoc
Testy
Odkazy
Download
AV-Konference
Akce
Autor

Paměťově rezidentní viry - DOS

Umístění viru rezidentně v paměti probíhá ve dvou krocích. Prvním je vyhledání nebo vytvoření vhodného místa, kam by se vir umístil. Takové místo musí být jednak dostatečně velké, jednak dostatečně bezpečné.
V případě boot viru není výběr možností nijak převratný. Vir se totiž instaluje do paměti v okamžiku, kdy ještě není zaveden operační systém a nemá tedy k dispozici ani to málo funkcí pro manipulaci s pamětí, které DOS nabízí.
Naprosto nejčastějším způsobem, kterým se boot viry s tímto problémem vypořádávají, je snížení velikosti základní paměti a využití takto uvolněného místa. Datová oblast BIOSu obsahuje proměnnou, která říká, kolik základní paměti je k dispozici. Ve většině případů obsahuje tato proměnná hodnotu 640, což je maximální velikost základní paměti v kilobajtech. Pokud vir tuto hodnotu sníží, operační systém se domnívá, že má k dispozici méně paměti, a ani se nepokouší využívat tu část, která by tam podle něj být neměla, a vir se tedy může do této oblasti bezpečně nastěhovat.
K nevýhodám uvedené metody patří také poměrně snadná možnost zjistit netypickou velikost základní paměti. (Ovšem pozor, některá zařízení využívají tuto oblast obdobným způsobem jako viry, je tedy třeba zvážit, jestli se jedná o běžný stav nebo ke změně došlo bez nějakého zjevného důvodu.)
Jinou metodou, kterou používají některé, zejména menší viry, je využití malých volných oblastí v datových oblastech v dobré víře, že do nich nebude nikdo jiný zapisovat. S využitím této techniky se lze občas setkat i v těle některých souborových virů. (Dlužno podotknout, že podobný způsob zacházení s pamětí je operačním systémem chápán jako zdvořilá prosba o jeho havárii).
Důmyslnější boot viry využívají techniku jakéhosi "meziskladu", kterým řeší dočasnou nedostupnost služeb pro manipulaci s pamětí. Její princip spočívá v tom, že se vir umístí do oblasti paměti, o které předpokládá, že nebude po určitou, poměrně krátkou, dobu změněna (typicky se k těmto účelům využívá horní část videoram, která není v běžném textovém režimu využívána). Poté nechá zavést operační systém a teprve pak se překopíruje na definitivní pozici s využitím všech možností, které mají souborové viry.
Souborové viry mohou využívat buď standardní kolekci tří služeb pro práci s pamětí (alokuj blok, uvolni blok, změň velikost bloku), nebo mohou použít několik různých, většinou nedokumentovaných zásahů do řídících struktur DOSu. To má pro ně oporoti využití systémových služeb tu výhodu, že takto zrezidentněný vir nebude figurovat na případném seznamu rezidentních programů.
Modernější viry se také naučily manipulovat nejen se základní pamětí, ale dokáží se usadit i v paměti nad hranicí 640 KB, pokud je dostupná. Typickým příkladem může být virus Tremor.
Některé z pokročilejších virů mohou dokonce sledovat hospodaření jiných programů s pamětí a v případě, když usoudí, že se pro ně uvolnilo vhodnější místo, mohou se přesunout ze svého současného působiště do nového.
Aby mělo usídlení kopie viru v paměti nějaký smysl, musí být vir nějak spojen se systémem. Toto spojení bývá realizováno přesměrováním vhodných systémových služeb do těla viru. Důsledkem takovéto vazby na systém je, že v průběhu řádné činnosti systému jsou ve vybraných okamžicích aktivovány určité části viru.
Přesměrování služeb se provádí změnou tzv. vektorů přerušení, což jsou adresy, na které se předává řízení v případě generování přerušení (systémové služby jsou realizovány právě voláním přerušení). Tabulka adres těchto služeb je uložena na konstantním místě v operační paměti (na jejím úplném začátku) a v operačním systému DOS je bohužel nekontrolovatelně přístupná všem programům, které z ní mohou hodnoty nejen beztrestně číst, ale také do ní zapisovat.
Standardní postup převzetí systémové služby virem spočívá v naplnění vektoru přerušení adresou směřující do těla viru. Při vyvolání přerušení vir provede vlastní činnost a poté, pomocí zapamatované původní hodnoty vektoru přerušení zavolá původní funkci (možný je i opačný postup, kdy vir nejdříve zavolá původní systémovou službu a poté provede vlastní činnost, případně vir původní službu nevolá vůbec a její činnost zcela nahradí). Velmi zjednodušeně lze dění v systému znázornit následovně:

Před "převzetím služby" viremPo "převzetí služby" virem
Běží uživatelský programBěží uživatelský program
Vyvolá systémovou službuVyvolá systémovou službu
Operační systém provede požadovanou operaciVir prozkoumá požadavek a udělá, co uzná za vhodné;
Případně se ke slovu dostane i OS
Uživatelský program pokračujeUživatelský program pokračuje

Vlastní čtení a změnu hodnot vektorů přerušení lze realizovat opět pomocí služeb DOSu. Používání těchto služeb lze ovšem snadno monitorovat, proto se mnoho virů uchyluje ke změně vektorů přerušením přímo do tabulky vektorů, které se nachází zcela na začátku operační paměti, což je jednak méně nápadné, a pokud je programátor šikovný, i kratší.
Složitější viry občas nevyužívají tuto přímou metodu převzetí vektoru, místo toho směrují službu do svého těla před jakýsi "můstek" umístěný odděleně od těla viru, jehož kód nedělá nic jiného, než že bezprostředně zavolá cílovou funkci viru.
Toto řešení není samoúčelné, ale má z pohledu virů jisté výhody. Jedná se o typický produkt souboje virů a antivirů; ty se totiž naučily sledovat, kam ukazují vektory některých důležitých služeb, a pátrat v jejich okolí po kódu viru. Uvedený postup se jim to pokouší alespoň zkomplikovat, také ruční analýza takového kódu je obtížnější.

Zdroj: Praktická sebeobrana proti virům (Petr Odehnal, Petr Zahradníček)

Zpět