Hlavním heslem těchto virů je: nejlepší obrana je útok. A to taky dodržují. Snaží se obejít
a ještě lépe znemožnit práci antivirovým programům. Proto je mažou, vypínají rezidentní ochrany
apod. Pozornost si zaslouží virus Tequila, který odstraňuje kontrolní součty přidané
pomocí Viruscanu přímo ze souborů.
Stealth virus je rezidentní virus, který se pokouší vyhnout detekci skrytím projevů své přítomnosti
v infikovaných souborech. Aby toto dosáhl, virus zachycuje systémová volání, která prověřují obsah
nebo atributy infikovaných souborů. Výsledky těchto volání musí být změněny tak, aby odpovídaly původnímu
stavu souboru. Toho je schopen pouze tehdy, je-li rezidentní v paměti.
Název těchto virů je odvozen od anglického slova stealth, což znamená lstivou činnost, vykonávanou potajmu,
kradmo apod. Lze tedy již z tohoto názvu leccos soudit o povaze těchto virů. Tímto slovem lze totiž
odznačit ony speciální techniky, které těmto virům zaručují velmi obtížnou detekci jak uživatelem,
tak i antivirovými programy. Většina výzkumníků na poli boje proti virům souhlasí s tím, že viry typu
stealth mají následující charakteristiky:
První charakteristika, že virus skrývá jakoukoliv změnu proveditelných systémových komponent, jej činí velmi
těžko detekovatelným pro uživatele počítače. Jestliže máte důvod domnívat se, že se ve vašem počítači vyskytuje
virus typu stealth nebo sub-stealth, vypněte celý systém a nově jej zaveďte z nenakažené, proti zápisu chráněné,
systémové diskety. Potom se pokuste spustit čistou kopii vašeho antivirového software z diskety, chráněné proti
zápisu. Protože virus už není v paměti, není už zde žádné nebezpečí rozšíření nákazy. Navíc je nyní možné rozeznat
na systémovém pevném disku jakoukoliv změnu v délce souboru či jinou změnu proveditelných systémových komponent,
signalizující infekci virem.
Viry typu sub-stealth pak nazíváme ty viry, které vykazují třeba jen jednu z výše uvedených vlastností. Přesto je třeba
z hlediska úplnosti je již řadit do této skupiny, neboť stejně jako typické viry typu stealth představují pro antivirové
programy vždy určitý problém.
Prvotním účelem kódování bylo znepřehlednit vlastní kód viru a ztížit tak jeho analýzu
(která je nutná k vytvoření antivirového programu). Navíc je tímto postupem zkomplikováno
uzdravení napadeného programu, protože obsah začátku programu je také zakódován.
Takové kódování bývá často realizováno tak, že vlastní kód viru je v programu uložen -
zakódován nějakým jednoduchým algoritmem (oblíbené je provedení operace XOR s každým bajtem
kódu viru) a před vlastním virem se nachází krátká dekódovací smyčka, která zajistí jeho
transformaci do původní podoby.
Takto zakódovaný vir má téměr konstantní podobu (Téměr proto, že stejně jako běžné viry si
potřebuje do svého těla zapsat několik proměnných hodnot, které mohou být v každé generaci
jiné; převážná část viru však zůstává neměnná.)
Novější viry začaly využívat kódování s proměnnou hodnotou k dosažení toto, aby každý
exemplář viru byl z velké části odlišný; shodná zůstává pouze dekódovací smyčka na začátku
programu. To sice značně zkomplikovalo vyhledávání některým antivirovým programům
používajícím charakteristické sekvence, ale neustále je relativně snadné určit kódovací
hodnoty a program dekódovat. Navíc lze stále použít vždy stejně vypadající dekódovací smyčku
k identifikaci viru.
Nástupce této technologie představují polymorfní viry (viz. níže), které používají poměrně
komplikovaných metod k tomu, aby i dekódovací smyčka mohla mít proměnlivou podobu.
Polymorfní viry jsou v jistém pohledu podobné stealth virům. Totiž v tom, že je velmi obtížné je detekovat
antivirovými prostředky. Této stejné skutečnosti však polymorfní viry dosahují jinými prostředky než viry typu stealth.
Polymorfní virus vytváří během replikace kopie, které jsou funkčně ekvivalentní, ale jednotlivé replikace se od sebe
téměř úplně liši - mají podstatně odlišné řetezce byte.
Aby toho virus dosáhl, musí náhodně vkládat přebytečné instrukce, zaměňovat pořadí nezávislých
instrukcí a nebo volit z mnoha různých kódovacích schémat. Tato proměnlivost (polymorfnost) viru jej činí obtížně detekovatelným,
identifikovatelným a odstranitelným, především skenovacími metodami.
Další metoda, která je velmi často používána polymofními viry (ale i jinými viry) je metoda
komplexního zakódování. Komplikovanější polymorfní viry používají metodu komplexního zakódování kombinovanou s vkládáním NOP instrukcí
(No Operation), instrukcí pro zavedení nepoužívaných registrů, různých instrukcí se stejným účinkem atd.
Zakódovaný virus má vždy dvě části: dekódovač, malou část, která rozkódovává virus a pak tělo zakódovaného viru.
Když je virus spuštěn, nejprve se spustí dekódovač, který rozkóduje tělo viru. Pak může být spuštěno tělo viru, to se replikuje
nebo stává rezidentním. Toto tělo viru bude zahrnovat kódovač, který pracuje během replikace. Proměnné zakódovávací viry jsou pro
studium mnohem obtížnější, protože programátor musí nejprve dekódovat jejich kód.
Navíc, je-li totiž virus zakódován, není možno jej vyhledat běžnou skupinou antivirových programů, které nazýváme kontrolní (nebo skenovací),
a které pro detekci virů používají metodu porovnávání virů s určitou databankou tak zvaných charakteristických
řetězců (signatur) virů. Samozřejmě, že čím je zakódování složitější a komplexnější, tím je detekce viru obtížnější i ostatními
typy antivirových prostředků.
![]() |
Příklad souboru před zavirováním... |
![]() |
...a po zavirování virem OneHalf.3544. Všimněte si deseti krátkých programků, které jsou náhodně rozneseny před samotným virem. Tyto prográmky jsou navzájem propojeny skoky, a dohromady tvoří dekódovací rutinu. Na zmatení antivirů jsou tyto krátké prográmky plné nic nedělajících instrukcí jako: nop, stc, clc, sti, cs:, ss:, ds:, cld, std, cmc. |
Velmi zajímavá skupina... V napadnutém souboru se totiž nenachází virus v klasickém smyslu.
Napadený soubor totiž obsahuje jen kompilátor, společně se zdrojovým pseudokódem viru. Při spuštění infikovaného souboru vytvoří
kompilátor v paměti novou, pokaždé odlišnou kopii viru. Kompilátor neobsahuje žádné podezřelé instrukce a virus je proto
nedetekovatelný heuristickou analýzou. Statický zdrojový pseudokód viru je v infikovaném souboru zakódován a odkódovává
se průběžně během kompilace. Po kompilaci se opět zakóduje, ale s jiným klíčem.
Tato skupina je především zastoupena rodinou slovenských virů TMC.
Pro sestavení jsem využil článek od Miroslava Trnky z ESETu (NOD Antivirus). O sestavení se zasloužil MGL.
Nejznámější technikou, kterou se virus brání je známá pod pojmem tunelování. To spočívá ve schopnosti vyhledávat
původní adresy systémových, nejčastěji diskových služeb a ty pak používat při práci s disky ve snaze obejít případný
antivirový software. Ten totiž může, obdobně jako viry, obsahovat rezidentní část, která je nainstalována v paměti,
má převzaty adresy systémových služeb a monitoruje dění v systému a snaží se zabránit neoprávněným nebo podezřelým akcím.
Jiný způsob aktivního boje proti antivirovým programům spočívá přímo v manipulaci s jeho rezidentní částí. Některé antiviry
totiž komunikují se svými rezidentními hlídači pomocí několika snadno přístupných služeb (které jsou nadto v mnoha pramenech
dokumentovány) a obsahují i funkci "dočasné deaktivace" hlídače. Pro vir tedy není nic snažšího, než se dotázat (jak jinak,
než pomocí zmíněných služeb) na přítomnost takovýchto rezidentních hlídačů v paměti, a pakliže tyto úslužně odpoví "ano, jsem tady",
pomocí známé služby je deaktivovat.
Vir může také obsahovat část kódu, která manipuluje s datovými soubory antivirů (to však jsou spíše retroviry), nejčastěji s databází
sekvencí virů nebo kontrolních součtů. Jejich změnou nebo smazáním může dosáhnout toho, že zůstane při antivirové kontrole neodhalen.
Tímto termínem jsou označovány ty rezidentní viry, které neinfikují pouze soubory, které jsou spouštěny, ale i ty programy, se kterými je manipulováno jiným způsobem (jsou kopírovány, pohlíženy, archivovány apod.). Existuje mnoho variant, které se liší tím, při jakých činnostech jsou programy infikovány, avšak v podstatě všechny jsou stejně nebezpečné, jak jednoduchá byla původní myšlenka. Mimo jiné totiž tento mechanismus způsobí, že například antivirový program, který nezná daný vir a který při kontrole prohlédne všechny spustitelné soubory na disku, roznese infekci do všech těchto souborů !
Je do jisté míry opakem předchozího. Tento mechanismus vybere k napadení pouze takový program, do kterého je právě zapisováno. Tím se sice radikálně omezí pole působnosti, na druhé straně je obtížnější takový vir odhalit, neboť modifikuje programy, u kterých modifikaci očekáváme (protože jsme do nich sami zapisovali).
Častým jevem, se kterým se lze v těle viru setkat, je používání technik, které ztěžují trasování a analýzu kódu. K tomu jsou
využívány méně známé vlastnosti počítače a procesoru a takové programové konstrukce, které kolidují s použitím ladících prostředků,
používaných při analýze viru.
Těchto postupů je celá řada a není možné (ani účelné) pokoušet se o jejich úplný výčet, proto vás seznámíme jen s vybranými zástupci.
Proti trasování kódu debuggerem se viry brání například vkládáním časově závislého kódu. To znamená, že program předpokládá, že se nějaká
část kódu provede v určitém, velmi krátkém časovém intervalu. Pokud je program trasován ručně, instrukci po instrukci, je tato doba pochopitelně
nesrovnatelně delší a vykonávání programu se pak může ubírat zcela odlišnou větví.
Jiným příkladem je kód, v průběhu jehož provádění nelze zapisovat do zásobníku (což je činnost, bez které se debugger za běžných okolností neobejde).
Pokud se někdo takový kód pokusí neuváženě protrasovat v debuggeru, pravděpodobně na první pokus neuspěje.
Dalším poměrně účinným trikem bylo využití fronty předzpracovaných instrukcí v procesoru (prefetch queue). Jejím důsledkem je to, že
změna v paměti, která se týká instrukce již načtené v procesoru, nemá na provádění této operace vliv (procesor tedy provede původní, nezměněnou instrukci).
To ovšem platí, pouze pokud je kód korektně vykonáván. V případě trasování dochází mezi vykonáním každé instrukce sledovaného programu k provedení mnoha jiných
činností, v důsledku čehož je fronta procesoru vyprázdněna a později je do ní načtena již pozměněná instrukce. Tento jev lze ve virech občas zpozorovat, paradoxně
však častěji není použit úmyslně k obelstění debuggeru, ale způsobuje chybnou činnost viru.
Tento efekt se totiž neprojevoval na starých počítačích vybavených procesory 8088 (a opět by už neměl fungovat na procesorech Pentium), což
mělo za následek, že některé viry napsané pro tyto procesory přestaly na novějších typech fungovat.