Tutorial Resolviendo Keygenme

Iniciado por CronuX, Mayo 15, 2010, 05:17:53 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 15, 2010, 05:17:53 PM Ultima modificación: Noviembre 14, 2014, 09:16:16 AM por Expermicid
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


Código: text
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

Código: text
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
Código: text
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

Código: text
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

Código: text
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

Código: text
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





















Descarga:

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Saludos CronuX
Feliz Cracking