Speciální techniky virů (obecný přehled)
Retro viry - odvetné viry
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ů.
Neviditelné viry - Stealth viruses (Sub-Stealth viruses)
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:
- Virus skrývá jakoukoliv změnu proveditelných komponent v systému, jako je např. změna délky souboru, nebo
změna boot sektoru, nebo tabulky rozdělení disku, jedná-li se o virus rezidentní v paměti nebo o změnu velikosti
paměti.
- Virus je schopen dezinfikovat programy "za letu". Např. když je nakažený program načítán do paměti, je tento
program dezinfikován. Tato technika umožňuje, že i po použití antivirového software není známo nic o
přítomnosti viru.
- Viry typu stealth ve většině případů (ale není to pravidlem) infikují programy v okamžiku,
kdy jsou otevírány, kromě klasické možnosti infekce v okamžiku, kdy jsou spuštěny. Výsledkem toho, že proveditelné
programy jsou rovněž infikovány při otevření, je velmi rychlé rozšíření viru po celém systému.
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.
Kódované viry - Crypted viruses
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í (mutační) viry - Polymorphic viruses
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. |
V praxi probíhá zakódovávání nejrůznějšími způsoby. Jedním z nich je vzít prostě "náhodné" číslo, jako je třeba hodnota
sekundového pole v systémovém času, kdy dojde k infekci, a provést jednoduché zakódování hodnoty každého byte ve virovém kódu.
Pouze krátký kousek na začátku (rovněž polymorfní) je ponechán pro dekódování zbytku viru, když přijde čas, aby se virus
aktivoval. Zakódování se může ale také dít jinými způsoby: zakódování pravidelného počtu, ale libovolných byte, nebo zakódování kódu jako celku,
a nikoliv byte po byte.
To znamená, že je tu vždy alespoň půl tuctu možností, jak dojít ke stejnému konci. Tomu napomáhá skutečnost, že mnohé programovací
funkce jsou komutativní, tedy nezáleží na pořadí, ve kterém jsou tyto funkce uvedeny. To znamená, že jen velmi malé kousky kódu,
kousky příliš malé na to, aby mohly být použity jako signaturový řetězec, mohou být znovu obnoveny různými způsoby po každé, když virus infikuje
nový soubor.
Předchůdcem těchto virů byly tzv. sebezakódovávácí virové programy. Existují i starší a omezené "sebezakódovávací" virové programy, které jsou řazeny
do skupiny virů polymorfních. Tyto sebezakódovávací viry měly omezený počet "variant" i když např. z této skupiny nejlepší virus
Whale dosáhl až 40 různých forem.
Technikou využívanou těmito viry byla volba mezi různými zakódovávacími schématy, které vyžadují různé dekódovací programy: pouze jeden z těchto programů
mohl být jasně viditelný v dané replikace viru. Virový skener by tedy pro detekci takového viru potřeboval mnoho charakteristických řětezců
(jede pro každou možnou metodu dekódování).
Podrobnější informace lze získat v kapitole "konstrukce polymorfních virů".
Metamorfní viry
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.
Tunelující viry
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.
Rychlé / Pomalé infektory (Fast / Slow Infectors)
- Fast infector
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ů !
- Slow infector
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).
Obrana viru proti krokování kódu
Č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.

|