Skenery - detaily
Souborové skenery
První a nejstarší metodou je hledání virů podle řetězců (tj. podle sekvence bajtů obsažených ve viru).
Je to něco podobného, jako když hledáte např. v Microsoft Wordu nějaký kus textu (stisknete CTRL-F a...).
Skenery využívající tuto metodu však nemačkají žádné CTRL-F, ale hledají tyto kusy v souborech.
Nejstarší antiviry hledaly řetežce v celých souborech, což mohlo výrazně zpomalit rychlost skenování.
Ty inteligentnější "projely" několik prvních bajtů souboru a zjistily si např.: adresu vstupního bodu (entry-point) a
řetězec hledaly až tam. Řetězec musí být pečlivě vybrán a musí být dostatečně dlouhý. Pokud by tomu tak nebylo,
mohl by řetězec způsobovat falešné poplachy (např. díky tomu, že stejný řetězec se vyskytuje někde jinde, ale ne v "rukách" viru).
Např. můj jednoduchý antivirus AntiTiny99 (viz. stránka Download/Univerzální antiviry/BlackJack) používá řetězec, který je dlouhý 16 bajtů (tj. šestnáct znaků). Tím, že tento
řetězec hledám pouze v prvních 16 bajtech souboru můžu zcela vyloučit případ, kdy antivirus ohlasí falešný poplach.
S příchodem kódovaných virů však nastal problém. Např. virus Pojer.1919 vypadá v každém souboru (exempláři) odlišně, pouze malá část jeho
těla má pokaždé stejný (konstantní) vzhled v každém jeho exempláři. Tato stále konstatní část se nazývá dekódovací smyčka (decryptor).
Pouze na této části lze aplikovat hledání podle řetězce (které jsou doplněny už i o věci typu ??, *).
Řetězce nelze využít
na hledání polymorfních virů (ty nemají na "povrchu" žádnou část těla konstatní). Na detekci takových virů se původně
používaly algoritmy, které dokázaly zjistit, zda se jedná o dekódovací smyčku viru či ne. Detekce pomocí algoritmů
však měla jednu nevýhodu - většinou platilo: jeden polymorfní virus=jeden algoritmus. Při dnešním počtu polymorfních
virů by byl takový antivirus využívající tuto techniku dosti dlouhý (a antivirovým odborníkům by to dalo dost práce).
Proto se časem objevila technika zvaná "emulátor kódu". Emulátor kódu tvoří i základ pro aktivní heuristickou analýzu (o tom ale až dále).
Emulátor kódu v podstatě "spouští" soubory, které jsou určeny k testu. Vše však probíhá v tzv. "virtuálním prostředí", kde
je vše jen ve "virtuální podobě" (tj. "virtuální disketa", "virtuální paměť" atd.). Po "virtuálním spuštění souboru" sleduje
emulátor registry procesoru (CPU) a postupuje zkrz soubor tak, jako kdyby byl doopravdy spuštěn. V podstatě emulátor vykoná i činnost
případného viru - proemuluje dekódovací smyčku (decryptor) a dostane se tak přímo k "vnitřnostem" viru, kde už může
skener pokojně vyhledávat podle sekvencí (díky tomu, že se emulace dostala pod "povrch"-"kůži" viru, kde již je tělo viru prakticky konstantní).
Pokud jsou během emulace sbírány informace o aktivitách programu (např. proces přesměrování vektorů přerušení...), může být do akce
zapojena i aktivní heuristická analýza, která na základě získaných informací vyhodnotí, zda se ne/jedná o virus. Jelikož emulace programu probíhá pomaleji
než při skutečném spuštění programu, má emulátor tzv. TimeOut - tj. čas (či počet instrukcí), po kterém (po kterých) se chod emulátoru na aktuálním souboru zastaví.
Problém však nastal s příchodem Windows 9x/NT a souborů PE EXE. Ty mají zcela odlišnou strukturu, vše je složitější, delší atd.
Snad ještě žádný antivirus nevyužívá emulátor kódu v PE EXE (díky zmiňované rozsáhlosti). Pokud se setkáme s heuristikou, která
dokáže detekovat neznámé viry v PE EXE, většinou se jedná o pasivní heuristiku, nebo něco, co se heuristice jen blíží (např.
sledování, zda mají sekce v PE EXE příznaky ke čtení i zápisu, kam směřuje entry-point apod.).
První antiviry, které využívají emulátor i v případě kódu v PE EXE již existují. Podle informací mezi ně patří například: RAV, AVP, NOD32.
Tyto antiviry však musí řešit další problém, který vytvářejí viry, využívající tzv. EPO techniku (Entrypoint Obscuring). Jde o to, že virus nemodifikuje entry-point,
ani na začátek kódu nevkládá nějakou instrukci skoku (JMP), ale snaží se "zašít" někam nakonec. Virus se postará například o to, aby byl
spuštěn až po zavolání určité API funkce původním programem. Pokud si virus zajistí, aby byl spuštěn při volání funkce ExitProcess API, může si
být jistý, že se bude aktivovat až na konci celého "mechanismu". Idea EPO techniky je jasná: znesnadnit antivirům detekci. Emulátor kódu totiž
většinou testuje pouze začátek programu (první instrukce) a na analýzu má vyčleněnou velice krátkou dobu. Není tedy pravděpodobné, že by se dopracovala až
k volání služby ExitProcess a virus tak objevila.
Starší heuristické analýzy byly označovány za pasivní. První z nich byla použita v antivirech F-PROT a TBAV.
V podstatě šlo o to, že pasivní heuristika projížděla pouze po "povrchu" souboru a hledala typické příznaky pro virus. Pokud
bylo takových příznaků (flags) nalezeno dostatečné množství, byl takový soubor považován za napadený. Příznaky
byly opět hledány, podle krátkých řetězců, které byly pro virus typické (např. volání nějaké služby INT 21h apod.).
Nevýhodou bylo, že pasivní heuristika nedokázala proniknout pod "povrch" (pod "kůži") viru a tak nezabírala na složitější viry.
Navíc šlo taky neaktivní heuristiku snadno oklamat. Pokud antivirus považoval za příznak třeba souhrn instrukcí: mov ah,40; int 21h (v hex. soustavě: B440CD21) pak
bylo možné pasivní heuristiku oklamat souhrnem instrukcí, které vyjadřují dohromady totéž: mov ah,3f; inc ah; int 21h (B43FFEC4CD21).
Skenování paměti
Skenování paměti má velmi společného se skenováním souborů (viz. výše). V paměti jsou totiž hledány stejné řetězce jako v souboru.
Skener paměti se zaměřuje pouze na viry vytížená místa v paměti. Antivirus se většinou
snaží vyhnout vlastnímu kódu (který je taktéž v paměti). Pokud by se tak nestalo, mohl by hlásit falešný poplach. Někdy tato situace
nastane, pokud po sobě spustíte dva antiviry, nebo když běží nějaký rezidentní skener, ke kterému spustíte nerezidentní skener (on-demand)
konkurenční firmy. Antivirové programy by si měli po sobě paměť důkladně uklidit (obzvláště místa, kam si uložily řetězce, podle kterých viry
v paměti/souborech/oblastech hledaly). Falešný poplach může nastat i pokud např. kopírujete infikované soubory a pak spustíte test paměti nějakého
antiviru. Skenování paměti je v podstatě dosti jednoduchá záležitost. Hledá se jen sekvence - žádná emulace. Někdy jsou falešné poplachy
na denním pořádku. Nutno podotknout, že třeba antivirus Kaspersky Anti-Virus používá odlišnou techniku pro hledání virů v paměti, které pojem "falešný poplach" nic neříká.
Právě s tímto antivirem souvisí i deaktivace aktivního viru v operační paměti. V podstatě je to taková ptákovina pro líné uživatele, kteří nechtějí bootovat z čisté systémové diskety.
Proces při kterém dojde k deaktivaci dosud aktivního viru v operační paměti je celkem jednoduchý: jde o to, že antivirus opraví adresy přesměrovaných přerušení (které ukazují na virus) na původní hodnoty.
Původní adresy přerušení může získat přímo v těle viru (proč ? bližší info zde) nebo musí antivirus tyto adresy znát. Přímé odkazy
na obsluhu přerušení může antivirus využít i k anti-stealth technikám (bližší info zde).
K napsání tohoto článku mě inspirovalo přečtění ezinu Asterix 2.