• No results found

CD Checking CrackMe

In document The Art of Reversing by Ap0x (Serbian) (Page 111-114)

Posle teorije stize praksa. Za potrebe ovog dela knjige je napisan program koji se nalazi …\Casovi\Cas5\cd.exe ovde. Ovo je jedan odlican primer posto tacno prikazuje kako bi radila neka CD zastita u praksi. Program ce prvo proveriti sve CD / CD-RW uredjaje u kompjuteru i na svakom od njih potrazice neki fajl, ako taj fajl postoji i ima sadrzinu koju treba da ima onda je u pitanju pravi CD. Naravno ovo je najjednostavniji primer koji se moze zaobici i virtualnim CDom ali mi to ne zelimo, zar ne ? Startujte program i videcemo da izgleda veoma obicno. Ako pritisnemo dugme :: Run Game :: pojavice se prozor o ne unetom CDu CD uredjaj. Ovo cemo da “popravimo”. Ako se secate teorijskog dela ovog poglavlja ovo ce biti izuzetno lako. Ucitajmo ovu “metu” u OllyDBG. Mogli bismo da nadjemo mesto gde se stvara ovaj dijalog ali pokusacemo nesto drugo ovaj put. Znamo da program sigurno mora da koristi Windows API funkciju GetDriveTypeA kako bi odredio koji od uredjaja u kompjuteru je CD-ROM. Sve sto treba da uradimo je da nadjemo gde se poziva ova funkcija. Sreca nasa sto koristimo Olly jer je trazanje ovakvih API poziva izuzetno lako. Pritisnimo dugme E iz gornjeg toolbara ili ALT + E na tastaturi. Ovaj prozor koji trenutno vidimo daje nam mnogo informacija o samom programu:

U ovom prozoru mozemo videti koji su sve fajlovi u direktnoj upotrebi od strane ovog programa, naravno Olly ce prikazati samo odredjene programske module (.vxd,.ocx,.dll i sl.) koji sadrze odredjeni ASM kod koji ovaj program poziva. Ono sto mi zelimo da saznamo je koje API pozive vrsi ovaj program. Kliknucemo desnim dugmetom misa na prvi red (on je ujedno i putanja do fajla pa i sam taj fajl) i kliknucemo na View Names. Ono sto se sada pojvaljuje je sledece:

Spisak svih API poziva je podeljen po sekcijama i dll fajlovima u kojima se nalaze. Da biste lakse nasli API koji nama treba mozete da kucate na

tastaturi njegovo ime. Sada kada smo ga nasli i selektovali postavicemo break-point na njega, pritisnite desno dugme na tom APIju i selektujete Toggle breakpoint on import, sto znaci da ce program stati kada program prvi put pozove ovaj API. Sada pokrenite program i pritisnite ::Run Game:: i program je zastao ovde:

Ako pogledate ovo cudno mesto gde smo sada nista vam nece biti jasno. Videcete samo da EAX sadrzi string A: i da ovaj deo koda najverovatnije sluzi sa proveru uredjaja A: Ali ovde nam je nesto cudno, pogledajte te adrese sa strane 77??????, kao da se nalazimo u nekom DLLu ? Ako pogledate ime prozora Ollyja videcete da u njemu pise [CPU main thread, module kernel32] sto znaci da mi i jesmo u DLLu i to u kernel32.dll Skinimo ovaj break-point sa 77E69143 (moze se razlikovati na vasem kompjuteru) i pritiskajuci F8 sve dok se ne izvrsi i RET 4 komanda. Sada smo se iz kernel32.dll-a vratili u nasu metu. Nalazimo se u jednoj malo duzoj petlji odmah ispod:

00408403 |. 50 |PUSH EAX ; /RootPathName 00408404 |. E8 93C7FFFF |CALL JMP.&kernel32.GetDriveTypeA ; \GetDriveTypeA

a odmah iznad

00408409 |. 83F8 05 |CMP EAX,5 <- Ovde smo

0040840C |. 0F85 98000000 |JNZ cd.004084AA

00408412 |. 8D85 20FEFFFF |LEA EAX,DWORD PTR SS:[EBP-1E0]

00408418 |. B9 2C854000 |MOV ECX,cd.0040852C ; ASCII "\main.xxx" 0040841D |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8]

00408420 |. E8 FBB9FFFF |CALL cd.00403E20

00408425 |. 8B85 20FEFFFF |MOV EAX,DWORD PTR SS:[EBP-1E0] 0040842B |. E8 E4D5FFFF |CALL cd.00405A14

00408430 |. 84C0 |TEST AL,AL

00408432 |. 74 76 |JE SHORT cd.004084AA

Ono sto iz ovoga moze da se zakljuci a sto znamo iz teorije je da ako se EAX poredi sa 5, a sve ovo se desava ispod nekog poziva GetDriveTypeA APIja to znaci da se proverava da li je drajv CD-ROM ili ne. Ako se u EAXu ne nalazi 5 nego neka druga vrednost program ce skociti na adresu 004084AA, to jest ovde:

004084AA |> \43 |INC EBX 004084AB |. 83FB 5B |CMP EBX,5B 004084AE |.^ 0F85 08FFFFFF \JNZ cd.004083BC

