Tutorial Resolviendo Keygenme

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

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes 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: php
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: php
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: php
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: php
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: php
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: php
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:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos CronuX
Feliz Cracking