07.02.2015 Views

The Art of Reversing by Ap0x - Tutoriali.org

The Art of Reversing by Ap0x - Tutoriali.org

The Art of Reversing by Ap0x - Tutoriali.org

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!