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

Keygenning WinZip v8.00

Είναι πολλά τα valid serials,Άρη :)

by Mad Devil


νοπτικά στη δημιουργία του  δεύτnbερου κωδικού, καθαρά για
  Σήμερα θα έχετε την χαρά να διαβάσετε μία εξαιρετική έκθεση.Σε αυτό το βοήθημα μπορείτε να 
μάθετε ακολουθώντας τις οδηγίες του Mad Devil,πως μπορείτε να κάνετε keygen για το WinZip 8.00.
Αυτό που αξίζει να αναφέρουμε είναι ότι η έκθεση είναι πολύ αναλυτική και περιγράφει με ακρίβεια 
την προστασία.Ο Mad Devil επιπλέον ανακάλυψε πως το winzip δέχεται 2 valid serials για κάθε 
Username ! Περίεργο έτσι? Στο keygen του που άμα κάνετε compile θα δείτε ότι είναι και 
εξαιρετικά όμορφο,μπορείτε να δείτε πως πραγματικά αυτό που λέει ισχύει.Πραγματικά μία πολύ καλή
έκθεση που σίγουρα αξίζει να διαβάσετε !



 
Κατεβάστε το πρόγραμμα εδώ: www.winzip.com
 
Εργαλεία:  SoftIce, Masm32 by hutch/iczelion
 
Δυσκολία:  Εύκολο - Μέτριο
 
Συνοδευτικά αρχεία: ΕΔΩ

 

   Πιστεύω πως δε χρειάζονται συστάσεις για το WinZip, ένα από τα δημοφιλέστερα προγράμματα
συμπίεσης(compression) και αποσυμπίεσης(decompression) αρχείων που κυκλοφορούν. Το WinZip 
διατίθεται shareware, πράγμα το οποίο σημαίνει ότι μπορούμε να το προμηθευτούμε δωρεάν, 
χρειάζεται όμως να το κάνουμε register προκειμένου να το χρησιμοποιήσουμε πέρα από κάποιο
χρονικό διάστημα… Ειδικότερα χρειάζεται να πληρώσουμε για να προμηθευτούμε έναν κωδικό από 
την κατασκευάστρια εταιρία!!! 
 
   Σε αυτήν εδώ την έκθεση θα μελετηθεί η διαδικασία με την οποία το WinZip επεξεργάζεται το 
όνομά μας και σχηματίζει τον σωστό κωδικό, με τελικό σκοπό την κατασκευή ενός keygenerator, 
ενός προγράμματος δηλαδή, που θα παράγει έναν έγκυρο κωδικό για το WinZip, ανάλογα με το 
όνομα που εισάγουμε κάθε φορά. Δε θα ασχοληθώ καθόλου με το patch, καθώς το θεωρώ πολύ lame!!! 
Εξάλλου η όλη διαδικασία για τη δημιουργία του KeyGen είναι πολύ απλή. 
 
   Ο κωδικός αυτός είναι μοναδικός(?!?) για το όνομά μας, αφού το WinZip παράγει το σωστό
