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.
<strong>The</strong> Serials – Patching<br />
Ponekad je potrebno naterati program da misli da je svaki uneti<br />
serijski broj ispravan. Ova tema je vec dotaknuta na samom pocetku<br />
poglavlja ali cemo ovde tu pricu prosiriti sa novim cinjenicama i olaksati sebi<br />
u mnogo cemu posao. Primer za ovaj deo poglavlja se nalazi u folderu Cas2 a<br />
zove se patchme.exe. Otvoricemo ovaj program pomocu Ollya i potrazicemo<br />
string koji se pojavljuje na ekranu kada unesemo pogresan serijski broj. Ta<br />
poruka je “Bad Cracker” - bez navodnika, a naci cemo je na standardan nacin<br />
pomocu string referenca. Poruka se nalazi ovde:<br />
004087C8 |> \68 18884000 PUSH patchme.00408818 ; /Text = "Bad Cracker"<br />
a ako pogledamo malo gore videcemo i poruku o ispravnom seriskom broju.<br />
004087B1 |. 68 0C884000 PUSH patchme.0040880C ; /Text = "Cracked ok"<br />
Primeticemo jedan kondicionalni skok iznad poruke o ispravnom serijskom<br />
broju.<br />
004087A9 |. E8 7EFDFFFF<br />
004087AE |. 48<br />
004087AF |. 75 17<br />
CALL patchme.0040852C<br />
DEC EAX<br />
JNZ SHORT patchme.004087C8<br />
Tom skoku prethodi jedan CALL od kojeg direktno zavisi da li ce ovaj skok<br />
biti izvrsen, a ovo znaci da je ovo mesto na kome se proverava uneti seriski<br />
broj, stoga cemo postaviti jedan break-point na taj CALL i pokrenucemo<br />
program. U polja za unos cemo uneti ap0x kao ime a kao serijski broj<br />
111111, pa cemo pritisnuti Check. Naravno program je zastao na nasem<br />
break-pointu. Sa F7 uci cemo u njega i naci cemo se ovde:<br />
0040852C /$ 55<br />
0040852D |. 8BEC<br />
0040852F |. 81C4 E4FEFFFF<br />
PUSH EBP<br />
MOV EBP,ESP<br />
ADD ESP,-11C<br />
00408535 |. 53 PUSH EBX<br />
Ono sto znamo o ASM komandama pomoce nam da resimo ovaj problem.<br />
Ako pogledamo adrese 004087AE i 004087AF videcemo da se EAX smanjuje<br />
za jedan, a ako je nesto manje ili jednako necemu onda se skace na poruku<br />
o pogresnom serijskom broju. Ovo nesto je zero flag. Dakle ako je EAX<br />
jednak minus 1 odnosno FFFFFFFF onda ce se skociti na poruku o pogresnom<br />
serijskom broju. Da bismo ovo izbegli moramo da EAXu dodelimo takvu<br />
vrednost da kada se od nje oduzme jedan vrednost u EAXu bude veca od<br />
minus jedan. Naravno u EAX cemo smestiti najveci sledeci broj to jest jedan,<br />
tako da kad od njega oduzmemo jedan JNZ ne bude izvrsen jer je EAX posle<br />
oduzimanja jednak nula a ne minus jedan. Ovu izmenu koda cemo raditi<br />
unutar samog CALLa a ne pre CALLa jer ne znamo da li se ova funkcija<br />
poziva vise puta i odakle, tako da je najsigurnije da to uradimo u samom<br />
CALLu. Da bismo uradili ovo sto smo zamislili selektovacemo adresu<br />
0040852C i duplim klikom izmenicemo njen sadrzaj u ovo:<br />
0040852C B8 01000000 MOV EAX,1<br />
00408531 C3 RET<br />
Izmenili smo ASM kod u ovo jer ovaj kod radi bas ono sto mi zelimo. On<br />
EAXu dodeljuje vrednost jedan i pomocu komande RET se vraca iz ovog<br />
CALLa, a samim tim ce svaka provera koja je prosledjena ovom CALLu uvek<br />
biti uspesna to jest za svaki uneti serijski broj i ime program ce pokazivati da<br />
je registrovan. Na isti nacin se resava ovaj isti problem ako se umesto DEC<br />
EAX komande nalazi TEST EAX,EAX komanda. Ovaj primer se cesto srece u<br />
<strong>The</strong> <strong>Art</strong> <strong>of</strong> <strong>Reversing</strong> <strong>by</strong> <strong>Ap0x</strong> Page 79 <strong>of</strong> 293