How it's made: Virusy #3

16.04.2007 21:15 | blackhole_ventYl

Uz vieme, ako sa sprava suborovy virus, ked infikuje pocitac. Infekciu pocitaca vsak musi vykonat aj virus bootovaci. Podrobnejsie sa teraz pozrieme na to, ako vykonava infekciu pocitaca prave bootovaci virus a ake uskalia to prinasa.

Bootovaci virus sa najcastejsie zavadza z bootsektora pevneho disku, alebo diskety. To je pre samotny virus velka vyhoda z toho hladiska, ze v tom case je minimalna sanca, aby bol v pocitaci zavedeny este iny skodlivy kod. Navyse je bootovanie pocitaca vykonavane prave raz pri kazdom starte pocitaca, takze nie je potrebne riesit overovanie infikovanosti. Pri infekcii takisto nemusi riesit maskovanie pred jadrom MS-DOSu, pretoze to zatial este nie je v pamati natiahnute.

Uskalim infekcie bootovacim virusom je to, ze ak chce virus infikovat aj jadro MS-DOSu, musi nejako zistit, ze jadro MS-DOSu je uz na mieste a pripravene k infekcii. To mierne proces infekcie komplikuje. Vyhodou je vsak to, ze virus nemusi priamo utocit na jadro MS-DOSu, aby sa zamaskoval, ale moze zneuzit BIOS k tomu, aby ho on sam zamaskoval.

Kod ulozeny v bootsektore je ulozeny do pamate na adresu 0000:7C00 budto MBR pevneho disku, alebo v pripade bootovania z diskety samotnym BIOSom. To je pre virus vyhoda, lebo vzdy vie, kam do pamate bolo jeho telo nahrane. BIOS vsak do pamate nakopiruje len jeden sektor, zvysok svojho tela si musi dotiahnut virus sam, ak je vacsi, ako jeden sektor. Virus navyse musi respektovat znacku bootsektora, ktora je 0xAA55 a je umiestnena na konci sektora.

To, ze virus vie, kde presne v pamati je, nic nemeni na fakte, ze virus sa musi spratat z cesty niekam na bezpecnejsie miesto, pretoze na svoje miesto bude musiet neskor byt samotnym virusom nahrany bootloader. Riesenie pre to, kam kopirovat telo virusu, dava sam Billy G svojim vyrokom, ze 640 kB musi stacit kazdemu. BIOS totizto hlasi velkost zakladnej pamate len do 640 kB, aj keby jej bolo viac, akoze jej vacsinou aj viac je. BIOS vsak nehlasi velkost volnej pamate pomocou sluzby, ale v specialnej datovej strukture. Virusu teda nic nebrani v tom, aby udaj velkosti pamate zmensil o svoju velkost a MS-DOS ho uz tym padom neohrozi, pretoze nikdy nenaalokuje viac pamate, ako je cislo udavane v tejto premennej. Na adrese 0040:0013 si BIOS drzi informaciu o velkosti zakladnej pamate v kilobytoch. Nasledujuci kod sposobi znizenie tejto hodnoty o velkost tela virusu v kilobytoch zaokruhlene na cele kilobyty nahor.

  xor bx, bx;
  mov es, bx;
  add bx, 0x0413;
  sub word [es:bx], virus_size_in_kB;

MS-DOS potom tuto pamat nikdy nepouzije a virus v nej moze pokojne byvakovat. Druhou ulohou virusu je zistit segmentovu adresu miesta, ktore si prave vyhradil. Vychadzajuc z toho, ze hodnota je uvedena v kB, co znamena, ze cislo je posunute o 10 bitov doprava a za predpokladu, ze offset = 0, je segmentova cast adresy rovna hornym 16tim bitom linearnej adresy, staci tuto hodnotu posunut o 6 bitov dolava a segmentova adresa je na svete:

  mov bx, es:bx;
  shl bx, 6;
  mov es, bx;
  xor di, di;
  mov ds, di;
  mov si, virus_base;
  mov cx, virus_length;
  rep movsb;

virus_base je adresa, kam si virus predtym z disku natiahol svoje telo. Algoritmus kopirovania je velmi podobny tomu zo suboroveho infektora. Skopirovanim virusoveho tela vsak vsetko este len zacina. Virus je sice schopny infikovat BIOS, ale infekcia MS-DOSu je v tomto momente nemozna, pretoze jadro MS-DOSu este v pamati nie je. Infekciu BIOSu preto moze virus vykonat sposobom rovnakym, ako infikuje suborovy virus jadro MS-DOSu. Najcastejsie infikovanym prerusenim je prerusenie 0x13 diskoveho ovladaca BIOSu. Tym si virus zabezpeci moznost infikovat disky, alebo diskety vlozene do pocitaca a nadalej sa sirit. Ak chce virus infikovat aj jadro MS-DOSu, musi vyckat, nez jadro bude na infekciu "pripravene". Jadro MS-DOSu sa vsak do pamate nedostane samo od seba, musi ho tam niekto, alebo nieco dostat. Jadro DOSu do pamate zavadza bootloader, ktory vsak bol prepisany virusovym telom. Preto je nutne po inicializacii virusu zabezpecit to, ze bude zavolany aj povodny bootloader. Dva bootloadery vsak nemozu v jednom sektore existovat, virus si preto pri infekcii musi povodny bootloader niekam ulozit, aby ho nasledne odtial mohol nacitat a spustit. K spusteniu bootloadera musi
dojst z rovnakej adresy, ako bolo spustene telo virusu.

