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" virem | Po "převzetí služby" virem |
Běží uživatelský program | Běží uživatelský program |
Vyvolá systémovou službu | Vyvolá systémovou službu |
Operační systém provede požadovanou operaci | Vir prozkoumá požadavek a udělá, co uzná za vhodné; Případně se ke slovu dostane i OS |
Uživatelský program pokračuje | Už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)