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

Σπάζοντας το Age of Empires CD Check

 

by basdog22

ΕΚΘΕΣΗ ΓΙΑ ΤΟ 1ο PROJECT


Λίγο καιρό μετά την τελευταία του έκθεση για το σπάσιμο του cd check crackme,ο basdog22 χτυπάει 
ξανά :) Με μία έκθεση για το cd check του Age Of Empires και με μία πιο γενική ανάλυση των cd 
checks.Μια εξαιρετικά ενδιαφέρουσα έκθεση που μπορείτε να διαβάσετε αμέσως τώρα...



Εργαλεία:  WinDasm,SoftIce

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

 

Apologies
~~~~~~~~~~
Λοιπόν το ξέρω οτι αυτό δεν είναι και απο τα πιο δύσκολα παιχνίδια για να σπάσεις. Είχα 
ξεκινήσει μία προσπάθεια να σπάσω το Thief 2: The metal age αλλά μετά απο κάτι άτυχα 
γεγονότα (καταραμένε Western Digital) όλη η δουλειά πήγε πίσω και έτσι αναγκάστηκα 
να γράψω για το παλιότερο παιχνίδι που έχω. Ίσως και η πιό εύκολη προστασία που έχω 
συναντήσει (Ελέω Micro$oft.Τελικά ή δεν ξέρουν να φτιάχνουν προστασίες ή δεν 
θέλουν να το κάνουν.Ο ανιψιός μου το έσπασε σε 15 λεπτά και μόνο με 1 μήνα ασχολίας 
με το cracking ).




Μερικά λόγια
~~~~~~~~~~~~~
Τον καιρό που ασχολούμαι έμαθα να αναλύω τον τρόπο που δουλεύει το κάθε πρόγραμμα και αυτό με 
βοηθά πάρα πολύ στο να μην χάνω τον καιρό μου και να ξέρω εκ των προτέρων τι πρέπει να κάνω και 
που πρέπει να ψάξω.

Ανάλυση
~~~~~~~~
Λοιπόν πρώτα απ'όλα πρέπει να καταλάβουμε το βασικό μοτίβο κάθε προστασίας cd.:
1) Υπάρχει δίσκος στο cd-drive;
2) Ο δίσκος πληρεί τις προυποθέσεις απο πλευράς μεγέθους;
3) Υπάρχουν τα αρχεία που η προστασία ζητά;
4) Είναι αυτά τα αρχεία μόνο για ανάγνωση;
Ξέροντας όλα αυτά και ξέροντας οτι τα ΑΡΙ που θα χρειαστεί να ψάξουμε είναι τα:


α) GetDriveTypeA
β) GetVolumeInformationA
ξεκινάμε.

Ας λερώσουμε τα χέρια μας
~~~~~~~~~~~~~~~~~~~~~~~~~~
Αφού εγκαταστήσουμε το παιχνίδι και το τρέξουμε για πρώτη φορά (χωρίς το cd φυσικά) θα δούμε το 
γνωστό μήνυμα που θα μας προτρέπει να βάλουμε το CD.Έξοδος απο το παιχνίδι και αναλύουμε τον 
κώδικα με το W32Dasm.Προσπαθώντας να βρούμε το μήνυμα καταλαβαίνουμε οτι κάτι δεν πάει καλά.
Το κείμενο δέν υπάρχει στα string references του w32dasm. Αυτό μας λέει οτι ίσως το κείμενο που 
είδαμε στο msgbox δεν είναι κείμενο αλλά γραφικό.Έξυπνη κίνηση αλλά δεν θα μας σταματήσει γιατί 
ξέρουμε και άλλο τρόπο για να ψάξουμε.Στο GetDriveTypeA απο τα imports του w32dasm 
διπλοκλικάρουμε και φτάνουμε στον παρακάτω κώδικα:

       :004D6550 81EC0C020000 sub esp, 0000020C
       :004D6556 53 push ebx
       :004D6557 56 push esi
       :004D6558 8B410C mov eax, dword ptr [ecx+0C]
       :004D655B 57 push edi
       :004D655C 55 push ebp
       :004D655D 8BF1 mov esi, ecx
       :004D655F 8B8808040000 mov ecx, dword ptr [eax+00000408]
       :004D6565 85C9 test ecx, ecx
       :004D6567 750A jne 004D6573 <--Σημαντικό
       :004D6569 B801000000 mov eax, 00000001
       :004D656E E9E5000000 jmp 004D6658 <--Τέλος;
       ...
       ...
       :004D65F5 57 push edi <-- Το Cd Path
       :004D65F6 FF1554267000 Call KERNEL32.GetDriveTypeA <-- Το call στο GetDriveTypeA
       :004D65FC 83F805 cmp eax, 00000005 <-- σύγκριση με το 5(5=cdrom)
       :004D65FF 7404 je 004D6605 <-- To jump εκτελείται άν υπάρχει cdrom
       :004D6601 33C0 xor eax, eax <-- μηδενισμός του eax; Χμμμ..
       :004D6603 EB53 jmp 004D6658 <-- συνέχεια του προγράμματος
       :004D6605 8D84241C010000 lea eax, dword ptr [esp+0000011C] <-- Volume-check        ...
       :004D660C 6800010000 push 00000100
       :004D6611 8D4C241C lea ecx, dword ptr [esp+1C]
       :004D6615 50 push eax
       :004D6616 8D54241C lea edx, dword ptr [esp+1C]
       :004D661A 51 push ecx
       :004D661B 8D44241C lea eax, dword ptr [esp+1C]
       :004D661F 52 push edx
       :004D6620 8D4C242C lea ecx, dword ptr [esp+2C]
       :004D6624 50 push eax
       :004D6625 6800010000 push 00000100
       :004D662A 51 push ecx
       :004D662B 57 push edi <-- Το Cd Path
       :004D662C FF1558267000 Call KERNEL32.GetVolumeInformationA <-- Αυτό τώρα τι είναι;
       :004D6632 85C0 test eax, eax <-- Χα!!! 
       :004D6634 B800000000 mov eax, 00000000
       :004D6639 741D je 004D6658
       :004D663B 8B460C mov eax, dword ptr [esi+0C]
       :004D663E 8D4C241C lea ecx, dword ptr [esp+1C] 
       :004D6642 05FD020000 add eax, 000002FD
       :004D6647 50 push eax <-- ΕΑΧ=ΑΟΕ
       :004D6648 51 push ecx <-- Όνομα του "CD μας"
       :004D6649 E802D60500 call 00533C50 <-- Χμμμ..
       :004D664E 83C408 add esp, 00000008
       :004D6651 83F801 cmp eax, 00000001 <-- 
       :004D6654 1BC0 sbb eax, eax <-- EAX=1; Το cd υπάρχει
       :004D6656 F7D8 neg eax <-- Το ΕΑΧ γίνεται 0
       :004D6658 5D pop ebp
       :004D6659 5F pop edi
       :004D665A 5E pop esi
       :004D665B 5B pop ebx
       :004D665C 81C40C020000 add esp, 0000020C
       :004D6662 C20400 ret 0004 

    
