Jump to content
Dr4k3

Cum sa infectezi un fisier COM

Recommended Posts

Posted

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... :) 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 :) ).

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 :) ).

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 :).

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 :). 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.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...