Site hosted by Angelfire.com: Build your free website today!

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.



Εργαλεία:  OllyDebug

Δυσκολία:  Εύκολο 

Συνοδευτικά αρχεία: ΕΔΩ

 

Μερικά λόγια
~~~~~~~~~~~~~


Το 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,εδώ παρέχουμε μόνο γνώση.

 

BACK HOME