Λοιπόν αυτός ο τρόπος δείχνει πόσο εύκολη είναι αυτή η προσπάθεια προστασίας να παρακαμφθεί. 
Μπορούμε να κάνουμε ΝΟΡ (χωρίς λειτουργία) το je στο 004D65FF ή να το αντιστρέψουμε σε jne 
αλλά αυτό είναι πολύ εύκολο και μερικές φορές δεν θα μας βοηθήσει και πολύ γιατί σε μερικά 
παιχνίδια γίνονται πολλά check και ίσως μας κάνει την ζωή δυσκολότερη. Μπορούμε να αλλάξουμε 
το 00000005 σε 00000003 και έτσι να κάνουμε το πρόγραμμα να τσεκάρει αν υπάρχει σκληρός δίσκος. 
Παρακάτω βλέπουμε οτι το πρόγραμμα δεν ελέγχει μόνο αν υπάρχει δίσκος στο drive αλλά και αν 
έχει το σωστό όνομα. Το πρόγραμμα περιμένει ένα όνομα όπως το ΑοΕ και αυτό είναι στο ΕΑΧ ενώ 
το όνομα του "cd μας" είναι στο ECX (004D6647 εως 004D6656). Όλη αυτή η διαδικασία καταλήγει με 
ένα 1 άν το CD υπάρχει και ένα 0 αν όχι.Μπορούμε να αλλάξουμε το jne 750Α στο 004D6567 σε ΝΟΡ 
9090 ή σε dec ecx inc ecx 4941 και το πρόγραμμά μας να έχει πάντα τιμή 1.

Επίλογος
~~~~~~~~~
Μια ακόμη αστεία προστασία της τελικά αστείας Micro$oft είναι παρελθόν.Το check γίνεται μόνο σε 
ένα σημείο του προγράμματος και αυτό το καταλαβαίνει ο καθένας εφόσον το παιχνίδι παίζει χωρίς 
Cd αφού έχει ξεκινήσει. Δηλαδή μετα τον 1ο έλεγχο μπορείς να βγάλεις το δισκάκι απο το drive και 
το παιχνίδι συνεχίζει να παίζει. Αυτό το συνιστώ σε όλους γιατί είναι ένας εύκολος τρόπος να 
δείς αν το παιχνίδι ζητά άλλα αρχεία κατα την διάρκεια της εκτέλεσής του και αν όλα τα χρήσιμα 
αρχεία έχουν εγκατασταθεί.

    
Συνοδευτικά αρχεία
~~~~~~~~~~~~~~~~~~~~
Λόγω των όχι και τόσο καλών γνώσεων μου σε θέματα προγραμματισμού και ειδικά σε θέματα 
Assembly :=( Ο patcher που έφτιαξα είναι αποτέλεσμα του CodeFussion ενός πολύ καλού 
εργαλείου για την δημιουργία patch. Το παραπάνω εργαλείο δεν χρησιμεύει μόνο στο cracking αλλά 
και στο να κάνεις και άλλα πράγματα όπως scrable σε ένα πακεταρισμένο πρόγραμμα ώστε να είναι 
πιο δύσκολο να αποσυμπιεστεί με ένα απλο Unpacker.

 


ΠΡΟΣΟΧΗ

Φυσικά δεν χρειάζεται καν να σας θυμίσω πως το βοήθημα αυτό είναι αυστηρά 
για εκπαιδευτικούς σκοπούς και για την οποιαδήποτε λάθος χρήση τους ο 
δημιουργός του δεν φέρει καμμία ευθύνη.Αν θέλετε έτοιμα cracks υπάρχουν
πολλά άλλα μέρη στο internet,εδώ παρέχουμε μόνο γνώση.

 

BACK HOME