January 1999
"Cruehead's Crackme v1.0" 
A crackme by Cruehead 
Win'95 PROGRAM 
Win'95 Code Reversing 
 
 
by Craftie 
 
 
Code Reversing For Beginners 
 
 
 
Program Details 
Program Name: Crackme.exe 
Program Type: 32 bit crackme 
Program Location:  Here 
Program Size: 36.3 KB 
Packed using: N/A 
 
  
Tools Required: 
Softice, and the calculator that comes with Win95. 
 
Rating
Easy ( X )  Medium (    )  Hard (    )  Pro (    )
There is a crack, a crack in everything. That's how the light gets in.

Cruehead's Crackme v1.0
Written by Craftie
 
 

 
Introduction
This is a basic crackme written by Cruehead that uses a basic XOR operation to generate the serial.
 
The Essay
Alright, this is my first tutorial ever, so don't be too hard on me, yet if you have any questions email me at craftie@geocities.com and I'll try my best to answer you. Anyways first I'll give you a little background on this program. It was written by Cruehead, and uses an interesting little algorythm to generate your serial from your name. It uses the XOR function...What's that? You don't know what that is? Well basically, XOR (exclusive-or) is a logic operation with binary digits (bitwise operation.) For more information on bitwise operations, see CrackZ's page (http://www.wco.com/~micuan) or the Messing in Bytes page (www.messinginbytes.home.ml.org) Anyways, on with this...The only tools you will need for this is Soft-ICE, and that calculator that you should have on your computer if you have Win95/98. Alright, registration screen, name serial...no problem...Enter some dummy data into both boxes (Craftie and 123123 in my case), and then press CTRL-D to pop into Soft-ICE. Type 'bpx getdlgitemtexta' and enter to set a breakpoint on the getdlgitemtexta function, which is a common Win32 function for reading text entered. Now press the 'OK' button. You should be back in Soft-ICE...Now comes a part that may take a while...Press F10 to step through the code LOT, I'm not sure how many times, until you get to this code section: (From here on prepare to be bombarded with ASM codes :)

By the way, to make your life easier instead of F10ing so much, just type 'g 00401228' in Soft-ICE to go here:

:00401228 688E214000     push 0040218E  step over this with F10, and type
                                        'd 0040218E' to get a dump <--- of
                                        the location that data is being
                                        pushed to---In the data window you
                                        should see your name.
:0040122D E84C010000     call 0040137E  This is the call to do manipulations
                                        xon your name---Enter this call by
                                        pressing F10 till its highlighted,
                                        and pressing F8.
:00401232 50             push eax
:00401233 687E214000     push 0040217E
:00401238 E89B010000     call 004013D8
:0040123D 83C404         add esp, 00000004
:00401240 58             pop eax
:00401241 3BC3           cmp eax, ebx

See that CALL at 0040122D???That looks interesting---Lets trace into it by F10ing till its highlighted, and then pressing F8.

You should be at this code segment now: What you see from 00401383-0040139A is the upcasing loop...It converts your name to UPPERCASE

:0040137E 8B742404     mov esi, dword ptr [esp+04] puts your name in ESI
:00401382 56           push esi             pushes your name onto the stack
:00401383 8A06         mov al, byte ptr [esi] <---moves the first byte of
                                              ESI (the first letter of your
                                              name) to AL
:00401385 84C0         test al, al            checks if AL is 0
:00401387 7413         je 0040139C            if yes, exit the loop
:00401389 3C41         cmp al, 41             Here through 040138F checks if
                                              AL is a valid uppercase letter
:0040138B 721F         jb 004013AC    <---If its hex value is less than the
                                      value of 'A' (41), jump to 'No luck'
                                      message
:0040138D 3C5A         cmp al, 5A  <---Checks if AL's value is greater than
                                   than that of 'Z' (or in other words,
                                   its lower case)
:0040138F 7303         jnb 00401394 <---If yes, jump to the UPCASING
                                        routine at 00401394
:00401391 46           inc esi      NOTE* YOU SHOULD ONLY BE HERE IF THE
                                    LETTER WAS CAPITAL  Move ESI to the next
                                    letter of your name
:00401392 EBEF         jmp 00401383        <---Redo loop for next letter
:00401394 E839000000   call 004013D2    Here's the call to UPCASE the letter
:00401399 46           inc esi <---move ESI to the next letter of your name
:0040139A EBE7         jmp 00401383     redo loop for next character of name

Alright, now keep pressing F10 until the jump at 00401387 jumps and you get out of the loop. Done? Alright we're ready to move on... You should now be here:

:0040139C 5E                     pop esi   ESI  now holds UPCASED name
:0040139D E820000000             call 004013C2  Call to do more
                                                manipulations on name ---
                                                interesting...
:004013A2 81F778560000           xor edi, 00005678

Now trace into the call at 0040139D by pressing F10 tills its highlighted, then pressing F8. You should be here, in yet ANOTHER loop:

:004013C2 33FF           xor edi, edi
:004013C4 33DB           xor ebx, ebx <---clear EBX
:004013C6 8A1E           mov bl, byte ptr [esi] move the first letter of
                                                your upcased name to bl
:004013C8 84DB           test bl, bl <----does BL equal 0??
:004013CA 7405           je 004013D1  if yes,exit the loop, and the call
:004013CC 03FB           add edi, ebx <----Add EDI to EBX---In other words,
      add the hex value of the current letter of your name to EDI, and keep
      adding.Note here: BL is the lower word of EBX since its a 16 bit
      register, so in this case they are the same
:004013CE 46             inc esi         Move onto next letter
:004013CF EBF5           jmp 004013C6    <----repeat loop.
:004013D1 C3             ret             <----leave call

Keep tracing till the jump at 004013CA jumps. Basically, this loop added up all the hex values of your name and moved the sum to EDI. Step over the RET instruction to leave the call. You should be here:

:004013A2 81F778560000      xor edi, 00005678

Hmm..Here the sum of the hex values of your name are being XORed with 5678h and then moved to EAX by the next instruction. keep tracing till the ret instruction... Reconize this place?? Yup---This is right outside the call at the beginning that was for the name manipulations...You should be here:

:0040122D E84C010000       call 0040137E This is where we just came out of
:00401232 50               push eax <----Pushes the XORed name's value onto
                                         the stack
:00401233 687E214000       push 0040217E <----Hmm...What's this? :) Type 'd
                                          0040217E' and you should see your
                                          dummy serial in the data window!
:00401238 E89B010000       call 004013D8  You guessed it :) The serial
                                          manipulation call

