Debuggere si cod anti-debugging    
 

Cum dreq reusesc hackerii astia sa sparga programe?Sau cum reusesc sa le aplice patch-uri?! Alta intrebare:cum dreq reusesc virusii sa scape nedetectati de produsele antivirus , chiar daca sunt foarte noi?Sau, cum fac antivirusii/antitroienii sa descopere virusi/troieni inca necunoscuti?!
Ha! Daca v-ati pus vreodata cel putin una dintre aceste intrebari si nu ati gasit un raspuns nesatisfacator nici pana acum,atunci il veti gasi cu siguranta in randurile urmatoare plus multe alte "chestii" interesante(cine shtie,shtie!)...

1.Software pentru spargere program(debuggere,dezasambloare,engineuri euristice).

Multi dintre voi probabil ati auzit deja despre debuggere,dezasambloare, engineuri euristice si chiar stiti ce semnifica fiecare,dar fata de restul,care inca nu au auzit sau nu au o idee foarte clara ma simt dator cu explicatii.Toate aceste tipuri de programe amintite pot fi adunate sub o singura titulatura : software pentru spargerea programului.In realitate exista doar doua tipuri de software necesar "hackuirii" unui program si acelea sunt debuggerul si dezasambloarele care lucreaza fara sa acceseze memoria,restul fiind doar derivate ale acestora. Cand vorbim de hackuirea unui program nu va ganditi in mod neaparat la ceva ilegal.Aceste produse software sunt folosite de betta testeri si chiar de producatorii programului asupra caruia se incearca spargerea(pentru descoperirea de hibe sau "bug-uri") sau sunt folosite, intr-o forma sau alta,de produsele antivirus sau antitroian incearcand sa determine daca programul care este testat este infectat sau nu cu virus cunoscut sau necunoscut prin cercetarea comportamentului sau(engine-uri euristice) sau incearca stergerea codului virusului/troianului prin folosirea unui debugger(programele de cleaning).
Dupa cum probabil v-ati dat seama, ele sunt folosite si de hackeri sau crackeri pentru a vedea punctele slabe ale programului respectiv(bug-uri) pentru ca in viitor sa le exploateze.
Dar , haideti sa incepem cu inceputul.....

1.1.Debuggere.
Debuggerele sunt programe complexe care executa programul in memorie(periculoase,deoarece codul executat poate contine rutine ofensive care vor fi in RAM in urma acestui proces) sau, cele mai bune, creaza un mediu asemanator sistemului de operare,mediu in care executa programul ce trebuie testat astfel incat,chiar daca programul contine virus/troian sa nu se execute in sistem.Un exemplu demn de luat in seama este puternicul SoftICE.Debuggerele folosesc doua intreruperi pentru a analiza programul : int 3h (breakpoint interrupt) si int 1h(urmarire pas cu pas).Ele pot executa programul in mod normal(run) sau pot executa instructiune cu instructiune(step-by-step) pentru a oferi un control mai bun utilizatorului.Un debugger poate fi folosit foarte usor ca unealta de hacking(singurul lucru necesar fiind cunostintele de asm) si in acelasi timp foarte eficient.Eu personal am spart aproximativ 20 de programe si jocuri folosind doar TD386,care nu este totusi un debugger la fel de performant ca SoftICE.


1.2.Dezasambloare(decompilatoare).
Aceste programe , dupa cum spune si numele , sunt un fel de compilatoare dar in sens invers,adica din limbajul masinii in cel uman(sau aproape uman :P).Ele sunt de doua feluri :
a) care iau secventele de program direct de pe disk.
Din aceasta grupa fac parte majoritatea dezasambloarelor ele fiind mult mai sigure (in cazul in care programul supus dezasamblarii contine cod ofensiv) dar oferind date semnificativ reduse sau diferite de cele reale(in cazul in care codul ce trebuie dezasamblat a fost supus criptarii).Cel mai bun dezasamblor de acest tip pe care l-am intalnit este Sourcer.
b) care iau secventele de program din memorie.
Este imperios sa folositi acest tip de dezasambloare numai daca stiti ce faceti.Buba lor se regaseste in faptul ca ele executa in memorie programul,dupa care fac un dump intr-un fisier si apoi decompileaza fisierul in mod normal.De aceea se poate spune ca sunt un hibrid intre un debugger si dezasamblor.Daca programul ce trebuie dezasamblat contine cod ofensiv odata cu executarea in memorie a sa se executa si portiunea de cod nedorita (virus, troian, bomba logica, s.a.m.d.). Avantajul oferit de aceasta generatie de dezasambloare este ca analizeaza codul real al programului si nu un mirror criptat (care ofera doar date false).

