Programa:

PrintKey-Pro v1.02


 

PROTECCION: Obtener el Serial y realizar el Keygen.
Descripcion: Aplicación para capturar pantallas.
Dificultad: Novato, Facililla, Media, Difícil, ETC.
DOWNLOAD: http://www.warecentral.com
Herramientas: File Inspector, DeDe 3.0, W32dasm, SoftICE.
CRACKER: Saccopharynx   FECHA: 21/11/2001

 

 INTRODUCCION

Bueno: Hola a todos. Cómo están? Aquí les presento mi segundo tutorial. En realidad es el segundo que envío, pero tengo hechos algunos más, pero todavía no los he pasado a página web. A medida que lo haga los ire enviando. Aprovecho el tutorial para agradecer a Dek_Oin por responder a mis pedidos de ayuda. Marchando...

 

 AL ATAKE

INTRO

Debido a que para realizar mis tutoriales necesito una herramienta para capturar imagenes he bajado de internet PrintKey-Pro v1.02, la cual antes de ser mi herramienta de trabajo fue mi víctima, ya que es una versión trial de 30 días. Las imágenes de este tutorial fueron capturadas con él, incluso la de él mismo, jajaja...

PRESENTANDO A LA VICTIMA

Como mencioné anteriormente este es un programita para capturar pantallas, simple, amigable y que tiene varias opciones. Las pantallas se pueden guardar en varios formatos. Acompaña a este tutorial el Keygen del serial de la víctima, hecho en C++ (aun no tengo tiempo para aprender Win32_ASM, no tengo Delphi ni Visual C, y ni sueñen que haga un Keygen en Vi$ual Ba$ic; después de haber trabajado con él realmente lo detesto, porque todo muy lindo para el usuario del sistema hecho en VB, pero para los programadores... un dolor de huevo).

MANOS A LA OBRA

Una vez instalada la victima ejecutamos la misma, vamos a Help->Register y cargamos los datos:

Name: SACCOPHARYNX
Key: 1234567

Damos click sobre el botón Register y veremos un mensaje como este:

Invalid key Please reenter !

Como no nos registramos ejecutamos File Inspector, abrimos el archivo PrintKeyPro.exe, analizamos el mismo, vamos a la solapa Compilador y vemos que fue hecho en Borland Delphi 3.0. Hmmm!!! Mi poca experiencia me dice que W32Dasm no nos servirá en un principio, ya que tiene problemas con las String References. La mejor opción es usar DeDe. La versión de DeDe 2.5 no funcionó con este programita, a si que busqué en www.balbaro.com y bajé la versión 3.0, con la cual descompilé a la víctima sin problemas.

Podemos debuggear directamente con SoftICE, pero para no estar debuggeando a lo loco cada instrucción a partir del breakpoint en hmemcpy, nos conviene ir cercando al código de la víctima usando DeDe seguido de W32Dasm. Ahora ejecutamos DeDe 3.0, cargamos la víctima (PrintKeyPro.exe) y damos click en el botón Process. Una vez descompilada, vamos a la solapa Procedures. Si nos fijamos en la columna de Unit Name, nos interesa "Unit12 TRegisterForm1" ya que es el Form de registro.

En la ventana de la derecha hacemos click con el botón derecho del mouse sobre BitBtn1Click, elejimos la opción Show additional data y veremos que se trata del botón de Registro:

Entonces nuevamente, click con el botón derecho del mouse sobre BitBtn1Click, pero ahora elejimos Disassemble. Se nos abrirá un ventana con el código que se ejecuta al hacer click sobre el botón Register. Lo que nos interesa saber es la línea en donde se hace referencia al String Reference Invalid key Please reenter !. Por lo tanto en la ventana que se nos abrió vamos a Edit->Find Text y buscamos la palabra Key para llegar hasta aquí:

Como se puede observar se hace referencia a este string en la posición 004F3733. Dato muy importante, porque ahora analizaremos el código de la víctima más detalladamente a partir de esta posición, pero con W32Dasm.

Ejecutamos W32Dasm, cargamos la víctima y vamos hasta dicha posición (Shift+F12). Si observamos detenidamente el siguiente código existen dos posibilidades de llegar hasta el mensaje de error:

1) El salto condicional de la posición 004F36F3. Este salto se realiza si en el call de la posición 004F36EA se detecta que el serial no contiene caracteres numéricos. Para comprobar esto poner un breakpoint en 004F36EA y entrar con F8.

2) Que el serial contenga solo caracteres numéricos, pero no sea el correcto. En este caso no se ejecutará el salto de la posición 004F372C, dejándonos llegar justo al mensaje de error. El salto de esta posición solo se ejecuta si el resultado de la comparación anterior:

:004F372A 3BF0         cmp esi, eax

es verdadero. Por lo tanto en esi o eax está el serial correcto. No voy a explicar como debuggear en SoftICE; existen muchos tutoriales, al respecto. Lo que se debe hacer para comprobar donde está el serial correcto es poner un breakpoint. Aquí hay dos posibilidades:

A) Si no les interesa el Keygen ponen uno en 004F372A (bpx 004F372A). Cuando lleguen aquí y estén dentro de SoftICE ejecuten:

? esi (Verán el serial falso: 1234567)
? eax (Verán el serial verdadero: 93657585)

B) Si les interesa el Keygen recomiendo poner un breakpoint en 004F3725, ya que aquí está el call que genera el serial. Cuando se detenga la ejecución aquí, entrar con F8.

Ahora que ya tenemos el serial correcto cargamos nuestros datos nuevamente:

Name: SACCOPHARYNX
Key: 93657585

Damos click en Register, cerramos y abrimos nuevamente la víctima, vamos a About, y:

Ya tenemos registrada a la víctima. A los que les interesa el Keygen los invito a la sección que sigue y a los que no también que no viene nada mal aprender más.

KEYGEN

Para analizar el Keygen supongo que siguieron las intrucciones del paso B. Sino, Qué esperan? Una vez que entraron con F8 debido al breakpoint en el call de la posición 004F3725, sigan traceando un poco con F10 hasta llegar aquí:

En estas pocas líneas está todo el código que genera el serial:

:005040F2 -> Mueve nuestro Name a ecx.
:005040F5 -> Mueve uno a uno, dependiendo del valor de edx, cada caracter 
             de nuestro name.
:005040FA -> Suma el código ASCII del caracter en curso a ebx.
:005040FC -> Incrementa edx.
:005040FD -> Decrmenta eax.
:005040FE -> Cuando eax valga 0 se han sumado todos los códigos ASCII de 
             los caracteres de nuestro Name, menos el último. Si eax no 
             es 0 se sigue con el siguiente caracter hasta el penúltimo
             inclusive. Una vez hecha la suma, el resultado de la misma 
             se guarda en ebx. 
             En el ejemplo de SACCOPHARYNX, esta será: 

               ebx = 1179 (Decimal)
               ebx = 49D  (Hexa) 

:00504100 -> Al resultado de la suma le agrega:

               12436 (Decimal)
               3094  (Hexa) 

             Quedando el resultado en ebx. Para el caso
             de SACCOPHARYNX:

               ebx = 1179 + 12436 = 13615 (Decimal)
               ebx = 49B + 3094   = 352F  (Hexa)

:00504106 -> Se multiplica ebx por: 

               6879 (Decimal)
               1ADF (Hexa) 
             
             Almacenado el resultado en eax. Para el caso
             de SACCOPHARYNX:

               eax = 352F * 1ADF = 59519F1 (Hexa)
               eax = 13615 * 6879 = 93657585 (Decimal)

Este último les parece conocido?; Siiiii, es el serial correcto. KeyGen listo. Aquí les dejo el código fuente del Keygen hecho en C++:

--------------------------------------------------------------------------------
// DESCRIPCION DEL ALGORITMO:
// El serial solo se compone de caracteres numéricos.
// Este se genera de la siguiente manera:
//
// A) Se realiza la suma de cada código ASCII de cada caracter de nuestro Name
// menos del último.
// Si Name contiene carcteres en mayúsculas, la suma 
// se realiza con los códigos ASCIIs del caracter correspondiente 
// en miníscula. Name debe contener por lo menos un
// largo de tres caracteres.
//
// B) Al resultado de dicha suma se le agrega 12436.
//
// C) Al resultado de B se lo multiplica por 6879.

#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>

long GeneraSerial(char *);

void main(void)
{
   char name[20];
   clrscr(); 
   printf("PrintKey-Pro v1.02 Keygen\n");
   printf("by SACCOPHARYNX (21/11/2001).\n\n");
   cout << "Name: ";
   cin >> name;

   if (strlen(name) < 3)
      cout << "Name debe tener al menos 3 caracteres de largo." << "\n\n"; 
   else 
      cout << "Serial: " << GeneraSerial(name) << "\n\n"; 
}

long GeneraSerial(char * name)
{
   int i;
   int largo = strlen(name);
   long suma_cod_ascii = 0;
   long serial = 0;

   // SUMA LOS CODIGOS ASCII DE LOS CARACTERES DE NAME
   for (i=0; i < largo-1; i++)
   { 
      if (name[i] >= 65 && name[i] <= 90)
         name[i] += 32;

      suma_cod_ascii += name[i];
   }

   // CALCULA EL SERIAL 
   serial = (suma_cod_ascii + 12436) * 6879;
   return (serial);
}

------------------------------------------------------------------------------

Para compilarlo yo utilicé Borlandc C++ 3.1. Si alguien lo quiere compilar cortar el código entre las líneas punteadas y copiarlo a un archivo, ej. pkp.cpp. Luego desde una consola de DOS ejecutar:

bcc pkp.cpp

y tendrán el ejecutable. Bueno espero que les haya gustado el tutorial. Me despido haste el próximo. Cualquier duda abajo tienen mi dirección de e-mail. Saludos a todos.

Saccopharynx. saccopharynx@yahoo.com

 

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com