Generalul Cracking    
 


Am pornit sa scriu un nou articol, si anume unul despre cracking in general. In primul rand : Ce inseamna cracking? Cracking-ul insemna a gasi schemele de protejare a unui program, a fi in stare sa le dezactivezi temporar sau permanent pe diverse cai. Bun. Si care ar fi aceste scheme ? Ele sunt variate : simple numere de inregistrare, protectii care verifica daca exista sau nu anumite fisiere, limtatii de diverse feluri (la timp, numar de utilizari, diverse optiuni dezactivate etc.), prezenta CD-rom-ului in unitate, chei hardware (dongles).
Ca programe sunt folosite debuggerele EX : debug din DOS, Soft-ICE.
Pentru generare de listing-uri in asm sunt folosite dezasambloare : EXSourcer pentru DOS ,W32Dasm, IDA pro pentru programe WIN 16 sau WIN 32.
Cu Soft-Ice poti face aproape orice cu programul ales atata timp cat acesta este incarcat in RAM. De exemplu poti schimba adresa de executie a programului, poti schimba continutul registrilor procesorului, poti vedea orice zona din memorie, poti seta sau reseta flagurile etc Dar cum am spus, modificarile vor fi valabile doar in RAM nu si pe hard disk.
Ei bine, W32Dasm dezasambleaza programul ales, afiseaza clasele, siruri de caractere folosite in program, offset-urile, adresele relative, referiri la adresele de la care au fost executate salturi. Listing-ul se poate salva, spre o utilizare viitoare, deasemenea se poate incarca intr-un editor de texte. Voi trata in acest eseu cracking-ul programelor pentru Windows pe 16/32 biti.

1. Numere de inregistrare
Ce sunt si cum se obtin? Cred ca de multe ori ati intalnit programe shareware care cer numere de inregistrare pentru a putea fi folosite ca programe full. Unele numere de inregistrare sunt simple siruri de caractere alfa-numerice care se afla undeva in program sau in fisierele folosite de acesta. Altele pot fi obtinute prin diverse operatii asupra numelui si/sau companiei, adresei, numarului de telefon etc Sunt programe care folosesc un sistem de criptare avansat (EX : WinRAR). Unele numere de inregistrare difera de la un sistem la altul si de aici nevoia de patchuri sau generatoare de coduri (keygenerators). Cum pot fi gasite ? Folosind un debugger (Soft-Ice e cel mai bun). Se pun puncte de intreruperi la functiile din WINDOWS care permit transferul datelor dintr-o casuta de dialog intr-un anume buffer : GetDlgItemText(A),GetWindowText(A), GetDlgItem etc. Ar trebui stiute prototipurile acestor functii. Ele pot fi gasite in SDK de la WINDOWS etc. Pentru a afla adresa din memorie unde se afla numarul serial introdus se executa o cautare in Soft-Ice :
s 0 l ffff "cod_introdus" - pentru programe pe 16 biti
s 0 l ffffffff "cod_introdus" - pentru programe pe 32 biti
Daca exista string-ul cautat, va fi afisata adresa acestuia. Mai departe se pune o intrerupere la accesarea acestei adrese la citire/scriere. Astfel, Soft-Ice va opri temporar programul acolo unde se va executa o operatie asupra sirului introdus : copiere in totalitate sau numai a anumitor caractere, comparare etc. Ideal ar fi sa se gaseasca cat mai usor compararea numarului fals cu cel real dar acest lucru se intalneste numai la programele cel mai prost protejate EX : Cmp Eax, Ebx unde eax poate stoca codul real , ebx cel fals. Pot fi comparate doar anumite carctere de exemplu daca primul caracter coincide cu '5' sa zicem, si ultimul cu 'R' atunci totul este ok. Compararea se poate face si indirect, adica fara ajutorul instructiunii Cmp. Iata un exemplu : Eax contine codul adevarat iar Ecx cel fals. Daca diferenta dintre ele este 0 atunci iarasi e ok. Acestea sunt doar cateva situatii. In caz ca se face copierea sirului la alta adresa atunci trebuie pus un punct de intrerupere la noua adresa : bpm adresa_noua sau bpr 30:adresa_noua 30:adresa_noua + lungimea_sirului si se sterge cel vechi cu bc nr_intrerupere_precedenta. Ordinea intreruperilor se poate afla cu 'bl'. Acest procedeu se repeta daca este intalnita iarasi o copiere. Daca programul nu foloseste nici una dintre functiile API de mai sus, se pot folosi Hmemcpy sau alte metode. Una dintre ele este urmatoarea : tastati 'task' , obtinand astfel numele modulului de spart, apoi 'hwnd nume_modul_cautat' si cautati in rubrica 'Class Name' edit, retinand ce scrie la 'Window Handle'. Dupa aceea se pune o intrerupere la handle-ul gasit pentru orice mesaj WM_GETTEXT trimis (daca aveti putine cunostiinte de programare de Windows veti intelege mai mult) : 'bmsg handle_gasit wm_gettext'. Soft-Ice va iesi la iveala atunci cand programul va prelua informatia introdusa. Pentru a ajunge in codul programului se apsa F12 de cateva ori. Sper ca nu v-am incalcit gandurile prea mult cu aceasta rubrica de numere de inregisrtare; acestea sunt cele mai comune situatii. Un caz particular se constituie in programele scrise in Visual Basic. Aici se utilizeaza de cele mai multe ori formatul WideString. De exemplu deschidem executabilul cu un editor hexa si vrem sa cautam sirul "Unregistered" (de ce oare ? ;P) vom cauta U.n.r.e.g.i.s.t.e.r.e.d. si nu Unregistered.In cazul programelor vb W32DASM o da in bara in marea majoritate a cazurilor pentru ca executabilul nu este unul obisnuit. El contine date si chemari de functii standard continute in dll ca VBRUN300.DLL, VB40016.DLL sau VB40032.DLL, msvbvm50.dll, msvbvm60.dll care se afla in c:\windows\system. Reverserii de la Dread au venit in ajutorul crackerilor cu o versiune a W32DASM care poate vedea referintele la diverse string-uri. In cazul acesta se poate aplica schema obisnita si anume se cauta mesajul (daca exista :) si se va schimba conditia de validare a numarului serial (eX: in loc de jne mesaj_eroare se pune je, adica totul este ok atata timp cat numarul de serie este diferit de cel corect :P) facandu-se un patch. Aceasta metoda este standard. Ea se poate optimiza. De exemplu pot fi mai multe verificari. Dar ce ne-am fi facut fara aceasta scula? Ei bine, razzia a gasit o solutie valabila pentru vb3 si 4. Iata : - se executa un search de forma
s 0 l ffffffffff 8B,CA,F3,A6,74,01,9f,92,8D,5E,08,E8,0E,06
- se pune un punct de intrerupere la adresa rezultata din cautarea de mai sus:
bpx <seg:offset>
- F5 pana se ajunge la verificare
Tot ce aveti de facut este sa vizualizati continutul de la ds:(e)di si ds:(e)si. Pentru programele scrise in VB 4 este valabil acelasi algoritm dar se executa
s 0 l fffffffff 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14.
In VB 5,6 lucrurile se simplifica oarecum. Acum se pot pune bpx-uri la functii de comparare
standard : __vbastrcomp, __vbastrcmp etc. IMPORTANT : in fisierul winice.dat trebuie
mentionate cele 2 dll-uri astfel EXP=c:\windows\system\msvbvm50.dll si EXP=c:\windows\system\msvbvm60.dll.
Pentru programele in vb6 bpx-ul se va pune astfel : bpx msvbvm60!__NumeFunctie. O
lista cu alte functii vb se poate obtine tastand in Soft-Ice exp __vba. Un alt program care va
poate ajuta vine tot de la NuMega, si anume SmartCheck, un fel de decompilator. Il puteti folosi la gasirea de algoritmi de generare a numerelor seriale (util pentru genaratore de key-uri). Cam atat despre Visual Basic Cracking.


