| |
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
|
|
|
 |