Dr4k3 Posted November 30, 2006 Report Posted November 30, 2006 Probabil ca nu este om in ziua de azi care n-a auzit de virusi. Contrar însa tuturor legendelor, virusii nu sunt niste fenomene supranaturale. Îmi amintesc cum cineva m-a îtrebat o datã dacã e drept ce a auzit ea - cã virusii de calulatorpot fi contactati dacã se fumeazã în birou... Imaginati-vã cum m-am simtit atunci.Nu-mi venea sã cred ce auzeau urechile - ori persoana îsi bateea joc de mine, oriera adînc în bezna necunostintii... Pînã la urmã ultima s-a dovedit a fi valabilã.Dar chiar si un cunoscãtor în ale calculatoarelor s-ar putea întreba într-ozi: cît de greu e sã scrii un virus ?Rãspunsul e simplu: este usor sã creezi un virus, alta e problema sã creezi un virusputernic. Sper cã intelegeti cã prin puternic, am invedere urmãtoarele lucruri: -virusul sa fie greu de detectat de programe antivirus -virusul sa fie fecund - adica sa se reproduca rapid, prin cãi diverse si inobservabil (asta apropo de unitatile de flopy-disk, care încep din senin sã lucreze ).Dar, cum eu sunt un om pasnic, si nu ma intereseaza sa fac altora rau,tema acestui tutorial va fi cu totul si cu totul neasteptata...Cum sa utilizam virusii in alte scopuri. De exemplu crackuirea programelor.Sau inversul- protejarea programelor. Desi acesti ultimi virusi, nu sunt virusiin adevaratul sens al cuvintului- adica le lipseste functia de reproducere.In crearea unui virus in fata noastra apare urmatoarea problema: -cum sa facem ca virusul sa coexiste cu programul infectat, sa-si indeplineasca sarcinile sale, dar sa lase si programul sa lucreze.Eu consider ca aceasta este principala caracteristica a unui virus,care odata implementata ofera posibilitatea ca virusul sa-si indeplineascatoate sarcinile sale, iar sarcinele pot fi: -autoreproducere -automodificrea -spionarea calculatorului gazdei -sarcini distructive, de santajare, etc (virusul poate sa va incripterze tot hardul si pina nu veti trimite 1000$ pe contul xxxxxx, nu veti primi cheia de decriptare- sa nu ziceti ca eu v-am dat aceasta idee ).Acestea sunt sarcini pentru care sunt utilizati in mod obisnuit virusii.Dar de ce sa nu-i utilizam si in alte scopuri? Cuma ar fi de exemplu: -crackuirea unor programe -protejarea unor programe -adaugarea de functii noi programelorlista nu se incheie aici si sper ca voi o veti continua la nesfirsit.Sa vedem totusi cum poate fi infectat un program. Desigur ca tehniciexista multe, si sper ca pe viitor vor aparea pe pagina noatra noieseuri pe aceasta tema. Pentru inceput sa ne punem insa o sarcina simpla- infectarea unui fisier executabil de tip COM. La aceasta faza,sa zicem, ca nu conteaza sarcina pe care acesta o va indeplini. Pentru inceput ajunge ca el sa ne ceara o parola pentrua executa acel program. Autoreproducerea, distrugerea, si santajul il las pe seama celor mai violenti. Din aceste functii ale virusului as spune cadoar autoreproducerea e un subiect demn de discutat, in rest orice prost poate sa-ti stearga hardul sau sa-ti violeze sectorul BOOT. Urasc pe cei violenti, deci nu vom discuta aceasta aici. Înca un lucru pe care îl urasc- sunt caii troian. Pentru a continua aveti nevoie de cunostinte minime de asembler, daca nu le aveti puteti doar sa va faceti o inchipuire vaga asupra ce vom discuta in continuare. Dupa cum sper ca stiti, fisierile COM sunt cele mai simple programe executabile sub DOS. Nu exista nimic complicat in faptul cum se incarca aceste programe in memorie. Principiul e simplu:ce vedeti ca se patreaza in fisierul COM acelasi lucru va fi incarcatin memorie, dupa care sistemul de operare va da control acelui programprintr-un salt la adresa unde a fost incarcat programul. Repet- ceea ce se incarca in memorie este o replica exacta a ceea ce se pastreaza in fisier. Veti intreaba- oare nu e evident, oare nu e logic sa fie asa?Bine daca va ajuta cu ceva... la fisierele EXE lucrurile nu sunt chiar asa simple si daca schema de infectare pe care v-o propunse poate lauda cu faptul ca ocupa doar vreo 10-15 bytes (atentie,schema de infectare doar, fara sarcinele pe care le are virusul),atunci infectarea unui fisier EXE este cu mult mai anevoiasa.Fisierele COM nu pot depasi ca lungime 65536 bytes, adica exact portiunea de memorie ce poate fi adresata de un WORD(2 bytes). Toate jump-urile si call-urile intr-un fiser COM sunt de tip near, adica nu depasesc limitade memorie adresabila printr-un WORD. Iata ce face posibil ca programuluisa-i fie indiferent in ce segment ruleaza el- atita timp cit adresele suntcodate ca adrese relative. Adica presupunem ca la adresa CS:200h aveti urmatoarea instructiune:CS:00000100 JMP 000060D7h ; code: E9 D4 5FCS:00000103 ... ... ...... ...CS:000060D7 PUSH EAX ... Codul de la CS:00000200 si anume instructiunea JMP 300h va fi codata pe 3 bytes: E9 D4 5FE9 este codul instructiunii JMP care are ca argument un word,nu toate JMP-urile sunt codate cu E9, aceasta depinde de tipulargumentului- (constanta, registru, variabila) si de marimea lui (BYTE, WORD, DWORD).Dar ce naiba inseamna D4 5F? Ei bine, dupa cum stiti sau acus veti afla valorile WORD se pastreaza in memorie cu fundul in sus:D4 5F nu inseamna altceva decit 5FD4. Daca nu stiati acest lucruatuci acesta e un motiv in plus sa gasiti o carte buna de asembler .Dar ce inseamna 5FD4? Ei bine, ajunge atita suspans-in contextul dat 5FD4 nu inseamna altceva decit 'sari la instructuiuneace se afla cu 5FD4 bytes in jos dupa mine'. Observati formularea:cu 'cu 5FD4 bytes' si nu 'sari la...'. Cu alte cuvinte, daca inca n-ati priceput: 5DFD4 = 60D7 - 0103 .0103 este adrsa instructiunii ce urmeaza imediat dupa JMP-ul nostru,este logic - atita timp cit instructiunea noastra ocupa 3 bytes.Ca sa mai exersam un pic:CS:00000100 JMP 103h ; este codat ca E90000, dar va asigur ca compilatorul va optimiza acest cod prin: CS:00000100 JMPS 103h ; code: EB 01CS:00000102 NOP ; code: 90 JMPS - este un JMP SHORT.Puteti sa va mai jucati cu aceste lucruri, si veti vedea ca nimic nu e intamplator in faptul cum codeaza asemblerulinstructiunile voastre.Puteti sa scrieti aceste instructuiuni la adrese diferitedirect din debuger si sa vedeti cum acesta le codeaza.Sa revenim insa la virusi si sa vedem in sfirsit banala schema de infectare a unui fisier COM.Va prezint probabil cea mai simpla schema existenta pina acum, pe care eu am elaborat-o si am folosit-oinca pe cind aveam vreo 15 ani . Dar ca la majoritatea lucrurilor pe care le descoperi la aceasta virsta - iti dai seama ca ele deja de mult au fost inventate de altii,ba chiar se folosesc pe larg.Înainte de a infecta programul sa ne intrebam cind dorim sa intre in actiune codul virusului? Posibil ca doriti ca acest lucru sa se intimple inainte ca progrmulsa intre in actiune, dupa care sa dati controlul programului.Dar s-ar putea ca virusul sa intre in actiune la un moment datin executia programului - de exemplu un virus care la un moment dat apas un buton pentru voi.Schema pe care v-o prezint este valabila pentru ambele cazuri. Noi insa il vom studia pentru simplitate pe primul.Cum se realizeaza implantarea virusului intr-un fisier COM?Veti fi tentati sa credeti ca acest lucru se poate realiza prin simpla inserare a codului virusului la locul dorit.De exemplu daca doriti ca virusul se execute la începutul programului- veþi insera codul virusului la începutulfisierului COM. Gresit. Încercati.Veti deplasa astfel tot codul programului cu un numar de bytes egal cu lungimea virusului.JUMP-urile relative vor ramîne valabile -este corect,dar nu si referintele la date. De exemplu daca ne referimla o adresa absoluta 500h unde se pastreaza o variabila,dupa inserarea codului viruslui care are de exemplu lungimeade 300h bytes, variabila noastra se va afla deja la adresa 800h.Nu uitati ca un fisier COM nu are un segment de date aparte. Datele si codul sunt pastrate la gramada,în acelasi segment. Este sarcina programatorului sa faca ca firul de executie al programului sa nu intre peste date. În acest scop majoritatea programatorilorplaseaza datele la începutul programului, iar inaintea lor, un JMP care sare peste ele. Priviti:CS:00000100h JMP 0000700h ;Aici incepe programul, si imediat... ... ;urmeaza datele... DB 3,4,5,0 ;Aici se stocheaza datele... ...CS:00000700H PUSH EAX ;Aici începe codul programului... ...... ...Deci, inserarea codului virusului la inceputul sau în interioruluiprogramului nu este o solutie vitala. Pentru ca astfel corupemreferintele la adrese absolute.Sa ne gîndim la altceva. V-ati gindit oare de ce v-am povestit atit de mult cum se codeaza instructiunea JMP ? În curind veti afla.Ideea mea este de a scrie codul virusului la sfirsitulprogramului, si ca sa-l facem sa se execute inainte dea intra in actiune programul sa plasam la inceputulprogramului un JMP, care ne arunca exact la locul unde incepecodul viruslui (adica la sfirsitul programului).Cind am spus 'plasam un JMP la inceputul programului' amavut in vedere faptul ca instructiunea noastra (care ocupa 3 bytes)se suparascrie peste primii 3 bytes a porgramului astfelevitam deplasarea codului.Deaceea cind realizam infectarea acesti trei bytes trebuiememorati undeva printre datele virusului. Dupa ce virusulse executa, acesti bytes se restabilesc (adica se stergeJMP-ul nostru) si sarim din nou la inceputul programului.Programul va rula in pace. Doar daca virusul nostru n-aschimbat registri sau flag-uri de care programul nostrufacea uz. Desi, la inceputul programului acest lucru e mai putin grav, fiti prudenti totusi si folositi instructiunilePUSHA, PUSHF la începutul codului virusullui si POPF, POPA la sfirsitul lui, pentru a salva/restabili registrii si flag-urile.Sa exemplificam. Avem urmatoarea tinta - programul TEST.COM.Dorim sa-l infectam. Fie: lungimea programului Lp= 1000h (4096 în zecimal) byteslungimea virusului Lv= 0200hPrin urmare programul infectat va avea 1200h bytes.Am uitat sa va spun ca înainte de a fi rulat, unui program COM i se atribuie un segment de cod unde acesta va rula. Acesta se pastreaza în registrul CS. Numai ca, codul programuluinu va fi încarcat în cadrul acestui segment de la adresaCS:00000000 cum s-ar putea sa credeti, ci de la adresa.CS:00000100, astfel se rezerva loc pentru asa numita zonaPSP, unde printre alte lucruri interesante veti gasi silinia de comanda cu care ati rulat acest program. Mergem mai departe.Sa presupunem ca programul care trebuie infectat arata cam asa:Adresa: Codul: Instructiunea: ______________________________________________ CS:00000100 50 PUSH EAX CS:00000101 B4 09 MOV AH,09hCS:00000103 BA 3B 01 MOV DX,013Bh... ... ...... ... ...... ... ...... ... ...CS:00001FFF 90 NOP ;Ultima instructiune -----------------------------------------------CS:00001100 ??? ??? ;Aici vom baga virusulObservam ca primii 3 bytes din acest program sunt: 50 B4 09.Atentie! Ei trebuie salvati cind realizam infectrea pentru ca peste ei vom scrie instructiunea JMP 01000h (care ocupa3 bytes).Iata cum va arata programul infectat:Adresa: Codul: Instructiunea: ______________________________________________ CS:00000100 E9 FD 0F JMP 1100h ;sarim la virusCS:00000103 BA 3B 01 MOV DX,013Bh ;restul programului... ... ... ;ramîne nemodificat... ... ...... ... ...... ... ...CS:00001FFF 90 NOP ;Ultima instructiune ______________________________________________ ;din program CS:00001100 60 PUSHA ;Aici icepe virusulCS:00001101 9C PUSHF ;salvam registrii... ... ... ;si flagurile.... ... ... ; Aici actioneaza virusul;Dupa ce virusul si-a facut treaba, vom restabili primii 3 bytes din program:CS:000012D0 C6 06 00 01 50 MOV BYTE PTR [100],50h CS:000012D5 C6 06 00 01 B4 MOV BYTE PTR [101],B4hCS:000012DA C6 06 00 01 09 MOV BYTE PTR [102],09hCS:000012DF ... ...... ... ...;JMP-ul nostru a fost sters!;Acum putem sa sarim linistiti inapoi la inceput:CS:000012E9 9D POPF ;restabilim flagurileCS:000012FA 61 POPA ;restabilim registriCS:000012FB BE 00 01 MOV SI,100hCS:000012FE FF E6 JMP SI ;si gata-----------------------------------------------CS:00001300 ??? ???Atrageti atentia cum sunt encodate instructiunile de restabilire a primelor trei bytes. Observama ca bytii de restabilit (50, B4, 09 ) se afla la adreselede memorie CS:000012D4, CS:000012D9, CS:000012DE.Dupa ce am vazut programul infectat putem sa ne dam seama cum se realizeaza infectarea.Presupunem ca codul virusului nostru se pastreaza intr-unfisier VIRUS.DAT (cu lungimea Lv=200h).Iata etapele de parcurs:1). Citim primii 3 bytes din TEST.COM -> 50, B4, 092). Acum corectam operanzii instructiunilor de restabilire din VIRUS.DAT.Daca in memorie acesti bytes se afla la adresele: CS:000012D4, CS:000012D9, CS:000012DE,În fisier ele se vor afla la offseturile 01D4h, 01D9h, 01DEh.Mai bine zis ele se afla la acele adrese de memoriepentru ca de exemplu: CS:000012d4 =CS:(100h+Lp+01D4h)Sper ca e clar. Daca nu - mai reflectati.3). Acum scriem linistiti peste acesti trei bytes din TEST.COMcodul instructiunii JMP [Lp] adica JMP 1100h, care se codeaza astfel: (E9 FD 0F) . Amintesc ca (E9) este codul instructiunii JMP, iar (FD 0F) înseamna (0FFDh)=(01000h-03h)= ( Lp-3 ).Sper ca e clar. Daca nu - mai reflectati.4). Ne-a ramas cel mai usor lucru.Adaugam codul virusului la capatul fisierului TEST.COM5). Gata.Mentiuni:Am descris în acest tutorial numai principiul de infectare a unuiprogram.Ramîne la latitudinea voastra scrierea virusului propriu zis(adica a sarcinilor pe care acesta le executa).O singura mentiune: desi am evitat coruperea referintelor la adrese absolute din cadrul programului,trebuie sa intelegeti ca virusul in sine nu e protejat de asa ceva. În dependenþã de lungimea programului infectat,virusul se va pomeni la adrese diferite.Partea buna este cã virusul îl scrieti voi si cunoastetilocurile unde se fac referinte absolute la memorie- la infectareputeti corecta aceste referinte cu lungimea programului (Lp).Va sfatuiesc sa aveti un singur loc de acest fel - cel încare veti baga (Lp) într-un registru de exemplu (DX). În continuare referindu-va la adrese absolute folositi ca baza acest registru. Quote
Ras Posted December 1, 2006 Report Posted December 1, 2006 super calumea tutorialul asta trebuie sa incerc sa vad poate imi iese cu toate ca nu pre cred Quote
Dr4k3 Posted December 3, 2006 Author Report Posted December 3, 2006 Ras wrote: super calumea tutorialul asta trebuie sa incerc sa vad poate imi iese cu toate ca nu pre cred persevereaza!!! Quote