Primecujemo da se ovde EBX poredi sa 5Bh ili sa 91 decimalno, ako je broj veci ili jednak program ce nastaviti sa izvrsavanjem i izaci ce iz ove petlje. Ovo znaci da ce se pretraziti svi uredjaji u sistemu od A: do Z: (90 je ASCII kod za Z) u potrazi za CD-ROMom. Ok sada smo saznali dosta o ovoj zastiti postavimo break-point na 00408409 da saznamo sta se dalje desava posle provere CMP EAX,5. Ako pritisnemo F8 program ce izvrsiti ovu komandu i preci ce na izvrsavanje sledece. Ono sto ne zelimo da se desi je da se izvrsi skok na kraj petlje pa cemo NOPovati adresu 0040840C. Izvrsavamo kod sa F8 sve dok ne stignemo do adrese 0040842B kada nam sadrzaj EAXa izgleda jako zanimljivo. EAX je sada jednak “A:\main.xxx”. Sta ovo znaci ? Ovo znaci da program ili proverava postojanje fajla “A:\main.xxx” na “CDu” ili

pokusava da otvori taj fajl. Ako fajl ne postoji ili ne moze biti otvoren onda ce se skok na adresi 00408432 izvrsiti i program ce proveriti neki drugi uredjaj. Pogledajmo sta bi se to izvrsilo kada bi fajl postojao:

00408434 |. 8D85 1CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1E4]

0040843A |. B9 2C854000 |MOV ECX,cd.0040852C ; ASCII "\main.xxx" 0040843F |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8]

00408442 |. E8 D9B9FFFF |CALL cd.00403E20

00408447 |. 8B95 1CFEFFFF |MOV EDX,DWORD PTR SS:[EBP-1E4] 0040844D |. 8D85 2CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1D4] 00408453 |. E8 0CA5FFFF |CALL cd.00402964

00408458 |. 8D85 2CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1D4] 0040845E |. E8 9DA2FFFF |CALL cd.00402700

00408463 |. E8 B0A1FFFF |CALL cd.00402618

00408468 |. 8D55 FC |LEA EDX,DWORD PTR SS:[EBP-4] 0040846B |. 8D85 2CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1D4] 00408471 |. E8 86A7FFFF |CALL cd.00402BFC

00408476 |. 8D85 2CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1D4] 0040847C |. E8 E7A7FFFF |CALL cd.00402C68

00408481 |. E8 92A1FFFF |CALL cd.00402618

00408486 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]

00408489 |. BA 40854000 |MOV EDX,cd.00408540 ; ASCII "CD_main_xxx" 0040848E |. E8 85BAFFFF |CALL cd.00403F18

00408493 |. 75 05 |JNZ SHORT cd.0040849A 00408495 |. BE 01000000 |MOV ESI,1

0040849A | 8D85 2CFEFFFF |LEA EAX,DWORD PTR SS:[EBP-1D4] 004084A0 |. E8 7BA5FFFF |CALL cd.00402A20

004084A5 |. E8 6EA1FFFF |CALL cd.00402618

Ovo i ne izgleda kao nesto posebno, nema nikakvih poredjenja i uslova sem jednog skoka na adresi 00408493 koji kada se ne izvrsi ESI postaje jednak 1. Hmmm ovo bi mozda moglo biti zanimljivo? Ako pogledamo odmah ispod ove petlje videcemo ovo:

004084B4 |. 85F6 TEST ESI,ESI

004084B6 |. 75 18 JNZ SHORT cd.004084D0

A ako se ovaj skok izvrsi vodi nas pravo na poruku o ubacenom CDu u CD- ROM i do “startovanja igre”. Ako pogledamo pre same petlje videcemo da je pocetno stanje ESIa jednako 0.

004083B5 |. 33F6 XOR ESI,ESI 004083B7 |. BB 41000000 MOV EBX,41

Analizom ove petlje dosli smo do zakljucka da ce program ispitati sve uradjaje u kompjuteru od A: do Z: u potrazi za CDom koji na sebi ima fajl “main.xxx”, i ako je ovo sve ispunjeno i taj fajl sadrzi nesto sto se u njemu trazi (najverovatnije string “CD_main_xxx”), ako je ovo sve ispunjeno onda ce ESI biti jednak 1 kao znak da se CD sa igricom nalazi u sistemu. Ovaj problem mozemo resiti na razlicite nacine.

1) Mozemo promeniti skok na adresi 004084B6 u JMP tako da se igra uvek startuje (ovo je ujedno i naljaksi nacin)

2) Mozemo umesto JNE (jnz) na adresi 004084AE uneti MOV ESI,1 tako da je ESI pre same provere (TEST ESI,ESI) sigurno jednak 1

3) Mozemo izmeniti adresu 004083B2 i uneti MOV ESI,1 umesto postojeceg koda i tako cemo pre same petlje ESIju dodeliti vrednost 1 i izbrisati ono XOR ESI,ESI koje ESIi dodeljuje vrednost 0.

4) Postoji mnogo nacina, vi kao vezbu uz ovo poglavlje smislite neki koji ja nisam ovde nabrojao.

In document The Art of Reversing by Ap0x (Serbian) (Page 111-114)

Related documents