The Art of Reversing by Ap0x - Tutoriali.org
The Art of Reversing by Ap0x - Tutoriali.org
The Art of Reversing by Ap0x - Tutoriali.org
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
praksi a posledica je loseg nacina programiranja jer ovakav primer<br />
predstavlja jednostavan poziv funkciji koja vraca vrednosti True ili False u<br />
zavisnosti da li je uneti serijski broj ispravan ili ne. Imajte na umu da se<br />
ovakva vrsta zastite, bez obzira koliko ona bila slozena unutar koda CALLa,<br />
resava za svega par minuta. Dakle resenje ovog problema shvatite tako sto<br />
nikada nemojte da pisete funkcije koje ce vracati vrednosti True ili False pri<br />
proveri serijskog broja, rutine za proveru pisite drugacije.<br />
Iako izgleda da smo sa ovim primerom zavrsili to nije tacno. Ovaj program<br />
kao i mnogi drugi belezi podatke o registraciji negde u sistemu. Mi cemo<br />
pronaci mesto gde se belezi ova informacija i zaobici cemo proveru tacnosti<br />
ove informacije.<br />
Kao sto sto smo vec videli, jednostavnim patchovanjem resavamo problem<br />
funkcija koje proveravaju tacnost nekog serijskog broja. Ono sto se sada<br />
pitamo je da li smo zaobisli vazne provere koje se mogu nalaziti unutar<br />
samog CALLa. Pogledacemo malo detaljnije CALL i videcemo sledece stvari:<br />
1) On generise fajl <strong>The</strong><strong>Art</strong>OfCracking.key u koji se najverovatnije<br />
zapisuje registracija.<br />
2) Ovaj fajl ce biti smesten u Windows direktorijum tako da kada se<br />
sledeci put crackme startuje, ovi podaci ce se ucitati i proveriti<br />
3) Postoji jedan zanimljiv skok:<br />
004085DE /0F85 B8000000 JNZ patchme.0040869C<br />
Ovaj skok nas vodi dovde:<br />
0040869C |> \33DB<br />
0040869E |> 33C0<br />
XOR EBX,EBX<br />
XOR EAX,EAX<br />
a sluzi za dodeljivanje vrednosti 0 EAXu i EBXu. Posto znamo da EAX<br />
na izlazu iz ovog CALLa mora biti jednak jedan, ovo znaci da se gornji<br />
skok ne sme izvrsiti. Ono sto nas trenutno buni je to sto ako se ne<br />
izvrsi gornji skok primeticemo da ce se sledeca dva reda uvek izvrsiti:<br />
00408695 |. BB 01000000 MOV EBX,1<br />
0040869A |. /EB 02<br />
JMP SHORT patchme.0040869E<br />
Hmmm, ovde imamo mali problem u EBX se smesta 1 a ne u EAX. Ako<br />
pogledamo odmah ispod prvog donjeg RETa videcemo odgovor na ovo<br />
pitanje:<br />
004086C0 . 8BC3<br />
004086C2 . 5E<br />
004086C3 . 5B<br />
004086C4 . 8BE5<br />
004086C6 . 5D<br />
004086C7 . C3<br />
MOV EAX,EBX<br />
POP ESI<br />
POP EBX<br />
MOV ESP,EBP<br />
POP EBP<br />
RET<br />
Aha na samom kraju se EAXu dodeljuje vrednost iz EBXa.<br />
Ostaje nam samo da se postaramo da se skok sa adrese 004085DE nikada<br />
ne izvrsi jer ce tada oba uslova biti ispunjena. I fajl ce biti snimljen i EAX ce<br />
uvek biti jednako jedan. Stoga cemo samo NOPovati JUMP na adresi<br />
004085DE i fajl ce biti snimljen sa bilo kojim unetim imenom i serijskim<br />
brojem. Ako uradimo trajni patch na ovoj adresi videcemo da ako ponovo<br />
startujemo ovaj crackeme on ce uvek biti registrovan sa bilo kojim unetim<br />
imenom i sa bilo kojim unetim serijskim brojem.<br />
<strong>The</strong> <strong>Art</strong> <strong>of</strong> <strong>Reversing</strong> <strong>by</strong> <strong>Ap0x</strong> Page 80 <strong>of</strong> 293