Cracking human_thought's CD-Check Crackme
by basdog22
ΕΚΘΕΣΗ ΓΙΑ ΤΟ 1ο PROJECT
Ο basdog22 που είναι πραγματικά ένα σημαντικό μέλος της ομάδας μας,έσπασε αρκετά σύντομα το crackme που είχα δημοσιεύσει πριν λίγο καιρό στο πλαίσιο του πρώτου project της M.a.s.k. Πραγματικά τον ευχαριστώ πολύ που ασχολήθηκε με αυτό το crackme και ακόμα περισσότερο που έγραψε αυτό το βοήθημα.Η έκθεσή του για το Age Of Empires που θα έρθει σε λίγο καιρό είμαι σίγουρος ότι θα βοηθήσει πολλά άτομα.Προς το παρόν απολαύστε αυτήν εδώ,ως άλλη μία προσφορά στο project των Cd checks.
Μερικά λόγια ~~~~~~~~~~~~~ Το crackme αυτό ήρθε σε μια πολύ περίεργη στιγμή για μένα. Μόλις που ξεκίνησα να γράφω το βοήθημά μου για το 1ο project της M.a.s.k. και επιλέγοντας σαν στόχο το Age of Empires. ;=) Ας λερώσουμε τα χέρια μας ~~~~~~~~~~~~~~~~~~~~~~~~~~ Με το OllyDBG αναλύουμε τον κώδικα και καθώς κάνουμε step με το F8 φτάνουμε στα παρακάτω:
004011E6 > 66:AD LODS WORD PTR DS:[ESI] 004011E8 . 66:33D0 XOR DX,AX 004011EB . 81F9 09030000 CMP ECX,309 004011F1 . 74 10 JE SHORT CDCHECK.00401203 004011F3 .^E2 F1 LOOPD SHORT CDCHECK.004011E6 <-- Το loop. Πρέπει να βάλουμε ένα breakpoint 004011F5 . 66:81FA B140 CMP DX,40B1 <-- εδώ για να μην περιμένουμε και πολύ. 004011FA 75 02 JNZ SHORT CDCHECK.004011FE <-- Μια μικρή αλλαγή εδω σε JZ γιατι αλλιώς badBoy 004011FC . EB 0B JMP SHORT CDCHECK.00401209 <-- Αυτό θα μας στείλει στον παρακάτω κώδικα:
00401209 > 8D05 55314000 LEA EAX,DWORD PTR DS:[403155] 0040120F . 83C0 18 ADD EAX,18 00401212 . 50 PUSH EAX ; /ProcNameOrOrdinal => "GetDriveTypeA" 00401213 . FF35 41314000 PUSH DWORD PTR DS:[403141] ; |hModule = BFF60000 (KERNEL32) 00401219 . E8 62000000 CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress 0040121E . A3 4D314000 MOV DWORD PTR DS:[40314D],EAX 00401223 . 6A 00 PUSH 0 00401225 . FF15 4D314000 CALL DWORD PTR DS:[40314D] 0040122B . A2 40314000 MOV BYTE PTR DS:[403140],AL 00401230 . E8 CBFDFFFF CALL CDCHECK.00401000 <-- Η λύση του μυστηρίου για να δούμε 00401235 > 8D05 55314000 LEA EAX,DWORD PTR DS:[403155]
00401000 $ 803D 40314000 >CMP BYTE PTR DS:[403140],4 <-- Εδώ ελέγχει αν είναι σε CD 00401007 0F86 EE000000 JBE CDCHECK.004010FB <-- Αν όχι τότε BadBoy MSG. Γι αυτό αλλαγη σε JGE 0040100D . EB 02 JMP SHORT CDCHECK.00401011 <-- Συνέχεια 0040100F 8B DB 8B 00401010 . 46 INC ESI 00401011 > 8D05 55314000 LEA EAX,DWORD PTR DS:[403155] 00401017 . 83C0 0D ADD EAX,0D 0040101A . 50 PUSH EAX ; /FileName => "User32.dll" 0040101B . E8 66020000 CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA 00401020 . A3 34314000 MOV DWORD PTR DS:[403134],EAX 00401025 . 8D05 55314000 LEA EAX,DWORD PTR DS:[403155] 0040102B . 50 PUSH EAX ; /FileName => "Kernel32.dll" 0040102C . E8 55020000 CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA 00401031 . A3 30314000 MOV DWORD PTR DS:[403130],EAX 00401036 . 8D05 55314000 LEA EAX,DWORD PTR DS:[403155] 0040103C . 83C0 26 ADD EAX,26 0040103F . 50 PUSH EAX ; =>VolumeInformationA" <-- Χμμ.. 00401040 . FF35 30314000 PUSH DWORD PTR DS:[403130] ; |hModule = NULL 00401046 . E8 35020000 CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress 0040104B . 68 2C314000 PUSH CDCHECK.0040312C 00401050 . 6A 00 PUSH 0 00401052 . 6A 00 PUSH 0 00401054 . 6A 00 PUSH 0 00401056 . 68 24314000 PUSH CDCHECK.00403124 0040105B . 6A 0D PUSH 0D 0040105D . 68 28314000 PUSH CDCHECK.00403128 00401062 . 6A 00 PUSH 0 00401064 . FFD0 CALL EAX 00401066 . B9 08000000 MOV ECX,8 0040106B . 8D35 28314000 LEA ESI,DWORD PTR DS:[403128] 00401071 . 8BFE MOV EDI,ESI 00401073 . EB 03 JMP SHORT CDCHECK.00401078 00401075 45 DB 45 ; CHAR 'E' 00401076 37 DB 37 ; CHAR '7' 00401077 E0 DB E0 00401078 > AC LODS BYTE PTR DS:[ESI] 00401079 . 34 1D XOR AL,1D 0040107B . AA STOS BYTE PTR ES:[EDI] 0040107C . 24 0F AND AL,0F 0040107E . 8881 37314000 MOV BYTE PTR DS:[ECX+403137],AL 00401084 . 49 DEC ECX 00401085 .^75 F1 JNZ SHORT CDCHECK.00401078 <-- Άλλο ένα loop. 00401087 . 8D35 28314000 LEA ESI,DWORD PTR DS:[403128] | <- C:\*.* ????? 0040108D . B9 00000000 MOV ECX,0 00401092 > AC LODS BYTE PTR DS:[ESI] 00401093 . F6D0 NOT AL 00401095 . 0081 38314000 ADD BYTE PTR DS:[ECX+403138],AL 0040109B . 41 INC ECX 0040109C . 83F9 08 CMP ECX,8 0040109F .^75 F1 JNZ SHORT CDCHECK.00401092 <-- Άλλο ένα 004010A1 . 8D35 38314000 LEA ESI,DWORD PTR DS:[403138] 004010A7 . 8D3D A2304000 LEA EDI,DWORD PTR DS:[4030A2] 004010AD . F3:A6 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:> 004010AF . 0F94C1 SETE CL <-- Condition False??? 004010B2 75 47 JNZ SHORT CDCHECK.004010FB <-- To τελικό jump. Αλλαγή σε JZ και τέλος 004010B4 . EB 02 JMP SHORT CDCHECK.004010B8 <-- GoodBoy MSG 004010B6 23 DB 23 ; CHAR '#' 004010B7 67 DB 67 ; CHAR 'g' 004010B8 > 8D05 55314000 LEA EAX,DWORD PTR DS:[403155] 004010BE . 83C0 3C ADD EAX,3C 004010C1 . 50 PUSH EAX ; /ProcNameOrOrdinal => "MessageBoxA" 004010C2 . FF35 34314000 PUSH DWORD PTR DS:[403134] ; |hModule = NULL 004010C8 . E8 B3010000 CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress 004010CD . 6A 00 PUSH 0 004010CF . 68 09304000 PUSH CDCHECK.00403009 004010D4 . 68 4E304000 PUSH CDCHECK.0040304E 004010D9 . 6A 00 PUSH 0 004010DB . FFD0 CALL EAX 004010DD . EB 03 JMP SHORT CDCHECK.004010E2 004010DF 45 DB 45 ; CHAR 'E' 004010E0 98 DB 98 004010E1 A0 DB A0 004010E2 > 8D05 55314000 LEA EAX,DWORD PTR DS:[403155] 004010E8 . 83C0 48 ADD EAX,48
Bλέπουμε ότι το crackme κάνει ό,τι ακριβώς λέει ο human_thought ότι κάνει. Δεν ελέγχει μόνο αν το Cd υπάρχει αλλά αν έχει και το σωστό όνομα επίσης. Στο 00401000 γίνεται ο έλεγχος για το CD και μετά στο 0040103F με το GetVolumeInformationA ζητά πληροφορίες για το όνομα του CD.Έτσι στο 004010ΑF αν η συνθήκη είναι αληθής το jump στο 004010Β2 δεν εκτελείται και φτάνουμε στο GoodBoy MSG.
Επίλογος ~~~~~~~~~ To συγκεκριμένο crackme ήταν κάτι σαν δώρο για μένα αφού με βοήθησε να καταλάβω ακόμη περισσότερο τι πρέπει να κάνω όσων αφορά το βοήθημά μου για το 1ο project της M.A.S.K.
basdog22@yahoo.com
ΠΡΟΣΟΧΗ Φυσικά δεν χρειάζεται καν να σας θυμίσω πως το βοήθημα αυτό είναι αυστηρά για εκπαιδευτικούς σκοπούς και για την οποιαδήποτε λάθος χρήση τους ο δημιουργός του δεν φέρει καμμία ευθύνη.Αν θέλετε έτοιμα cracks υπάρχουν πολλά άλλα μέρη στο internet,εδώ παρέχουμε μόνο γνώση.