MaximumGame Community

MaximumGame.malware-site.www
 
AcasaFAQCautareMembriInregistrareConectare

Distribuiţi | 
 

 [Tutorial pt. Noobs]Cum sa infectezi un Fisier COM

In jos 
AutorMesaj




Data de inscriere : 01/01/1970

MesajSubiect: [Tutorial pt. Noobs]Cum sa infectezi un Fisier COM   Sam Iun 20, 2009 7:54 am

Atentie pentu cei caposi si supergeniali- acest tutorial a fost scris pentru cei
care n-au scris încă nici un virus.

Doresc ca prin acest tutorial sa dau viata unui nou subiect de studiu la Moldhack
- virusologia sau arta de a scrie virusi.

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 calulator
pot fi contactati dacă se fumează în birou... Smile Imaginati-vă cum m-am simtit atunci.
Nu-mi venea să cred ce auzeau urechile - ori persoana îsi bateea joc de mine, ori
era 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-o
zi: 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 virus
puternic.
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 Smile ).

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 virusi
in 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 indeplineasca
toate 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 Smile ).

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 programelor

lista nu se incheie aici si sper ca voi o veti continua la nesfirsit.

Sa vedem totusi cum poate fi infectat un program. Desigur ca tehnici
exista multe, si sper ca pe viitor vor aparea pe pagina noatra noi
eseuri 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 pentru
a executa acel program. Autoreproducerea, distrugerea, si santajul il las
pe seama celor mai violenti. Din aceste functii ale virusului as spune ca
doar 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 incarcat
in memorie, dupa care sistemul de operare va da control acelui program
printr-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 propun
se 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 limita
de memorie adresabila printr-un WORD. Iata ce face posibil ca programului
sa-i fie indiferent in ce segment ruleaza el- atita timp cit adresele sunt
codate ca adrese relative. Adica presupunem ca la adresa CS:200h aveti urmatoarea
instructiune:

CS:00000100 JMP 000060D7h ; code: E9 D4 5F
CS:00000103 ...
... ...
... ...
CS:000060D7 PUSH EAX
...


Codul de la CS:00000200 si anume instructiunea JMP 300h va fi codata
pe 3 bytes: E9 D4 5F

E9 este codul instructiunii JMP care are ca argument un word,
nu toate JMP-urile sunt codate cu E9, aceasta depinde de tipul
argumentului- (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 lucru
atuci acesta e un motiv in plus sa gasiti o carte buna de asembler Smile.
Dar ce inseamna 5FD4? Ei bine, ajunge atita suspans-
in contextul dat 5FD4 nu inseamna altceva decit 'sari la instructuiunea
ce 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 01
CS: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 asemblerul
instructiunile voastre.
Puteti sa scrieti aceste instructuiuni la adrese diferite
direct 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-o
inca pe cind aveam vreo 15 ani Smile. 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 progrmul
sa intre in actiune, dupa care sa dati controlul programului.
Dar s-ar putea ca virusul sa intre in actiune la un moment dat
in 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 începutul
fisierului 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 referim
la o adresa absoluta 500h unde se pastreaza o variabila,
dupa inserarea codului viruslui care are de exemplu lungimea
de 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 programatorilor
plaseaza 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 interiorului
programului nu este o solutie vitala. Pentru ca astfel corupem
referintele 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 sfirsitul
programului, si ca sa-l facem sa se execute inainte de
a intra in actiune programul sa plasam la inceputul
programului un JMP, care ne arunca exact la locul unde incepe
codul viruslui (adica la sfirsitul programului).
Cind am spus 'plasam un JMP la inceputul programului' am
avut in vedere faptul ca instructiunea noastra (care ocupa 3 bytes)
se suparascrie peste primii 3 bytes a porgramului astfel
evitam deplasarea codului.
Deaceea cind realizam infectarea acesti trei bytes trebuie
memorati undeva printre datele virusului. Dupa ce virusul
se executa, acesti bytes se restabilesc (adica se sterge
JMP-ul nostru) si sarim din nou la inceputul programului.
Programul va rula in pace. Doar daca virusul nostru n-a
schimbat registri sau flag-uri de care programul nostru
facea uz. Desi, la inceputul programului acest lucru e
mai putin grav, fiti prudenti totusi si folositi instructiunile
PUSHA, 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) bytes
lungimea virusului Lv= 0200h
Prin 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 programului
nu va fi încarcat în cadrul acestui segment de la adresa
CS:00000000 cum s-ar putea sa credeti, ci de la adresa.
CS:00000100, astfel se rezerva loc pentru asa numita zona
PSP, unde printre alte lucruri interesante veti gasi si
linia 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,09h
CS:00000103 BA 3B 01 MOV DX,013Bh
... ... ...
... ... ...
... ... ...
... ... ...
CS:00001FFF 90 NOP ;Ultima instructiune
-----------------------------------------------

CS:00001100 ??? ??? ;Aici vom baga virusul


Observam 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 ocupa
3 bytes).

Iata cum va arata programul infectat:


Adresa: Codul: Instructiunea:
______________________________________________

CS:00000100 E9 FD 0F JMP 1100h ;sarim la virus

CS: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 virusul
CS: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],B4h
CS:000012DA C6 06 00 01 09 MOV BYTE PTR [102],09h
CS:000012DF ... ...
... ... ...

;JMP-ul nostru a fost sters!
;Acum putem sa sarim linistiti inapoi la inceput:

CS:000012E9 9D POPF ;restabilim flagurile
CS:000012FA 61 POPA ;restabilim registri
CS:000012FB BE 00 01 MOV SI,100h
CS: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 adresele
de 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-un
fisier VIRUS.DAT (cu lungimea Lv=200h).

Iata etapele de parcurs:

1). Citim primii 3 bytes din TEST.COM -> 50, B4, 09
2). 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 memorie
pentru 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.COM
codul 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.COM

5). Gata.

Mentiuni:
Am descris în acest tutorial numai principiul de infectare a unui
program.
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 cunoasteti
locurile unde se fac referinte absolute la memorie- la infectare
puteti corecta aceste referinte cu lungimea programului (Lp).
Va sfatuiesc sa aveti un singur loc de acest fel - cel în
care veti baga (Lp) într-un registru de exemplu (DX). În continuare
referindu-va la adrese absolute folositi ca baza acest registru.

Sper ca e clar. Daca nu - mai reflectati.

Ca sa aveti un exemplu veti gasi pe moldhack, sectiunea SOFT,
programul 'COM password Installer'.
Sarcina acestui "virus" este de a proteja programele COM cu
parola, dar putea fi si alta Smile

Studiati-l cu succes.
Sus In jos
 
[Tutorial pt. Noobs]Cum sa infectezi un Fisier COM
Sus 
Pagina 1 din 1
 Subiecte similare
-
» [Tutorial] Cum sa faci un sistem de logare/inregistrare!

Permisiunile acestui forum:Nu puteti raspunde la subiectele acestui forum
MaximumGame Community :: Hack Tools & Tutorials :: Programe Hack/Crack/Exploit-
Mergi direct la: