Está en la página 1de 19

PERFECT KEYLOGGER 1.6.8.

0 – KEYGEN

Versión: Perfect Keylogger 1.6.8.0


URL: http://www.blazingtools.com/downloads.html
Protección: Ninguno
Dificultad: Newbie
Herramientas: Ollydbg V1.10 / RDG Packer Detector V0.7.6
2017
Objetivo: Hacer Keygen
Reverser: AbelJM
Lugar/Fecha: Lima – Perú / 10-03-2017
Este tutorial es para la lista de CracksLatinos, como siempre digo mi gran
Familia jeje. También quiero aprovechar para saludar al gran maestro Ricardo
Narvaja, por los tutoriales grandiosos como el de ollydbg y ahora el de
Introducción al reversing desde cero con Ida Pro y claro también por
solucionar unas dudas con este tutorial , muchas gracias Ricardo .Antes de
empezar este tuto se lo dedico a Lior que gracias a su tutorial de parchar el
perfect keylogger me decidí a hacerle su keygen . También a Bym24v por la
ayuda que me brindo y a todo mis amigos del Team PeruCrackers.

Como comente este tutorial es para complementar el tutorial de lior que hizo sobre como parchar
el Perfect Keylogger , así que te conviene leerlo para que podamos comprender mejor el software
y podamos hacer su keygen . Bueno yo entenderé que ya lo leyeron, así comencemos de una vez
;) .

Primero abrimos el software en el ollydbg , hacemos click derecho SEARCH FOR – ALL
REFERENCED TEXT STRINGS , miramos la lista de strings y hacemos click derecho SEARCH
FOR TEXT .buscamos la palabra registration error destildamos case sensitive y tildamos Entire
scope, luego apretamos ok . Encontramos la palabra como se muestra en la imagen y para en la
dirección 41ABD6 Y hacemos click derecho FOLOW IN DISASEMBLER

Como vemos paramos en la dirección 041ABD6 donde se encuentra el mensaje de de chico malo,
Registration error .
pues si subimos encontraremos como en el tutorial de lior , las apis donde concatena la clave que
ingresemos y la api que compara . Pero bueno a nosotros nos interesa para este tutorial, así que
seguiremos subiendo hasta llegar a 0041A96A y le damos un Breakpoint .Parece una zona
interesante ,demos Run con F9 y pongamos mi User y una clave para que pare en este BP

Ingresamos nuestro user abel y serial 1111 – 1111 – 1111 – 1111 y paramos en 0041A96A. Tal
vez si eres novato como yo ,te preguntaras por que puse ahí ese BP , pues es muy fácil al buscar
las string registration error subimos a ver que había y me intereso las apis lstrlenA y lstrcpyA ,
googleamos para saber para que sirven

strlen = La función strlen se utiliza para obtener la longitud de una cadena de caracteres

strcpy = La función strcpy copia el contenido de la <cadena_fuente> en la <variable_destino>


Tracemos con F8 y al llegar

0041A971 :

Vemos que comienza la api strlen y nos muestra la string = "_r <()<1-Z2[l5,^"

0041A974 : Segun yo mueve la la api strlen a esi.

0041A97A : Retorna la longitud de la cadena en eax

Si apretamos F8 cuando estamos 0041A97A , vemos que muestra en eax la longitud del string ,
osea eax = 00000010 si damos click derecho en eax y elegimos Modify , nos mostra en signed el
valor 16 que es la longitud en decimal

Seguimos y ahora estamos en

0041A97C : nos muestra el user que pusimos , en este caso mi nombre Abel
0041A97F : mueve eax a ebx

0041A981 : mueve ebx a [ebp-4]

0041A984 : retorna la longitud del user: abel en eax.

Cuando estemos en 0041A984 apretemos F8 y nos aparecerá en eax = 00000004 , esta vez no
hay necesidad de hacer click derecho – modify para ver el valor en decimal ,pues es el mismo
valor

Bueno para no hacerlo mas largo seguiremos traceando a la rutina del serial que comienza en
0041A9B6

Comencemos la parte interesante de este tuto para entender cómo trabaja este algoritmo, tratare
de hacer lo más detallado posible ya que este tutorial va dirigido a personas que recién empiezan
, el algoritmo recorrerá la rutina que genera el serial hasta cumplir una condición. Al principio no
hara mucho pero a la segunda pasada ya verán ;)
Estando en

- 0041A9B6 |> 8BC6 /MOV EAX,ESI

Mueve esi que vale 00000000 a eax

- 0041A9B8 >|. 6A 19 |PUSH 19

pone 19 a la pila

- 0041A9BA |. 99 |CDQ

prepara los registros para idiv, si vez edx vale 0018AC1D


Y lo vuelve cero

- 0041A9BB |. F77D FC |IDIV DWORD PTR SS:[EBP-4]

divide edx:eax / [ebp-4] = 10

si es que no te acuerdas de que va esta instrucción puedes darle una leída al capítulo de 16
de introducción al cracking con ollydbg desde cero. Bueno en nuestro caso dividirá eax =
00000000
Entre 10

El cociente se ira a eax y el residuo de la división se ira edx,

- 0041A9BE |. 8BC6 |MOV EAX,ESI

Mueve esi = 00000000 a eax= 00000000

- 0041A9C0 |. 5B |POP EBX


quita la primera direccion de la pila

Y lo pone ebx

0041A9C1 |. 8D0C3A |LEA ECX,DWORD PTR DS:[EDX+EDI] ; mueve la direccion


que apunta a la constante

Y lo pone a ecx
- 0041A9C4 |. 99 |CDQ

prepara los registros ,pone cero edx

