V tomto pokracovani virusov, v exponencialne rastucom case nasledujucom po predoslom dieli sa zameriam na obecne stealth techniky a pokusim sa podchytit vsetko, co ma nieco spolocne so skrytim virusu v systeme. Tym by sa mala uzavriet seria popisu nezaujimavych virusovych zalezitosti a prejde sa na skutocne maso ;)
Jedna vec je zavirit binarku, zaviest virus zo zavirenej binarky a druha vec je skryt pritomnost virusu v pocitaci pred antivirusmi a inymi zbesilostami, ktore sa snazia o ich zneskodenie. V pocitaci ziadne kricky (angl. bushes) nie su, takze sa za ne virus pred antivirakom schovat nemoze, musi preto pouzit ine cesty. Cesta, ako dosiahnut maskovania virusu v pocitaci vedie cez samotny dovod existencie BIOSu a operacneho systemu. BIOS je v pocitaci preto, aby zjednotil pristup k periferiam pocitaca a operacny system je v pocitaci preto, aby zjednotil pristup uzivatela k pocitacu (filesystem, memory managment atd.). V beznej civilizovanej spolocnosti (akou MS-DOS, hlavne jeho prve verzie neboli) platilo pravidlo, ze vsetko (vratane operacneho systemu) k hardware-u pristupuje cez BIOS a takisto platilo, ze vsetky programy k prostriedkom pocitaca pristupuju prostrednictvom operacneho systemu. Nakolko antivirus, chce ci nie, je len aplikaciou beziacou v operacnom systeme, k pristupu do filesystemu, k pamati, atd. pouziva sluzieb operacneho systemu a takisto pre pristup k disku tento operacny system pouziva BIOS.
1. Virus na disku
Aby virus nieco mohol robit, musi byt niekde ulozeny. Keby virus ostal len v pamati, po vypnuti pocitaca by nam uz zostalo len pomodlit sa za cest jeho pamiatke a bolo by po viruse. Ak sa jedna o bootovaci virus, ten ma svoje telo obvykle ulozene v na disku v nejakej nepouzivanej oblasti, budto pred prvou particiou na disku (particie zvykli zacinat na hraniciach stop, takze cela prva stopa disku bola obvykle nevyuzita), alebo zakernejsie virusy vyuzivali schovavanie sa vo FAT particiach. Ako sa tam da schovat? MS-DOS bol system pisany pre lacne PCcka, ktore nemali hardware spolahlivy, ako salove pocitace, preto system musel ratat s vypadkami na diskovych mediach. Vo FAT tabulke preto existuje sposob, ako oznacit blok na disku ako vadny a system ho prestane pouzivat. No a to, aby system nejake miesto na disku nepouzival, je prave to, co virus potrebuje. FAT tabulka je pomerne primitivna struktura, nie je problem do virusu naimplementovat jej prechadzanie. Virus si na disku najde volne miesto patricnej velkosti, ktoru pre svoje ulozenie potrebuje, zapise sa tam a dane bloky disku oznaci ako vadne. Elegantne riesenie, ktore neboli, pretoze virus uz dalej nemusi nic strazit, operacny system toto miesto za ziadnych okolnosti nevyuzije do momentu, nez sa disk nebude formatovat, pricom ani pri formatovani disku sa niekedy neoveruje, ci su bloky oznacene ako vadne aj skutocne vadne, takze takto ulozeny virus dokaze prezit aj formatovanie (za niektorych okolnosti). Na taketo miesto je ale mozne ulozit len cast virusu, pretoze kus virusu, ktory nacita telo a zavedie ho do pamati, musi byt nutne ulozeny v bootovacom sektore. Keby chcel antivirus skontrolovat pritomnost virusu v bootovacom sektore, staci mu tento sektor precitat a porovnat ho so vzorkami znamych virusov, ci sa nahodou nepodoba. Preto rezidentne bootovacie virusy vyuzivaju stealth maskovanie k tomu, aby antivirus obalamutili. Antivirus totizto nepouzije priameho pristupu k disku, ale pouzije diskovu obsluhu BIOSu, aby mu tato vratila obsah bootovacieho sektora. Virus preto rezidentne napadne tuto obsluhu a bude sa spravat nasledovne.
Pri kazdej poziadavke o nacitanie sektora pevneho disku si virus overi, ci poziadavka nesleduje na sektor, v ktorom je ulozene telo virusu. Ak zisti, ze tato poziadavka smeruje tam, kde by sa nikto pozerat nemal, virus poziadavku upravi (napriklad tak, ze namiesto zavireneho bootovacieho sektora nastavi adresu na ulozeny original bootsektora) a nasledne necha BIOS tuto poziadavku vykonat. (viac o rezidentnych bootovacich virusoch v casti o rezidentnych bootovacich virusoch). Vysledok je asi taky, ze antivirus si poziada o bootsektor, virus poziadavku zmodifikuje a antivirus uvidi to, co by videl, keby bootsektor zavireny nebol. Nikde ziadneho virusu.
Podobne postupuju aj virusy infikujuce subory, akurat ich pocinanie je omnoho komplikovanejsie. Zoberme ako priklad predlzujuci COM rezidentny stealth infektor. Tento virus zvacsi .COM subor po zavireni o dlzku svojho tela, preto potrebuje v prvom rade maskovat pred zvedavymi ocami, ze sa velkost suboru zmenila a v druhom rade, pred este zvedavsimi ocami, maskovat, ze v subore je nieco, co by tam byt nemalo. Kedze sa jedna o predlzujuci virus, jeho telo je ulozene na konci .COM suboru. Virus sa preto chova nasledovne:
Rezidentne infikuje obsluhu prerusenia operacneho systemu MS-DOS. Pri kazdom volani jadra ms-dos kontroluje, ci poziadavka nesmeruje na sluzbu "vrat polozku adresara" (dir_read), alebo "citaj zo suboru" (fread). V prvom pripade povoli operacnemu systemu normalne vratit informacie o polozke adresara, ale tesne pred tym, nez su volajucemu programu vratene, overi, ci nahodou programu nemaju byt vratene informacie o subore, ktory je zavireny. Virusy pouzivaju mnoho sposobov, ako si poznacit, ze subor je zavireny. Napriklad:
- nastavenie casu modifikacie suboru daleko do buducnosti
- nastavenie milisekund casu vytvorenia na hodnotu mimo platny rozsah (cislo ma rozsah 0-255, nastavi sa trebars 200)
- nastavenie casu modifikacie na cislo napriklad delitelne 7 a pod.
- zarovnanie velkosti suboru na cislo delitelne 32 a pod.
atd.
Ak zisti, ze sa jedna o zavireny subor, odrata od jeho velkosti cislo, ktore reprezentuje velkost tela virusu a informacie s popisom suboru vrati volajucemu programu. Tento program teda ziadne zmeny navonok neuvidi. Ak by bol program natolko drzy, ze by chcel tento subor otvorit, zavola opat jadro operacneho systemu, kde opat sliedi virus. Virus zisti, ze je poziadavka na otvorenie zavireneho suboru. Necha operacny system subor normalne otvorit, ale do internej datovej struktury operacneho systemu si poznaci, ze ma subor pri citani za letu odvirit. Pri citani virus vie, ktora oblast suboru je citana, pozna svoj infekcny algoritmus, takze moze subor nalezite upravit (kuprikladu prve byty .COM suboru nahradi povodnymi bytami, aby nebolo vidno, ze kod obsahuje skok na virusove telo a subor skrati na velkost, aku by mal, ak by nebol zavireny). Obdobne funguju ak .EXE stealth infektory, akurat odvirovanie za letu je v tomto pripade komplikovanejsia procedura.
2. Virus v pamati
Ako bolo napisane vyssie, pokial nie je istota, ze ziadny virus nie je aktivny a nezahladzuje stopy, nema zmysel riesit kontrolu disku. Prvym krokom v tomto pripade by malo byt overenie cistoty pamate, pretoze co nie je v pamati (RAM) sa spustit neda. Tu opat prichadza na rad obsluha prerusenia operacneho systemu MS-DOS a sluzba zistenia velkosti volnej pamati, sluzba zistenia celkovej velkosti pamati a podobne. Napriklad rezidentny bootovaci virus moze pri infekcii pocitaca pozmenit udaj o velkosti volnej pamate, aby sa vyhol prepisaniu pri ukladani dat operacnym systemom. Udaj o velkosti volnej pamate je vsak mozne pomocou obsluhy operacneho systemu ziskat aj pre aplikaciu. Co v takom pripade spravi virus? Bude sledovat obsluhu operacneho systemu a v pripade, ze prijde poziadavka na zistenie velkosti volnej pamate, poupravi hodnotu tak, aby korespondovala so skutocnostou a nic podozrivo nevyzeralo. Nevyhodou tejto metody je, ze MS-DOS ma informacie o pamati ulozene na vela miestach a da sa k nim pristupit mnoho sluzbami a ak virus vsetky tieto sluzby neosetri, udaje poskytovane jadrom za pomoci virusu budu inkonzistentne.
3. Virus v systeme
Poslednym miestom, kam virusy utocia a kde je to mozne overit relativne jednoducho su samotne obsluhy preruseni. Aby virus mohol infikovat pocitac a stat sa rezidentnym, musi prevzat kontrolu nad niektorou obsluhou prerusenia (ak sa jedna o bootovaci rezidentny virus, mohla by stacit obsluha prerusenia diskoveho subsystemu BIOSu, ak sa jedna o suborovy infektor, treba obvykle strazit celu radu sluzieb jadra operacneho systemu). Prevziat kontrolu znamena obsadit prerusenie, co znamena, ze je treba zmenit adresu v tabulke vektorov preruseni. V MS-DOSe existuje sluzba, ktora vie tuto adresu zistit, preto virus aktivny v pamati sleduje poziadavku na sluzbu zistenia vektora prerusenia a v pripade, ze je poziadavka na zistenie adresy vektora, ktory je virusom infikovany, virus tesne pred vratenim informacii volajucemu programu zmeni data tak, aby nebolo vidno, ze sa s vektorom prerusenia nieco robilo.
Inym sposobom ochrany virusu je tunelovanie obsluhy prerusenia, kedy virus zisti, kde v pamati sa nachadza obsluha prerusenia a zmodifikuje pamat priamo na mieste prerusenia podobne, ako ked sa infikuje subor (prve byty obsluhy prerusenia sa prepisu tak, aby zavolali telo virusu, pricom sa povodny kod odlozi na vykonanie v ramci tela virusu).
Nevyhodou vsak pre virus je, ze co moze on, moze aj pripadna aplikacia, cize kazda dostatocne drza aplikacia moze zistit hodnotu prerusenia priamo v pamati a nemusi sa dotazovat operacneho systemu a virus v tom pripade ziadnym maskovanim nepomoze. Rovnako aplikacia moze namiesto poziadavky na BIOS precitat data priamo z kontrollera pevneho disku (co je ale vcelku hardcore) a stealth na BIOSe bude k nicomu. Virusy spoliehaju na to, ze aplikacie budu vyuzivat normalizovane rozhrania, ktore maju virusy pod kontrolou. Takisto moze aplikacia zistit adresu prveho memory control bloku, prejst cely retazec MCB a spocitat si ich velkosti. Takisto zisti, ci je alokacia pamate v poriadku, alebo nie.
Specialnou chutovkou medzi stealth technikami virusov su ochrany proti heuristike a statickej analyze virusov, pripadne disassemblovaniu. Ked uz bol virus chyteny pri cine, v antivirusovych laboratoriach obvykle prvym krokom je disassemblovanie virusu z odchyteneho obrazu, aby sa zistilo, co presne virus robi. Staticke disassemblovanie znamena, ze sa na obraz pamati postve disassembler a ten vrati odpovedajuci zdrojovy kod v assembleri. Jednou z moznosti, ako staticke disassemblovanie obabrat, je niekde vo vnutri kodu spravit "skok do prostriedku instrukcie". Podstata triku spociva v tom, ze niektore instrukcie su dlhsie, ako 1 byte, a ak sa skoci nie na uvodny byte instrukcie, ale napriklad na druhy, alebo treti byte instrukcie (ak je na to dost dlha), zmeni sa jej vyznam.
Priklad:
MOV AX, 0
je instrukcia dlha 3 byty, z coho posledne 2 byty su rovne 0x00, Ak sa skoci a na druhy byte, vznikne z toho instrukcia ADD AX, nieco, co uplne zmenilo jej vyznam. Disassembler ale nema ani najmensiu sajnu o tom, ze je treba skocit do prostriedku instrukcie a tak disassembluje kod s povodnou (nevyznamnou) instrukciou. Ak je povodna instrukcia dlhsia / kratsia ako instrukcia, ktora vznikne skocenim do prostriedku instrukcie, spolahlivo to znici preklad zvysku kodu a pripadnemu lamacovi kodu virusu neostava, nez si kod zdisassemblovat rucne, alebo si zohnat inteligentny disassembler.
Ked uz nepoze ani ochrana pred statickym disassemblovanim a na rad sa dostane debugger, existuje (existovala) este jedna ochrana, ktora bola na poli virusov ako anti-debugovacia ochrana aj vyuzivana. Princip ochrany spocival v tom, ze procesory Intel 80486 pri svojom behu nekontrolovali, ci sa obsah pamate zmenil, ak mali kus pamate v on-chip cache-i. V praxi to vyzeralo tak, ze procesor do cache naloadoval obsah pamate v okoli prave vykonavanej instrukcie, ta zmenila prvy byte nasledujucej instrukcie tak, aby sa uplne zmenil vyznam instrukcie a beh virusu pokracoval dalej. Kedze procesory 486 tieto zmeny nesledovali, zmena sa sice v pamati prejavila, ale procesor pri vykonavani kodu na tuto zmenu nereagoval, pretoze dany region pamate uz bol nacitany v cache a pripraveny na dekodovanie instrukcii. Avsak, ked bol spusteny debugger, Po vykonani instrukcie meniacej byte programu bolo vyvolane ladiace prerusenie, co sposobilo vycistenie cache pamate, debugger spravil svoju cinnost a beh programu bol vrateny do virusu. V tom momente vsak boli do cache pamate procesora nacitane data z pamate, ktore boli zmenene, virus napriklad vyvolal chybu, alebo sa prosto zacyklil, debugovanie bolo jednoducho znemoznene, bol nutny zasah zvonka a rucna editacia kodu.
Tato chyba procesorov vsak bola s nastupom rady Pentium odstranena a na novych strojoch nefunguje, existovalo vsak niekolko dalsich metod aktivnej obrany voci debuggeru. Najjednoduchsou metodou je pouzit vektor prerusenia debuggera ako stavovu premennu, co v pripade zapnutia debuggera sposobi jeho okamzity pad. Tuto metodu s oblubou vyuzivaju semi-polymorfne virusy, ktore si do vektora prerusenia debuggera ukladaju stavove premenne dekodovania tela virusu. Ovela brutalnejsia metoda spociva v nastaveni vektora prerusenia breakpointu za behu virusu na rutinu v tele virusu, ktora sposobi nieco skarede. V pripade, ze k nastaveniu breakpointu do tela virusu nedojde, zakerna rutina sa neprejavi, ale akonahle bude breakpoint zasadeny, rutina sa uplatni (moze robit cokolvek od resetu pocitaca cez zablokovanie klavesnice az po formatovanie pevneho disku).
Ochrana proti heuristickej analyze spociva v zamaskovani toho, co virus skutocne robi. Typickymi podozrivymi cinnostami su zistovanie adresy vektora prerusenia, zmena adresy vektora prerusenia a kontrola rezidentnej instalacie virusu a semipolymorfny dekryptor. Heuristicka analyza sa snazi najst v prvych niekolko (stovkach) instrukcii naznaky virusovej akcie, vychadzajuc z toho, ze virus umiestnil svoj kod na zaciatok programu, teda netreba kontrolovat cely program. Virus moze maskovanie pred heuristikou prevadzat niekolkymi sposobmi, no uspech kazdej metody je silne zavisly od toho, nakolko vypracovany heuristicky filter antivirus pouziva. Najprimitivnejsia metoda spociva v spolahnuti sa na to, ze heuristicka analyza bude ako podozrivy kontrolovat len usek prvych par stovak instrukcii, preto sa na zaciatok virusoveho tela vlozi dost dlha slucka a bude sa dufat, ze si to nikto nevsimne. Sofistikovanejsie metody pouzivaju netradicne instrukcie na dosiahnutie obvyklych veci. Kyprikladu vynulovanie registra mozno dosiahnut mnohymi sposobmi:
XOR AX, AX -- najtradicnejsia, dobre znama metoda, pouziva sa vsade, kde je treba optimalizovat program na rychlost a velkost
SHL AX, 16 -- menej casta, ale stale priamociara metoda
CWD -- je to iste, ako XOR DX, DX, teda MOV DX, 0, ale iba ak AX < 0x8000
atd.
Tato metoda spolieha na to, ze heuristicka analyza nevykonava uplne dekodovanie a simulaciu tychto instrukcii, pretoze nie su bezne pouzivane pre dosiahnutie pozadovaneho vysledku (napriklad nastavenie sluzby "zisti adresu vektora prerusenia" do registra AX). Popripade ich nevyhodnoti ako nebezpecne. Heuristicke filtre dneska su ale kvoli prefikanosti programatorov virusov odost komplikovanejsie a prevadzaju dekodovanie vacsiny instrukcii a kontroluju velku mnozinu systemovych volani.
Popisal som niekolko metod, ako moze virus zabezpecit svoje prezitie v systeme a zabranit svojmu odhaleniu za behu antivirusom, alebo aj nie prave beznym pohladom na system. Postupne sa teda v dalsom dieli presuniem k semi-polymorfizmu a plnemu polymorfizmu a mozno prijde aj assembler. Pojde hlavne o metody majuce za ciel zabranenie najdenia virusoveho tela v infikovanom subore.
No vcelku pekne ale par rokov po funuse, DOS is dead :)
formalne nedostatky:
cast 1: chyba co s EXE subormi :)
cast 2: v dose bolo par veci co to dokazali spravit tak, ze pamet nechybala, Fyi
cast 3:
#1 system vitana vari za vas sa moc nepouzival, ked si potreboval vektor islo sa natvrdo do tabulky vektorov prerusenia. a ked ten vektor siel moc nizko alebo moc vysoko, tak si mal otazku :)
#2 dizasemblovanie z image je posledna moznost. radsej si zoberies infikovany subor, teda nechas napadnut par udiciek\
#3 skok in the middle instrukcie je nieco co je v pohode riesitelne pri aktivnej emulacii....
#4 prefetch trick bol len do 486 a na AMD to moc neslo..., ale bolo pozoruhodne ako dlho do zotrvacnostou pretrvalo a manici vyrabali nefunkcne veci
#5 xor ax,ax, cwd a pod su skor optimalizacia kodu ako odrb na heuristiku, podobne ako napriklad or ax,ax ked si chcel spravit cmp ax,0 pre podmienenym skokom
#6 co pises je iba riesenie na pasivnu heuristiku (tracer) a nie aktivnu (emulator)
---
Zerte lequar, je kua zdravy !
proti stealth virusom sa dalo velmi jednucho chranit. Stacilo si jeden krat na este nezavirenom pocitaci pozriet na akych adresach su obsluhy preruseni BIOSu a DOSu, a dalsie porovnat ci sa nezmenili. V antiviruse by som to asi kvoli nepouzil, lebo ked sa zmeni nejake nastavenie systemu tak sa zmeni aj adresa obsluhy. Ale ja som si na to napisal jednoduchu utilitku co mi to kontrolovala, a ked som nieco zmenil v konfiguracii tak som updatol aj tu utilitu. A tusim ze raz som tak jeden virus a odhalil.
nemuselo to pomoct ak int presmerovalo v realnej obsluhe natvrdo jumpom
---
Zerte lequar, je kua zdravy !
viem, to tiez nieje problem otestovat (aj ked som to v tej mojej utilitke tusim netestoval).
inak neviem ci to v praxi niektory virus robil, zopar stealth virusov som kedysi rozpitvaval, a vsetky isli cez vektor prerusenia
osobne som rozpitval minimalne o dva rady viac virusov ako ty, takze clovek premyslal tak trochu o vsetkom moznom :)
---
Zerte lequar, je kua zdravy !
AV-er? :)
to potom verim...
v realnom antiviruse je to vsak nepouzitelne, pretoze antivirus sa cisto na zaklade vektorov preruseni moc nemoze rozhodnut, ci je pocitac zavireny, alebo nie :)
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.