registration code βάσει του ονόματος που έχουμε εισάγει… Στην πραγματικότητα το WinZip παράγει
και έναν δεύτερο κωδικό, τον οποίο πολλοί keygenerators που κυκλοφορούν στο internet, τον
αγνοούν. Εγώ βέβαια, θα αναφερθώ συνοπτικά στη δημιουργία του  δεύτερου κωδικού, καθαρά για
λόγους πληρότητας αυτής της έκθεσης... Πιστεύω ότι ένας keygen, που υπολογίζει έναν από τους
δύο κωδικούς είναι υπεραρκετός, παρόλα αυτά, ο keygen που έχω φτιάξει υπολογίζει και τους δύο 
κωδικούς, οι οποίοι μπορούν να χρησιμοποιηθούν ισοδύναμα με το ίδιο αποτέλεσμα! Οι κωδικοί αυτοί
προορίζονται για την έκδοση 8.00 του WinZip, αλλά πιστεύω θα δουλεύουν μια χαρά και σε 
προγενέστερες εκδόσεις, αφού η προστασία που χρησιμοποιείται στις προηγούμενες εκδόσεις του
WinZip είναι σχεδόν η ίδια!!! (Ελπίζω να δουλεύουν και στις επόμενες εκδόσεις του WinZip...)
 
   Αρκετά όμως με τις πολυλογίες… Τρέχτε, λοιπόν το WinZip (Εννοείται ότι έχετε κάνει setup
πρώτα!!!) και στο παραθυράκι που εμφανίζεται κάντε κλικ στο “Enter registration info”.
Στο νέο παράθυρο που εμφανίζεται εισάγετε το όνομά σας, καθώς και έναν τυχαίο κωδικό.
(π.χ. Mad Devil / 12345678) Μπείτε στο SoftIce και πληκτρολογήστε BPX GetDlgItemTextA και φύγετε
από το SoftIce. Κάντε τώρα κλικ στο “OK”. Το SoftIce ‘σπάει’ και βρισκόμαστε μέσα στο USER32.
Απενεργοποιήστε το προηγούμενο breakpoint (πληκτρολογώντας bd *), και είμαστε έτοιμοι να 
αρχίσουμε!!!
 
 
 
   -Πατήστε μία φορά το F12 για να μπούμε στο WinZip όπου και θα βλέπετε τα ακόλουθα: 
 
 
 
  00407F6D     call [USER32!GetDlgItemTextA]  <- Win32 API... Διαβάζει το όνομα που βάλαμε...
 
  00407F73     push edi                       <- Ο edi δείχνει στο όνομά μας.
 
  00407F74     call 0043F89A                  <- Σε αυτό το call το WinZip ελέγχει αν υπάρχουν
                                                 κενά (space) στο τέλος του ονόματός μας. Αν
                                                 υπάρχουν τα αφαιρεί...
 
  00407F79     push edi                       <- Ο edi δείχνει στο όνομά μας (Τα κενά στο τέλος 
                                                 του ονόματός μας, αν υπάρχουν,έχουν αφαιρεθεί).
 
  00407F7A     call 0043F8C3                  <- Σε αυτό το call το WinZip ελέγχει αν υπάρχουν
                                                 κενά (space) στην αρχή του ονόματός μας. Αν
                                                 υπάρχουν τα αφαιρεί...
 
  00407F7F     pop ecx                        <- Ο ecx δείχνει στο όνομά μας (Τα κενά στο τέλος 
                                                 και στην αρχή του ονόματός μας, αν υπάρχουν, 
                                                 έχουν αφαιρεθεί. Τα κενά ενδιάμεσα στα γράμματα
                                                 του ονόματός μας (εάν υπάρχουν), μένουν ως 
                                                 έχουν).
 
 
 
   -Παρακάτω pushάρονται οι παράμετροι για το επόμενο call, που είναι το GetDlgItemTextA
   -Πατήστε το F10 μερικές φορές για να τις προσπεράσετε και να φτάσετε στο ακόλουθο κομμάτι
    του κώδικα: 
 

 

 

  00407F8F     call [USER32!GetDlgItemTextA]  <- Win32 API... Διαβάζει τον κωδικό που βάλαμε...

 

  00407F95     push esi                       <- Ο esi δείχνει στον κωδικό (registration#)

                                                 που βάλαμε!

 

  00407F96     call 0043F89A                  <- Το call αυτό, όπως και παραπάνω, εξετάζει αν ο

                                                 κωδικός που βάλαμε έχει κενά (space) στο τέλος

                                                 των ψηφίων του και αν υπάρχουν τα αφαιρεί...

                                                                

  00407F9B     push esi                       <- Πάλι ο κωδικός που βάλαμε!

 

  00407F9C     call 0043F8C3                  <- Εξετάζει αν ο κωδικός που βάλαμε έχει κενά

                                                 (space) στην αρχή  των ψηφίων του και αν

                                                 υπάρχουν τα αφαιρεί...         

                                                

  00407FA1     cmp  byte ptr [0048CD78],00    <- Έχει εισάγει ο χρήστης όνομα?

 

  00407FA8     pop  ecx                       <- Ο ecx δείχνει στον κωδικό που βάλαμε...

 

  00407FA9     pop  ecx                       <- Και πάλι ο ecx δείχνει στον κωδικό που

                                                 βάλαμε...

 

  00407FAA     jz   00408005                  <- Αν δεν έχει εισάγει όνομα, τότε bad message!!!

 

  00407FAC     cmp  byte ptr [0048CDA4],00    <- Έχει εισάγει ο χρήστης κωδικό?

 

  00407FB3     jz   00408005                  <- Αν όχι, τότε bad message!!!

 

  00407FB5     call 004079D5                  <- Εδώ πρέπει να πάτε...

 
 
 
 
   Αφού λοιπόν φτάσετε στο συγκεκριμένο call πατήστε μια φορά το F8 για να μπείτε μέσα στο
Call. Σε αυτό το call υπάρχουν αρκετές εντολές, από τις οποίες οι περισσότερες δεν έχουν 
άμεση σημασία για εμάς… Πρόκειται απλά για κάποιες συγκρίσεις ορισμένων byte και κάποιες 
διαδικασίες, τις οποίες δεν έχει νόημα να εξετάσουμε, αφού δεν παίζουν ρόλο για τη δημιουργία
του σωστού serial. Ύστερα από αρκετό tracing στο SoftIce θα φτάσετε στο παρακάτω κομμάτι του
κώδικα, το οποίο καλεί μια διαδικασία, στην οποία φτιάχνεται ο σωστός κωδικός για το όνομά μας!
 
(-Φυσικά εκείνη τη στιγμή δεν είναι δυνατόν να γνωρίζουμε ότι πρόκειται για το σωστό call, αλλά 
μετά από λίγο ψάξιμο που έκανα διαπίστωσα ότι εκεί το πρόγραμμα δημιουργεί το σωστό serial και
σας το λέω απλά για να εξοικονομήσουμε λίγο χρόνο!!!) 
 
   -Πατήστε λοιπόν το F10 μέχρι να φτάσετε  στο παρακάτω κομμάτι του κώδικα:
 
 
 
  00407A98     push edi                       <- Ο edi δείχνει στο όνομα που βάλαμε...
 
  00407A99     call 00407B47                  <- Εδώ ‘φτιάχνεται’ ο σωστός κωδικός!!!
 
 
 
 
   -Πατήστε μια φορά το F8 για να μπείτε μέσα στο call, όπου και θα βλέπετε τα παρακάτω: 
 
 
 
  00407B47     push ebp                       <- Ο ebp pushάρεται στη στοίβα.
 
  00407B48     mov ebp, esp                   <- Μετακίνηση του esp στον ebp.
 
  00407B4A     mov ecx, dword ptr [ebp+08]    <- Ο ecx δείχνει στο όνομα που βάλαμε...
 
  00407B4D     push ebx                       <- Ο ebx pushάρεται στη στοίβα.
 
  00407B4E     push esi                       <- Ο esi pushάρεται στη στοίβα.
 
  00407B4F     push edi                       <- Το όνομα που βάλαμε pushάρεται στη στοίβα...
 
  00407B50     mov dl, byte ptr [ecx]         <- Η τιμή στον ASCII του πρώτου ψηφίου (byte) 
                                                 του ονόματός μας μεταφέρεται στον dl... 
 
  00407B52     xor ebx, ebx                   <- Μηδενίζεται ο ebx.
 
  00407B54     xor eax, eax                   <- Μηδενίζεται ο eax.
 
  00407B56     mov esi, ecx                   <- Ο esi δείχνει στο όνομα που βάλαμε...
 
  00407B58     xor edi, edi                   <- Μηδενίζεται ο edi
 
->00407B5A     test dl, dl                    <- Είναι το ψηφίο (byte) του ονόματός μας 
|                                                ίσο με το μηδέν? (στον ASCII)
|
| 00407B5C     je 00407B6E                    <- Αν ναι, τότε πήδα παρακάτω, αλλιώς συνέχισε...
|
| 00407B5E     movzx dx, dl                   <- Το ψηφίο του ονόματός μας μεταφέρεται στον dx
|
| 00407B62     imul edx, edi                  <- Πολλαπλασιάζεται ο edx με τον edi και το 
|                                                αποτέλεσμα αποθηκεύεται στον edx.
|
| 00407B65     add ebx, edx                   <- O edx προστίθεται στον ebx
|
| 00407B67     mov dl, byte ptr [esi+01]      <- Η τιμή στον ASCII του επόμενου ψηφίου (byte) 
|                                                του ονόματός μας μεταφέρεται στον dl...
|
| 00407B6A     inc edi                        <- Αυξάνεται ο edi κατά 1. Ο edi μετράει το 
|                                                πλήθος των ψηφίων του ονόματός μας!!!
|
| 00407B6B     inc esi                        <- Αυξάνεται ο esi κατά 1 και δείχνει στο 
|                                                επόμενο ψηφίο του ονόματός μας...
|
--00407B6C     jmp 00407B5A                   <- Unconditional jump που μας ξαναστέλνει πάνω.
 
  00407B6E     mov dword ptr [0048C844],01    <- Σε αυτό το σημείο, δηλαδή μετά το τέλος αυτού 
                                                 του loop, ο ebx περιέχει μία τιμή η οποία 
                                                 έχει προκύψει από τους υπολογισμούς που έγιναν
                                                 παραπάνω για το όνομά μας. (1o checksum!!!)
                                                 
  00407B78     mov esi, ecx                   <- Ο esi παίρνει την τιμή του ecx και 
                                                 δείχνει στο όνομά μας...
 
  00407B7A     mov cl, byte ptr [ecx]         <- Η τιμή στον ASCII του πρώτου ψηφίου (byte) 
                                                 του ονόματός μας μεταφέρεται στον cl... 
 
->00407B7C     test cl, cl                    <- Είναι το ψηφίο (byte) του ονόματός μας 
|                                                ίσο με το μηδέν? (στον ASCII πάντα!!)
|
| 00407B7E     je 00407B99                    <- Αν ναι, πήδα παρακάτω, αλλιώς συνέχισε...
|
| 00407B80     movzx cx, cl                   <- Το ψηφίο του ονόματός μας βρίσκεται στον cl
|                                                (Η τιμή του στον ASCII)
|
| 00407B84     push 00001021                  <- Pushάρεται στη στοίβα ο αριθμός 1021h (=4129)
|
| 00407B89     push ecx                       <- Pushάρεται στη στοίβα ο ecx (στον cl βρίσκεται
|                                                το ψηφίο (byte) του ονόματός μας...) (ASCII)
|
| 00407B8A     push eax                       <- Pushάρεται στη στοίβα ο eax
|
| 00407B8B     call 00407BB9                  <- Πατήστε το F8 για να μπείτε μέσα στο call
|                                               και θα βλέπετε τα παρακάτω:
|
| 
|     00407BB9     push ebp                   <- Είμαστε μέσα στο call!!!
|
|     00407BBA     mov ebp, esp               <- Μετακίνηση του esp στον ebp.
|
|     00407BBC     mov eax,dword ptr [ebp+08] 
|
|     00407BBF     push esi                   <- Ο esi δείχνει στο όνομά μας...
|
|     00407BC0     xor ecx, ecx               <- Μηδενίζεται ο ecx.
|
|     00407BC2     push 00000008              <- Pushάρεται η τιμή 8, την οποία θα πάρει
|                                                μία σειρά πιο κάτω ο edx.
|
|     00407BC4     mov ch, byte ptr [ebp+0C] <- Το byte του ονόματός μας (σε ASCII)
|
|     00407BC7     pop edx                    <- Ο edx παίρνει την τιμή 8. Ο edx συμπεριφέρεται
|                                                σαν μετρητής. Δηλαδή το loopάκι που ακολουθεί 
|                                                εκτελείται πάντα 8 φορές! 
|                                                (μέχρι δηλαδή να γίνει ο edx ίσος με 0)
|
|     00407BC8     mov esi, eax               <- Η τιμή του eax μεταφέρεται στον esi...
|
| --->00407BCA     xor esi, ecx               <- Γίνεται XOR του esi με τον ecx και το 
| |                                              αποτέλεσμα αποθηκεύεται στον esi. (στον cl 
| |                                              βρίσκεται η τιμή του ονόματός μας στον 
| |                                              ASCII...)
| |
| |   00407BCC     test si, 8000              <- Εκτελείται λογικό AND μεταξύ του si και του
| |                                              8000h (=32768), και ελέγχεται αν το αποτέλεσμα 
| |                                              είναι 0.
| |
| | --00407BD1     je 00407BDA                <- Αν είναι μηδέν, τότε πήδα κάτω...
| | |
| | | 00407BD3     add eax, eax               <- Διπλασιάζεται ο eax.
| | |
| | | 00407BD5     xor eax, dword ptr [ebp+10]<- Εκτελείται λογικό XOR μεταξύ του eax και του 
| | |                                            1021h (=4129) , που βρίσκεται στη διεύθυνση  
| | |                                            μνήμης [ebp+10h] και το αποτέλεσμα αποθηκεύεται
| | |                                            στον eax.
| | |                                           
| | | 00407BD8     jmp 00407BDC               <- Unconditional jump που μας στέλνει 1 σειρά πιο 
| | |                                            κάτω.
| | |
| | ->00407BDA     shl eax, 1                 <- Ολίσθηση δεξιά του eax κατά 1 (Ισοδυναμεί με 
| |                                              πολλαπλασιασμό του eax με το 2).
| |
| |   00407BDC     shl ecx, 1                 <- Ολίσθηση δεξιά του ecx κατά 1 (Ισοδυναμεί με 
| |                                              πολλαπλασιασμό του ecx με το 2).
| |
| |   00407BDE     dec edx                    <- Μειώνεται ο edx κατά 1. Ο edx μετράει το 
| |                                              πλήθος των επαναλήψεων!!! 
| |                                              (που πρέπει να είναι 8)
| |
| ----00407BDF     jne 00407BC8               <- Conditional jump που μας ξαναστέλνει πάνω, 
|                                                δηλαδή όσο ο edx είναι διάφορος του μηδενός.
|                                                Όταν ο edx γίνει μηδέν (μετά από 8 επαναλήψεις)
|                                                τότε το loop τελειώνει και το πρόγραμμα 
|                                                συνεχίζει παρακάτω...
|
|     00407BE1     pop esi                    <- Ο esi ανακτά την παλιά του τιμή. Δείχνει δηλαδή 
|                                                στο όνομά μας...
|
|     00407BE2     pop ebp                    <- Ο edi ανακτά την παλιά του τιμή.
| 
|     00407BE3     ret                        <- Επιστροφή από το call.
|
|
| 00407B90     mov cl, byte ptr [esi+01]      <- Η τιμή στον ASCII του επόμενου ψηφίου (byte) 
|                                                του ονόματός μας μεταφέρεται στον cl...
|
| 00407B93     add esp, 0000000C              <- Προστίθεται στον esp (stack pointer) o αριθμός  
|                                                0Ch (=12). Δείχνει δηλαδή 12 bytes πιο πάνω
|                                                στη στοίβα απ’ότι πριν...
|                                                
| 00407B96     inc esi                        <- Αυξάνεται ο esi κατά 1, δείχνει δηλαδή στο 
|                                                επόμενο ψηφίο του ονόματός μας...
|
--00407B97     jmp 00407B7C                   <- Unconditional jump που μας ξαναστέλνει πάνω.
 
  00407B99     add eax, 00000063              <- Σε αυτό το σημείο, δηλαδή μετά το τέλος αυτού 
                                                 του loop, ο eax περιέχει μία τιμή η οποία
                                                 έχει προκύψει από τους υπολογισμούς που έγιναν 
                                                 παραπάνω για το όνομά μας. Σε αυτή την τιμή
                                                 προστίθεται o αριθμός 63h (=99)...
                                                 (2o checksum!!!)        
 
  00407B9C     movzx ecx, bx                  <- Μετακίνηση του bx στον ecx. (1o checksum!!!)
 
  00407B9F     movzx eax, ax                  <- Μετακίνηση του ax στον eax. (2o checksum!!!)
                                                 (Ισοδυναμεί με την εντολή: AND eax, 0000FFFFh)
 
  00407BA2     push ecx                       <- Pushάρεται στη στοίβα το 1o checksum! (ecx)
 
  00407BA3     push eax                       <- Pushάρεται στη στοίβα το 2o checksum! (eax)
 
  00407BA4     push 0047E38C                  <- Pushάρεται στη στοίβα το string “%04X%04X”
 
  00407BA9     push [ebp+0C]                  <- Pushάρεται στη στοίβα η διεύθυνση στην οποία 
                                                 θα αποθηκευτεί αργότερα το σωστό serial# !!! 
                                                 
  00407BAC     call 00467AB4                  <- Μέσα σε αυτό το call το πρόγραμμα, 
                                                 χρησιμοποιώντας και τα 2 checksums που έχουν 
                                                 παραχθεί βάσει του ονόματός μας κατασκευάζει
                                                 το σωστό serial#!!!
                                                 Η διαδικασία αυτή είναι αρκετά απλή, με την 
                                                 προϋπόθεση βέβαια, να γνωρίζουμε τα 2 
                                                 checksums. Έχουμε δηλαδή 2 checksums, ενός 
                                                 word μήκους το καθένα...(Αν τα ενώσουμε, όπως 
                                                 θα δούμε παρακάτω θα έχουμε 1 dword!!!)
                                                 Αρχικά το WinZip παίρνει το 2ο checksum, το 
                                                 οποίο βρίσκεται στον eax, και το μετατρέπει
                                                 από δεκαεξαδικό αριθμό σε string.
                                                 Π.χ. Αν το 2ο checksum είναι ο αριθμός 42FA,
                                                 τότε το πρόγραμμα σχηματίζει το string 
                                                 “42FA”... Αυτά είναι και τα 4 πρώτα ψηφία του 
                                                 σωστού serial#... Ύστερα το πρόγραμμα παίρνει 
                                                 το 1o checksum, που βρίσκεται στον ecx, και με 
                                                 τον ίδιο τρόπο το μετατρέπει από 
                                                 δεκαεξαδικό αριθμό σε string(αλφαριθμητικό). 
                                                 Έτσι, αν, για παράδειγμα το 2ο checksum είναι
                                                 ο αριθμός 82FF, τότε το πρόγραμμα σχηματίζει
                                                 το string “82FF”... Με αυτό τον τρόπο
                                                 σχηματίζεται το σωστό registration # για το
                                                 όνομά μας, το οποίο όπως είναι λογικό,
                                                 πρέπει ΥΠΟΧΡΕΩΤΙΚΑ να είναι 8ψήφιο string!!!
                                                 Οπότε αν υποθέσουμε ότι οι αριθμοί 42FA και
                                                 82FF είναι το 2ο και το 1ο checksum αντίστοιχα,
                                                 τότε το registration number που δημιουργείται
                                                 θα είναι το string “42FA82FF”
                                                 To registration # αποθηκεύεται στη διεύθυνση 
                                                 που έδειχνε ο ebp + 0Ch. (Η διεύθυνση αυτή 
                                                 θα φαίνεται ανάποδα λόγω του Little
                                                 Endian Addressing)
                                                 (Η διεύθυνση αυτή έχει αποθηκευτεί στη στοίβα 
                                                 με την προηγούμενη εντολή! [push]...) 
                                                
  00407BB1     add esp, 00000010              <- Προστίθεται στον esp (stack pointer) o αριθμός 
                                                 10h (=16). Δείχνει δηλαδή 16 bytes πιο πάνω στη
                                                 στοίβα απ’ότι πριν. Πιο συγκεκριμένα δείχνει
                                                 στην διεύθυνση στην οποία υπάρχει το όνομά 
                                                 μας...                               
 
  00407BB4     pop edi                        <- Ο edi δείχνει στο όνομα που βάλαμε...
 
  00407BB5     pop esi                        <- Ο esi ανακτά την παλιά του τιμή.
 
  00407BB6     pop ebx                        <- Ο ebx ανακτά την παλιά του τιμή.
 
  00407BB7     pop ebp                        <- Ο ebp ανακτά την παλιά του τιμή.
 
  00407BB8     ret                            <- Επιστροφή (επιτέλους!!!) από το call!!! :-)
 
 
 
 
   Σε αυτό το σημείο, λοιπόν, έχουμε συλλέξει όλες τις απαραίτητες πληροφορίες για την κατασκευή
