El keygen lo programo BuKoBG y nos dice...
Hi people, I hope you have fun with this one :). PM me if something.
Difficulty: 2 - Needs a little brain (or luck)
Platform: Windows
Language: Assembler
A la carga...
Tutorial
Esta es la rutina principal del keygenme
en 00401340 CALL KeyGenMe.004010FB es donde se haran las operaciones y devolvera en eax 0 si es incorrecto o 1 si es correcto
00401345 CMP EAX,1 compara el valor devuelto en eax con 1
00401348 JNZ SHORT KeyGenMe.00401360 si es 1 sigue si es 0 saltara al Badboy
00401312 |. 68 80000000 PUSH 80 ; /Count = 80 (128.)
00401317 |. 68 CC344000 PUSH KeyGenMe.004034CC ; |Buffer = KeyGenMe.004034CC
0040131C |. 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.)
00401321 |. FF75 08 PUSH [ARG.1] ; |hWnd
00401324 |. E8 AD000000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00401329 |. 68 80000000 PUSH 80 ; /Count = 80 (128.)
0040132E |. 68 4C354000 PUSH KeyGenMe.0040354C ; |Buffer = KeyGenMe.0040354C
00401333 |. 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)
00401338 |. FF75 08 PUSH [ARG.1] ; |hWnd
0040133B |. E8 96000000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00401340 |. E8 B6FDFFFF CALL KeyGenMe.004010FB
00401345 |. 83F8 01 CMP EAX,1
00401348 |. 75 16 JNZ SHORT KeyGenMe.00401360
0040134A |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040134C |. 68 84304000 PUSH KeyGenMe.00403084 ; |Title = "Correct"
00401351 |. 68 8C304000 PUSH KeyGenMe.0040308C ; |Text = "Correct serial, good job !"
00401356 |. FF75 08 PUSH [ARG.1] ; |hOwner
00401359 |. E8 84000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
0040135E |. EB 14 JMP SHORT KeyGenMe.00401374
00401360 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401362 |. 68 A7304000 PUSH KeyGenMe.004030A7 ; |Title = "Wrong"
00401367 |. 68 AD304000 PUSH KeyGenMe.004030AD ; |Text = "Wrong serial, try again !"
0040136C |. FF75 08 PUSH [ARG.1] ; |hOwner
0040136F |. E8 6E000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
Ahora entramos 00401340 |. E8 B6FDFFFF CALL KeyGenMe.004010FB
vemos la siguiente rutina
004010FB /$ E8 00010000 CALL KeyGenMe.00401200
00401100 \. C3 RETN
00401101 . C3 RETN
00401102 . C3 RETN
00401103 . C3 RETN
00401104 . C3 RETN
00401105 . C3 RETN
00401106 . C3 RETN
00401107 . C3 RETN
00401108 . C3 RETN
00401109 . C3 RETN
0040110A . C3 RETN
0040110B . C3 RETN
0040110C . C3 RETN
0040110D . C3 RETN
0040110E . C3 RETN
0040110F . C3 RETN
00401110 . C3 RETN
00401111 . C3 RETN
00401112 . C3 RETN
00401113 . 40 INC EAX
00401114 . C3 RETN
...
004011FF . C3 RETN
Vemos la instruccion INC EAX en 00401113 anotamos y entramos en la primera call "004010FB /$ E8 00010000 CALL KeyGenMe.00401200"
Entramos a otra rutina
00401200 /$ 68 CC344000 PUSH KeyGenMe.004034CC ; ASCII "Name"
00401205 |. E8 3D000000 CALL KeyGenMe.00401247
0040120A |. 50 PUSH EAX
0040120B |. 68 4C354000 PUSH KeyGenMe.0040354C ; ASCII "Serial"
00401210 |. E8 32000000 CALL KeyGenMe.00401247
00401215 |. 5B POP EBX
00401216 |. 2BD8 SUB EBX,EAX
00401218 |. 885D F8 MOV BYTE PTR SS:[EBP-8],BL
0040121B |. B8 00000000 MOV EAX,0
00401220 \. C3 RETN
Vemos que va a utilizar nuestros datos ingresados
00401205 |. E8 3D000000 CALL KeyGenMe.00401247; coge nuestro Name ingresado y genera crc32(Name)
0040120A |. 50 PUSH EAX ; Guarda en el stack el resultado crc32(Name)
00401210 |. E8 32000000 CALL KeyGenMe.00401247; coge nuestro serial ingresado y genera crc32(serial)
00401215 |. 5B POP EBX ; Recupera en EBX el resultado de crc32(Name)
00401216 |. 2BD8 SUB EBX,EAX ; hace la operacion crc32(Name)-crc32(serial) y guarda el resultado en EBX[/php]
00401218 |. 885D F8 MOV BYTE PTR SS:[EBP-8],BL ; En esta instruccion mueve el registro BL del resultado de la resta a [EBP-8]
; Donde [EBP-8] vale 0012FB04 00 11 40 00 y sera la direccion donde regresara el 00401220 \. C3 RETN
[php]0040121B |. B8 00000000 MOV EAX,0 ; Mueve 0 al registro EAX
00401220 \. C3 RETN ; Regresa a la Direccion de [EBP-8]
Entonces la unica solucion para que el registro EAX sea 1 es que salte a la direccion 00401113 . 40 INC EAX
es decir que la Resta de crc32(Name)-crc32(serial)=0x13 que el registro BL sea = 13
00401113 . 40 INC EAX ; Pone en EAX = 1
00401114 . C3 RETN ; Regresa a la rutina principal 00401345 |. 83F8 01 CMP EAX,1
Rutina de crc32
00401247 /$ 55 PUSH EBP
00401248 |. 8BEC MOV EBP,ESP
0040124A |. B8 FFFFFFFF MOV EAX,-1
0040124F |. 8B75 08 MOV ESI,[ARG.1]
00401252 |. 33D2 XOR EDX,EDX
00401254 |> 8BD8 /MOV EBX,EAX
00401256 |. C1EB 08 |SHR EBX,8
00401259 |. 8BC8 |MOV ECX,EAX
0040125B |. 81E1 FF000000 |AND ECX,0FF
00401261 |. 8A16 |MOV DL,BYTE PTR DS:[ESI]
00401263 |. 80FA 00 |CMP DL,0
00401266 |. 74 0E |JE SHORT KeyGenMe.00401276
00401268 |. 33D1 |XOR EDX,ECX
0040126A |. 331C95 CC304000 |XOR EBX,DWORD PTR DS:[EDX*4+4030CC]
00401271 |. 8BC3 |MOV EAX,EBX
00401273 |. 46 |INC ESI
00401274 |.^ EB DE \JMP SHORT KeyGenMe.00401254
00401276 |> 83F0 FF XOR EAX,FFFFFFFF
00401279 |. C9 LEAVE
0040127A \. C2 0400 RETN 4
En conclucion la resta entre crc32(Name)-crc32(serial)=0x13 ;BL=13
el keygen es un bucle que genera crc32(Name) toma los dos ultimos char en forma hex
por ejemplo crc32(CronuX)=ADE83FC4
toma 0xC4 y le resta 0x13
0xC4-0x13=0xB1
Entonces el keygen genera una cadena aleatoria, La longitud la decide usted, genera el crc32(cadena)
y compara los dos ultimos caracteres con B1 si es igual simple cadena = Serial
si no genera de nuevo otra string aleatoria...
Imagenes
(http://img16.imageshack.us/img16/1373/tute1.png)
(http://img194.imageshack.us/img194/5756/tute4.png)
(http://img522.imageshack.us/img522/3443/tute5.png)
(http://img269.imageshack.us/img269/7102/tute6.png)
(http://img576.imageshack.us/img576/7237/tute7.png)
(http://img94.imageshack.us/img94/6744/tute8.png)
(http://img43.imageshack.us/img43/4645/tute9.png)
(http://img405.imageshack.us/img405/1097/tute10.png)
(http://img695.imageshack.us/img695/4783/tute2.png)
(http://img203.imageshack.us/img203/3205/tute3.png)
Descarga:
Keygen And Keygenme #1 By CronuX (http://www.mediafire.com/?wfn0gmznmdf)
Saludos CronuX
Feliz Cracking