1.3.Engine-uri euristice.
Aceste programe sunt de fapt debuggere modificate special pentru produsele antivirus/antitroian.Ele fac tot ce face un debugger dar,in plus au o baza de date cu operatiile care sunt cel mai des intalnite la virusi si,in acelasi timp, mai rar intalnite la programele normale,adica : rutine de lucru intim cu sistemul de operare, operatii de accesare intreruperi intr-o maniera neobisnuita, cod pentru modificarea timpului si datei fisierului,etc.Adica daca se executa un program in mediul creat si acest program are in codul sau o incercare de determinare a tipului de fisier,atunci acest cod este considerat ca fiind potential ofensiv.Aceste engine-uri euristice nu pot spune cu precizie daca un fisier este infectat sau nu,ele generand o multime de alarme false, dar, cateodata, chiar au dreptate... ;)
Motoarele euristice parcurg un fisier dat de la entrypoint pana la sfarsit si fac un raport despre codul examinat.Acest raport il realizeaza prin compararea instructiunilor din program cu cele din baza lor de date,considerate ca virus-like instructions.

1.4.UNPackere.
Multi au fost foarte mirati cand au vazut ca nu tratez si arhicunoscutele programe de "despachetare",dar acest articol il consider destinat celor care sunt sau vor sa devina hackeri nicidecum oricarui 14m3r(daca nu stiti ce inseamna...hmm,ar fi cazul sa nu mai cititi) caruia i-a picat in mana acest material.Eu nu incurajez frauda,incurajez doar cercetarea.
Trebuie totusi spus ca aceste programe sunt tot un fel de dezasambloare in memorie,doar ca nu dezasambleaza codul ci fac un dump al imaginii necriptate a fisierului intr-un fisier nou si ,astfel,oricat de puternic ar fi algoritmul de criptare ele trec de el pentru ca programul deja s-a decriptat singur in memorie.

2.Cod anti-debugging.
Sincer,de cate ori nu ati pierdut o gramada de timp in fata unui PC scriind un program care se dorea cel putin shareware si in care ati investit timp si munca sperand la o recunoastere a acestei munci printr-o contributie cat de mica la "fondul de pensii" al oricarui programator pentru ca,la mai putin de o saptamana,dupa ce l-ati scos pe piata sa apara deja un patch care sa anuleze toate restrictiile din versiunea demo/shareware?!Poate niciodata,dar oricum io voi vorbi despre codul anti-debugging (:P).In orice caz cine este "dashtept" isi da seama de modurile in care poate fi intr-adevar folosit acest cod...
Cred ca nu vreti ca orice pustan de doi lei care citeste 14m3 ca fiind "pais'pe em trei" sa sparga codul la care v-ati chinuit ore sau zile in cateva minute cu un UNPacker de tot kk,nu-i asa?Dar nici nu va convine sa va apara in programul pe care l-ati protejat cu un produs antihacker ,fel de fel de stringuri de copyright,gen "1996(c) by MeAssHole".Atunci ce sa faceti?
KurruPt - FiŁe vine in salvarea voastra cu acest articol si cu un set de secvente de cod care satura debuggerele de programele in care sunt continute,secvente denumite generic tricks,si care sunt incluse in arhiva ANTI-D.RAR.Dar sa vedem care-i faza cu codul anti-debugger...
Dupa cum probabil v-ati dat seama inca de la sectiunea debuggere,acestea se bazeaza in principal pe doar doua intreruperi.Oare putem exploata asa ceva astfel incat sa tinem sa persoanele neavizate departe de codul nostru?!Bineinteles ca putem.....Aceste doua intreruperi sunt extrem de usor de exploatat si dupa cum veti vedea si in exemplele mele nu trebuie sa fii super-creier ca sa gasesti alte exploituri (sau cel putin sa le intelegi pe astea...;)).In continuare va voi prezenta doua secvente de cod anti-debugger extrem de simple luate din arhiva ANTI-D.RAR pe care o puteti lua gratuit de pe site-ul nostru. Aceasta arhiva contine aproximativ 14 secvente de cod scrise in assembler pe care le puteti incorpora in programele voastre pentru a scapa de debuggere.Toate au fost scrise pentru fisiere de tip EXE sau COM de sub sistemul DOS.Ele n-au fost testate pe fisiere de tip WinEXE!!!!(Inca nu m-am apucat sa cercetez formatul fisierelor din WinDoze :P)

