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

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:

    1. 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.
    2. 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.
    3. 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.

    Zpět