2. Cate ceva despre mesajele 'suparatoare' (nag-screens)

De cate ori nu ati intalnit un program shareware care sa nu va streseze ca mai aveti doar x zile de utilizare a programului respectiv, sau ca programul este 'Unregistered', sau bla...bla...bla In acest caz, W32Dasm ajuta destul de mult, deoarece arata referintele la diverse string-uri,si, daca priviti mai sus dati probabil si peste cauza care a produs afisarea acestora (in loc si la timp nepotrivit ;). Odata gasita aceasta conditie, se inlocuieste cu opusa ei si se face un patch pentru a elimina definitiv acest bug...Presupunand ca avem un nag-screen care afiseaza 'Mesaj' putem proceda astfel: incarcam executabilul in W32DASM si pe urma ii dam un 'Search' scriind mesajul de mai sus. Vom ajunge acolo unde a fost
facuta referinta la acest string :

:004043D4 85C0 test eax, eax
:004043D6 7437 je 0040440F
:004043D8 6A04 push 00000004
* Possible StringData Ref from Data Obj ->"Mesaj"; esti aici
:004043DF 68C8C44000 push 0040C4C8
:004043E4 8B5508 mov edx, dword ptr [ebp+08]
:004043E7 52 push edx
* Reference To: USER32.MessageBoxA, Ord:01BEh
:004043E8 FF159CA14000 Call dword ptr [0040A19C]

Pentru a scapa de mesaj se poate pune in loc de je 0040440F jne 0040440F sau
je 0040440F sau jmp 0040440F(in patch se va inlocui 74 (je) cu 75(jne) sau EB (jmp)). Se observa ca nag-screen-ul s-a constituit intr-un messagebox. Putem folosi si Soft-Ice astfel bpx messageboxa, F12 odata, ctrl+UP ca sa vedem conditia, punem un bpx la adresa cu saltul conditionat (in cazul nostru 004043D6), F5, provocam programul sa ne arate iarasi mesajul, caz in care ne trezim in Soft-Ice la bpx pus inainte..., rfl z (adica setam flagul z in pozitia dorita :), bc *, si sdin nou F5. Nici urma de nag-screen. Unele nag-screen-uri mai atragatoare pot fi cele care folosesc DialogBoxParamA, DialogBoxIndirectParamA etc

   

Uzzi    
Hosted by www.Geocities.ws

1