ενός keygenerator που θα υπολογίζει και εμφανίζει έναν έγκυρο κωδικό για κάθε όνομα που θα 
θελήσουμε να εισάγουμε... Δυστυχώς όμως η δουλειά μας δεν τελειώνει εδώ! Θα σας περιγράψω επίσης 
τον τρόπο με τον οποίο το WinZip παράγει τον δεύτερο κωδικό για το όνομά μας... Δε θα αναφερθώ
λεπτομερώς στην διαδικασία, καθώς αυτή παρουσιάζει πάρα πολλές ομοιότητες με εκείνη που
χρησιμοποιείται για την παρασκευή του πρώτου κωδικού, την οποία είδαμε παραπάνω.
(Σε αρκετά σημεία, μάλιστα, οι εντολές είναι ακριβώς οι ίδιες...)
 
 
   Μετά την επιστροφή μας, λοιπόν, από το call βλέπουμε λίγες σειρές πιο κάτω ένα άλλο call!
Το call αυτό επεξεργάζεται το όνομα που έχουμε εισάγει... Οι ενέργειες που κάνει είναι να 
μεταφέρει σε έναν πίνακα το όνομά μας αφαιρώντας όμως τα κενά, αριθμούς, κόμματα, παρενθέσεις 
και γενικότερα κάθε χαρακτήρα που είναι διάφορος από γράμματα του αγγλικού αλφάβητου...(αν 
υπάρχει). Έπειτα μετατρέπει όσα κεφαλαία γράμματα υπάρχουν σε μικρά... Για να γίνω πιο 
κατανοητός παραθέτω το εξής παράδειγμα: Αν το όνομα που βάλαμε ήταν “ ναιMa2D De Vil-765$#@(<>)” 
τότε το call αυτό θα μετατρέψει το συγκεκριμένο όνομα σε “maddevil”. Αφού λοιπόν ολοκληρωθεί 
αυτή η διαδικασία το WinZip με τον ίδιο ακριβώς τρόπο, όπως και παραπάνω, σχηματίζει 2 νέα 
checksums για το όνομα που προέκυψε!!! (Φυσικά εννοείται ότι αν το όνομα που βάλαμε αρχικά είχε 
μόνο μικρά αγγλικά γράμματα, και στις 2 περιπτώσεις θα προκύψουν τα ίδια checksums.) Σε αυτό το 
σημείο βρίσκεται η μόνη διαφορά ανάμεσα στα 2 serial numbers. Ενώ για το πρώτο serial (όπως 
είδαμε και παραπάνω) τοποθετούνται τα 2 checksums το ένα δίπλα στο άλλο (πρώτα το 2ο και μετά το 
πρώτο), στο δεύτερο serial δε γίνεται ακριβώς έτσι... Τα δύο checksums μετατρέπονται από 
δεκαεξαδικά σε δεκαδικά και τότε τοποθετούνται το ένα δίπλα στο άλλο. Πιο συγκεκριμένα 
τοποθετείται πρώτα το 2ο checksum, σε δεκαδική μορφή, και δίπλα του το 1o, επίσης σε δεκαδική 
μορφή. Όπως είδαμε και παραπάνω το κάθε checksum είναι ένα word, οπότε αν κατά τη μετατροπή από 
δεκαεξαδικό σε δεκαδικό προκύψει αριθμός (δεκαδικός πάντα) με λιγότερα από 4 ψηφία, τότε το 
πρόγραμμα τον συμπληρώνει με μηδενικά... Π.χ. Αν κάποιο checksum είναι ο αριθμός 4Ch τότε αυτός 
θα μετατραπεί στον αντίστοιχο δεκαδικό που είναι ο αριθμός 76, και το WinZip θα τον κάνει 4ψήφιο 
συμπληρώνοντας όσα μηδενικά χρειάζονται. Θα γίνει δηλαδή 0076. Βέβαια ενδέχεται το checksum που 
θα έχει προκύψει, αν μετατραπεί σε δεκαδικό να είναι 5ψήφιος αριθμός. Π.χ. FE74h (=65140) Σε 
αυτή την περίπτωση το WinZip κρατάει και τα 5 ψηφία του αριθμού. Οπότε αν ένα από τα δύο 
checksums είναι 5ψήφιος δεκαδικός αριθμός τότε ο κωδικός που προκύπτει θα είναι 9ψήφιος. Στην 
ειδική δε περίπτωση που είναι και τα δύο checksums είναι 5ψήφιοι δεκαδικοί αριθμοί τότε ο 
κωδικός που θα προκύψει θα είναι 10ψήφιος. Οι δημιουργοί όμως του WinZip θέλοντας το serial να 
είναι ΠΑΝΤΑ 8ψήφιο ‘κόβουν’, αν τυχόν χρειαστεί το serial που δημιουργείται στο 8ο ψηφίο. Ο 
αριθμός που προκύπτει είναι το δεύτερο registration code για το όνομά μας!!! Αυτός ήταν, με 
συντομία ο τρόπος, με τον οποίο το WinZip παράγει και το δεύτερο κωδικό... Έτσι λοιπόν 
ολοκληρώσαμε την ανάλυση του τρόπου με τον οποίο το WinZip παράγει τους 2 κωδικούς για το όνομά 
μας, που ήταν και ο κύριος στόχος αυτής της έκθεσης... 
 
 
 
 
The Key-Generator
 
  Kάπου εδώ όμως αυτή η έκθεση φτάνει στο τέλος της... Πιστεύω ότι είστε σε θέση να 
κατασκευάσετε έναν keygen για το WinZip. Για επιπλέον βοήθεια μπορείτε να βρείτε μέσα στο 
συνοδευτικό αρχείο το source code του keygenerator, ο οποίος είναι γραμμένος σε Win32Asm. 
 
 
    

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

 

BACK HOME