Popis infekcie bootsektora virusom bude popisany v niektorej z neskorsich casti, na tomto mieste len podotknem, ze mnoho virov vyuziva metodu kopirovania povodneho bootsektora do niektoreho sektora na 1. stope disku, ktore su obvykle nevyuzite. Problem nastane az vtedy, ked dojde k viacnasobnej infekcii pocitaca dvoma roznymi virusmi, ktore si odkladaju bootsektor na to iste miesto v 1. stope disku. Prvy virus si ulozi bootsektor na zalozne miesto a bootsektor prepise svojim telom. Druhy virus odlozi na zalozne miesto telo prveho virusu a bootsektor prepise svojim telom. To sposobi, ze ked bude chciet druhy virus predat riadenie bootsektoru, preda riadenie namiesto toho prvemu virusu. Potial sa nic nedeje, zinicializuju sa oba virusy. Ale v momente, ked prvy virus (poradie infekcie) vykona pokus o nacitanie zalohy bootsektora, precita svoje vlastne telo, cim sa vlastne virus zacykli a system sa stane nebootovatelny.

Ako virusu zabezpecit, ze zisti pritomnost MS-DOSu v pamati a jeho pripravenost na infekciu? Pocitac samozrejme nepozna ziadny stav: Jadro MS-DOSu je infikovatelne. Preto musi virus tuto skutocnost zistit inak. Jednou z moznosti je vyuzit obsluhu prerusenia periodickeho tiku a sledovat, ako sa meni adresa vektora prerusenia 0x21:

dos_install_test:
  xor bx, bx;
  mov es, bx;
  mov bx, es:[0x21*4];
  mov int_x21_offset, bx;
  mov bx, es:[0x21*4+2];
  mov int_x21_segment, bx;
  cmp bx, 0xA000;
  ja jmp_int_x08;
  mov es:[0x08*4], int_x08_offset;
  mov es:[0x08*4+2], int_x08_segment;
  mov es:[0x21*4], virus_x21_handler;
  mov dx, cs;
  mov es:[0x21*4+2], dx;
  jmp short jmp_int_x08;
  ...
jmp_int_x21:
  bogo_jmp_far_instr db 0xEA
  int_x21_offset      dw ?
  int_x21_segment      dw ?
jmp_int_x08:
  bogo_jmp_far_instr2  db 0xEA
  int_x08_offset      dw ?
  int_x21_segment      dw ?

Uvedeny kod virus zavesi na obsluhu periodickeho casovaca hodin, ktore je vyvolane hodinami kazdych 55ms. Sleduje, ci je adresa prerusenia nastavena na adresu niekde vo vnutri prvych 640 kB RAM, co indikuje, ze bola adresa presmerovana z BIOSu, ktory je umiestneny nad 640kB, niekam do oblasti programovej pamate. To je ten pravy cas, kedy je mozne na MS-DOS zautocit. Rovnako uz dalej nie je nutne striehnut - jadro je uz infikovane, preto sa obsluha prerusenia rovno aj odinstaluje.

V tomto momente sa virus stava rovnako rezidentny v pamati, no oproti virusu pri vypise udajov o volnej pamati, bude v tomto pripade pocitac vykazovat netypicku zmensenu velkost pamate, zatial co v pripade suboroveho virusu bude velkost pamate standardna, ale velkost virusu sa pripocita k pamati zabranej DOSom.

Sila a slabost bootovacich virusov zaroven tkvie v tom, ze sa ukladaju do bootsektora. Akonahle sa bootsektor prepise cistym zavadzacom, virus sa stava bezmocny a je nutna opatovna infekcia. Vacsina bootovacich virusov preto praktizuje niektore jednoduche stealth techniky, alebo sa kombinuje so suborovym virusom, pretoze odvirenie suboru je daleko komplikovanejsie, ako odvirenie bootsektora.

V dalsom dieli sa zameriam na to, ako rezidentne aj nerezidentne suborove virusy infikuju dalsie subory, aky je rozdiel medzi infekciou suboru COM a EXE, ako sa chova predlzujuci virus, ako prepisujuci virus a spomeniem aj duplicitne a medzerove virusy.

    • Re: How it's made: Virusy #3 19.04.2007 | 15:43
      Avatar dc   Používateľ

      Dalsi ze serie poucnych ventYlovych clanku, diky ti za nej, zase jsem o neco chytrejsi :-) Mozna se dokonce kvuli tobe zacnu ucit aj ten asm :P Tesim se na dalsi dily ;)
      ---
      >> i love my penis <<

      --- [root@holy-terminal]# /etc/rc.d/world restart Dilino phenel, so džanel, goďaver džanel, so phenel.