a)suprascrierea intreruperii 3
aceasta secventa de cod nu face altceva decat sa modifice vectorul intreruperii 3h inlocuindu-l cu vectorul intreruperii 21h.Aveti grija unde salvati vechiul vector al intreruperii 3h deoarece daca il pierdeti s-ar putea sa cauzati unele probleme singura rezolvare fiind un warm boot.
Faza cea mai simpatica e ca puteti revectoriza orice alta intrerupere(nu numai int 21h) pe care o folositi mai mult, pe adresa int 3h pentru ca mai apoi sa apelati intreruperea dorita executand vectorul int 3h.Se stie ca aceasta intrerupere este singura din tabela de intreruperi codata pe un singur byte.Astfel daca cineva a spart codul vostru,va trebui sa inlocuiasca fiecare apel la int 3 cu un apel la intreruperea originala.Dar intreruperea originala este codata pe doi bytes...Hmm, va rezulta o mizerie de nedescris!Dati-va singuri seama.... ;)
BTW : sfatul meu este sa faceti revectorizarea manual!

xor ax,ax
mov ds,ax

; Facem rost de vectorii intreruperilor

mov ax,3503h
int 21h
mov ds:[old3_off],bx
mov ds:[old3_seg],es
mov ax,3521h
int 21h
mov ds:[old21_off],bx
mov ds:[old21_seg],es

; Schimbam int 3h cu int 21h
; Dupa aceasta revectorizare TD386 vede programul
; terminat,pentru ca int 3h nu mai exista pentru el. ;) mov dx,old21_off
mov ds,old21_seg
mov ax,2503h
int 21h

;<----- Aici intra codul vostru.
; La mine este o simpla rutina de afisare a unui text,dar poate fi ; orice!
; Functiile int 21h le puteti apela ca inainte(int 21h) sau, mai
; bine cu int 3.In cazul in care codul a fost spart,hackerul va
; trebui sa inlocuiasca fiecare int 3 cu int 21h.Misto,nu?!(mai
; ales daca folositi int 21h la greu ;))In locul int 21h poate fi
; absolut orice alta intrerupere!!!

mov ah,09h
push cs
pop ds
mov dx,offset sir
int 3

;<----- Aici se termina codul vostru.

xor ax,ax
mov es,ax

; Cedam locul sistemului de operare incarcand vectorul int 3h unde ; ii este locul pentru ca totul sa se termine cu bine!!!

mov dx,es:[old3_off]
mov ds,es:[old3_seg]
mov ax,2503h
int 21h

mov ax,4c00h
int 21h


OLD3 LABEL DWORD
OLD3_Off dw ?
OLD3_Seg dw ?

OLD21 LABEL DWORD
OLD21_Off dw ?
OLD21_Seg dw ?
sir db 'Anti-debugging code.Not the best from KurruPt - FiŁe.$'

b)Controlul flagurilor.
Aceasta secventa este una dintre preferatele mele.Software-ul care a murit incercand sa-i dea de cap : RAV 5, RAV 6, TBScan, TBClean, F-Prot, TD386 si toate unpackerele pe care le stiu.Ideea de baza e simpla:cand se incearca urmarirea pas cu pas sau se pun breakpoints(lucruri realizate numai de software-ul destinat spargerii de cod) se activeaza niste flaguri.Copilasul meu nu face altceva decat sa controleze aceste flaguri si daca le vede activate executa un cod ofensiv care sufoca debuggerul,intitulat sugestiv(!) "fuck_the_debugger".Daca flagurile sunt ok atunci se continua executia in mod normal fara nici un inconvenient pentru utilizatorul obisnuit.

start:
push cs
pop ss
;!!!de aici!!!
pushf
pop ax
test ah,01h
;!!!pana aici!!!
;astea au fost cele trei linii de cod care au matrasit atatia c0d3ri ;aflati in spatele unor programe pretentioase ca cele enumerate mai ;sus.
je no_debugger
jmp fuck_the_debugger
no_debugger:
jmp $+3
mov ax,09f4h
push cs
pop ds
mov dx,offset mesaj
int 21h

mov ax,4c00h
int 21h
fuck_the_debugger:
mov al,0feh
out 64h,al

mesaj db 'Trick$'

K!A venit si timpul sa inchei vorbaraia asta ,nu ca nu ar mai fi de vorbit pe tema asta,dar pur si simplu am obosit.Este ora 5:37am si peste fix doua ore si douazeci si trei de minute am cursuri si n-am dormit deloc.Oricum,trebuie sa arunc scrumiera(nu o mai pot folosi, chistoacele deja sunt parte integranta),sa-mi fac loc printre sticlele de Coca-Cola(reclama gratis! CNAule,m-auzi?) si ambalajele de Chio Chips(iarasi?!) si sa intru pe partitia de
linux ....:P
Daca aveti si voi idei despre chestii d-astea , da-tzi-mi o sa^rma pe adresa mea(sper sa-mi scrie cineva adresa,ca io-s prea obosit s-o mai tin minte....) de mail.
BTW,facetzi download la ANTI-D.RAR(il gasiti voi.....) si stiti de ce?!Pentru ca merita (zic io...)! Ciao, /me va pupa si ne vedem pe IRC!

   

 

KurruPt - FiŁe    
Hosted by www.Geocities.ws

1