Alright, trace into the call at 00401238 which you should know how to do by now ;) You should be here:

:004013D8 33C0         xor eax, eax            clears eax
:004013DA 33FF         xor edi, edi      <---- clears edi
:004013DC 33DB         xor ebx, ebx      <----clears ebx
:004013DE 8B742404     mov esi, dword ptr [esp+04]
:004013E2 B00A         mov al, 0A
:004013E4 8A1E         mov bl, byte ptr [esi] Start of loop: Moves the first
                                              number of your serial to BL
:004013E6 84DB         test bl, bl       <---is BL 0?
:004013E8 740B         je 004013F5       <---If so, leave the loop
:004013EA 80EB30       sub bl, 30
:004013ED 0FAFF8       imul edi, eax
:004013F0 03FB         add edi, ebx
:004013F2 46           inc esi           Basicaly all this stuff sums up the
                                         HEX values of your serial number
:004013F3 EBED         jmp 004013E2      repeat loop on next number in your
                                         serial (store final sum in EDI)
:004013F5 81F734120000 xor edi, 00001234 another XOR function---XOR sum with
                                         1234h
:004013FB 8BDF         mov ebx, edi      moves the XORed value to EBX
:004013FD C3           ret

Whew this is shorter than the last one :) Alright so here's a sum up of what just happened here: It converts your decimal value to HEX and then XORs that with 1234.

:00401238 E89B010000      call 004013D8     we just got out of here
:0040123D 83C404          add esp, 00000004
:00401240 58              pop eax           remember how the XORed name got
                                            pushed to the stack way back
                                            when? Well this retrieves it
:00401241 3BC3            cmp eax, ebx      Compares the XORed serial with
                                            the XORed name
:00401243 7407            je 0040124C <---Do they match? Jump to good guy
                                      message Alright! Here it is!!!So now
                                      we know the algo! So if you didn't get
                                      it here it is.....

It takes all the letters of your name, upcases them,and converts them to hex...For Craftie that would be:

C = 43h
R = 52h
A = 41h
F = 46h
T = 54h
I = 49h
E = 45h

Now it adds those all up...For Craftie that would total to 1FEh. Now it XORs that with 5678. That would be (again for Craftie) 5786h. It stores that away for later use.

Now for the serial it converts the decimal value to HEX...For 123123 it would be 1E0F3. Then that is XORed with 1234, making 1F2C7...Now it compares 1F2C7 with that value 5786 we stored away earlier---If they are the same, its right, if not, the serial is wrong... So here's what we have (Where x is a value we don't know, not a character)... x XOR 1234 = 5786...How do we find x?? we XOR 5786h with 1234h, and convert that value to decimal....Voila, you have the correct serial for your name...Job done.....
 
 
The 'Crack'
None is required.
 
 
Final Notes
This was a great crack for newbies, and I think there is a lot to be learned from it. If you've never looked at a generation routine before, this is a good first one.

My thanks goes to:- The Sandman for all he's done for newbies like me and providing such a great site.

Everyone who helped me on the Sandman's forum, all writers of tutorials that helped me, and anyone who is reading this :).
 
 
Ob Duh
Do I really have to remind you all that by buying and NOT stealing the software you use will ensure that these software houses will continue to produce even *better* software for us to use and more importantly, to continue offering even more challenges to breaking their often weak protection systems.

If your looking for cracks or serial numbers from these pages then your wasting your time, try searching elsewhere on the Web under Warze, Cracks etc.
 




Essay by:         Craftie
Page Created: ;13 January 1999