- 0041A9C5 |. F77D F8 |IDIV DWORD PTR SS:[EBP-8]

divide eax entre 04, El cociente pasa eax y el residuo a edx

Hasta aca como vemos no paso nada importante , asi que desde aqui para adelante nos
interesara estas instrucciones, ya veran por que ;)

0041A9C8 |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8]

pone mi nombre que se encuentra en el dump y lo mueve a eax


0041A9CB |. 0FB60402 |MOVZX EAX,BYTE PTR DS:[EDX+EAX] mueve el primer byte
de [edx+eax] que en las referencias debajo del desamblado notamos que es la letra “a” que
hexadecimal es 61, esta la mueve a eax y llena de ceros la parte izquierda

Como podemos ver en esta imagen

0041A9CF |. 0FB611 |MOVZX EDX,BYTE PTR DS:[ECX] ; mueve el primer byte de


[ecx] que apunta a la constante a eax y llena de ceros a la izquierda
Y queda asi los registros , interesante movimos el primer byte de mi nombre y el de la constante a
los registros, por que será? jejeje

0041A9D2 |. 33C2 |XOR EAX,EDX

Aquí la respuesta ;) . hará un xor eax,edx . que nos da como resultado

0041A9D4 |. 99 |CDQ

prepara los registros ,pone cero edx


0041A9D5 |. F7FB |IDIV EBX

Se hara una división eax = 3E entre ebx= 19 ,el resultado se va eax y el residuo a edx . antes no
lo dije por que no lo pensé necesario pero yo me complique como saco el residuo en
hexadecimal, asi que muy fácil vemos los registros

Vemos que eax vale 3E y ebx vale 19 si nos fijamos en la calculadora o si nos vamos a eax y
hacemos click derecho – y elegimos modify en el registro eax
Vemos que que eax= 3E su valor decimal es 62 , hacemos lo mismo con ebx y su valor decimal
es 25 . ahora yo soy flojo asi que entre a cualquier web que me haga ese trabajo

http://es.calcuworld.com/calculadoras-matematicas/calculadora-de-resto/

tal vez no es la mejor forma como lo hago pero en fin sigamos

veamos si es cierto en el ollydbg


Pues si es correcto el cociente se fue a eax=02 y el residuo 0C que en decimal es 12.

Ahora vamos a la siguiente instrucción

0041A9D7 |. 80C2 41 |ADD DL,41

suma el residuo de la division anterior con 41 , osea:

DL= 0C + 41 resultado seria 4D

en decimal seria Dl = 12 + 65 resultado 77

0041A9DA |. 46 |INC ESI


0041A9DB |. 3B75 0C |CMP ESI,DWORD PTR SS:[EBP+C] compara si esi con
[ebp+c]=10 , como vemos en la anterior instrucción esi ira aumentando un numero cada vez que
se repite el bucle que genera el serial , aquí esi compara con 10 el largo de la constante que en
decimal es 16

Ahora esta instrucción les gustara mucho

0041A9DE |. 8811 |MOV BYTE PTR DS:[ECX],DL

mueve DL al primer byte de [ecx] , entonces DL es el resultado de la operación que hicimos hace
poco con el residuo de la división que es 4D y lo moverá [ecx] que en el dump veremos que es
donde se encuentra la constante

Ahora veamos como queda


Excelente vemos en el dump y en ecx que puso la primera letra de nuestro serial, ahora sabemos
que el resultado de la operación la ira guardando en la dirección donde se encuentra la constante.

Ahora pasemos a la siguiente y ultima instrucción :

0041A9E0 |.^\7C D4 \JL SHORT bpk.0041A9B6

Salta al inicio de la rutina que genera nuestro serial , supuestamente hasta que llege al largo de
nuestro serial. Digo supuestamente pues si ponemos un nombre que sea mas 16 digitos repetirá
el bucle hasta completar y sobreescribira en el contenido de la dirección de la constante hasta
llegar hacer todo la operación con el nombre que pusimos,pueden probarlo si gustan .

A ver haremos la conclusión

Tenemos :

mi nombre : Abel

Una constante : "_r <()<1-Z2[l5,^"

Convertimos en hexadecimal ambos y repetimos cada letra de mi user hasta completar el largo de
mi de la constante, osea 16 digitos

- Abel = 61 62 65 6c 61 62 65 6c 61 62 65 6c 61 62 65 6c 61 62
- Constante = 22 5f 72 20 3c 28 29 3c 31 2d 5a 32 5b 6c 35 2c 5e 22

Tomamos cada letra de mi user y la constante , y operamos con todas las letras

- Xor = 61 ,62 – xor 62,5f – xor 65,72 - …………..…………. Xor 62,22

Resultado del xor de cada letras , lo dividiremos con 25 ,que en hexadecimal es 19

El residuo de la división lo sumaremos con 65 , que en hexadecimal es 41


El resultado final seria nuestra letra de nuestro serial , si procedemos hacerlo mismo con todas las
letras del user y la constante nos dara el serial

Para culminar el tutorial haremos nuestro keygen , yo elegiré python tu puedes elegir el lenguaje
que prefieras

probaremos nuestro keygen poniendo nuestro user: crackslatinos


Espero les haya gustado este tutorial , disculpen si es que tuve un error .tratare de mejorar cada
vez mas . por ultimo quiero agradecer a Ricardo narvaja , Bym24v y a nox que me ayudaron a
pulir este código que hice . Tambien agradecer por su amistad y apoyo a Davicorm, lior , kensan ,
Softdat ,dani ,Jaime ,jose ,ivinson ,apuromafo entre otros del Crackslatinos

AbelJM

Crackslatinos

Lima – Peru

2017

También podría gustarte