CodeZip1.gif (23676 bytes) 

Capítulo II: ... Éxodo y Levítico...

 

 

1.- Saludos

 

            Hola de Nuevo! Soy RAZiEL; de vuelta a los suburbios con la segunda parte de mi tutorial. Me alegra enormemente saber que les gustó la primera parte de mi tutorial, es por ello, y no por ningún otro motivo por el cual escribo ésta segunda parte. Ya saben, si tienen alguna sugerencia, así como crítica constructiva, duda o consulta que hacerme háganlo a mi dirección de Correo Electrónico: raziel@telepolis.com

 

            En esta segunda parte, haremos el primer KeyGen, serio, con vistas al tema del Cracking; este algoritmo lo he sacado de un programa que Crackeé tiempo atrás... disfrútenlo.

 

Ten en cuenta que este tutorial está realizado únicamente con fines educativos, y que no puedo hacerme responsable del mal uso que se pueda hacer de la información aquí expuesta.

 

2.-  Distintas Maneras de Representar la Información

 

Tras asimilar del Capítulo I, comenzaremos en esta ocasión con algo, un poco mas... “profundo”, las distintas formas de representación de la información...

 

Para mayor comodidad; distribuiremos este apartado en 2 Categorías:

 

·         2.1 Teórica

 

En la vida cotidiana, un dato nos puede venir representado de numerosas formas distintas, por ejemplo, como Palabra (Amarillo), como Imagen ()... La información transmitida en ambos casos es la misma, un color.

 

De la misma forma, en nuestro ordenador, la información se puede representar también de muchas formas...  por ejemplo: Símbolo (A), Valor Hexadecimal (41), Valor ASCII (65)... La letra “A” que hemos representado de 3 formas distintas, tiene el mismo valor para nosotros, lo que ocurre, es que, a veces, tienes que saber verlo :)

 

Pues bien; ¿A qué viene todo esto?, muy sencillo, veréis, a la hora de la evaluación de nuestro Serial, el programador, puede intentar confundirnos, representando la información de diversas formas y manipulándola así a su antojo, creyendo que no nos damos cuenta de lo que pasa por delante de nuestros ojos...

 

·         2.2 Algo de Práctica (Tutorial de +Sync VB 4 cracking for Newbies)

 

Imaginemos que buscamos una cadena de Texto en un programa hecho en VB. En VB, las cadenas se guardan separadas carácter a caráacter con “hex 00”

 

Buscamos la cadena Enter the Serial Number, pulsamos la tecla de búsqueda y no encontramos nada... Nos cabría pensar, que dicha cadena está en alguna biblioteca que usa el programa, pero tras buscar como auténticos posesos, no encontramos nada... ¿Por qué?

 

Sencillo, al estar el programa en VB las cadenas de texto se guardan en otro formato (Wide Format). Dicho de otra modo, la información está ahí, pero no sabemos leerla, ya que está almacenada de otra forma; así, que probamos a buscar en Hexadecimal... y ¿Qué encontramos?

 

                                   Hexadecimal: 45 00 6E 00 74 00 65 00 72 00 20 00 74 00 68 00 65 ...

                        Texto:            E  .   n    .   t    .   e   .   r   .         .   t    .   h   .   e  ...

 

            Bingo!, pues bien, ahora que sabemos un poco más, ¿Porqué no hacer KeyGens con estos conocimientos?

 

Si deseas más información sobre éste tema; remítete a la página de Fravia

 

3.- Algo de Programación

 

            Tanto en VB como en D, es fácil pasar de un sistema de representación a otro; para ello, sólo nos hace falta saber la instrucción encargada de hacer cada cosa:

 

            Suponiendo que tenemos una cadena de Texto Cadenay un número almacenado en una variable Numero

 

·         3.1 En Visual Basic

 

Las instrucciones usadas en VB para lo comentado anteriormente son las siguientes:

 

o        Convirtiendo Cadenas en Números y Viceversa

 

§         Cadena a Número

 

CDbl(Cadena) > Convierte la cadena en un número de tipo Double

Csng(Cadena) > Convierte la cadena en un número de tipo Single

...

 

§         Número a Cadena

 

Si Numero contiene 10 en principio:

Str(Numero) > Si  el número era: 10, pasará a ser una cadena que contenga 10

...

 

o        Convirtiendo Caracteres en ASCII...

 

§         Carácter a ASCII

 

Asc(“Carácter) > Da el valor ASCII del Carácter

Asc(“A) > Devolverá el valor 65 (El carácter A tiene dicho valor en la tabla ASCII)

...

 

§         Valor ANSI a carácter

 

Chr(Numero) > Da el carácter de dicho Número

Chr(65) > Devuelve el carácter A

...

 

o        Ejemplo de lo que hemos visto hasta aquí

 

Siendo:

 

§         Inicio un Carácter a Manipular...

§         Final el Carácter Manipulado...

§         Numero la variable que almacena el resultado de las manipulaciones pertinentes...

 

                        Inicio = A                               Inicializa Inicio con el carácter “A”

            Numero = Asc(Inicio)                 A Numero se le atribuye el valor ASCII de Inicio (65)

                        Numero = Numero + 32            Al valor ASCII de Numero se le suma 32

                        Final = Chr(Numero)                 A final se le atribuye “a” ; obtenido del valor ASCII (97)

 

·         3.2 En Delphi

 

o        Convirtiendo Cadenas en Números y Viceversa

 

Este aspecto de D, tengo entendido que al ser mucho más rígido que VB, no es posible convertir una cadena de texto en un número, puesto que String e Integer no son compatibles... Aunque si alguno sabe, cómo puede hacerse... por favor me lo haga saber (estoy abierto a sugerencias).

 

o        Convirtiendo Caracteres en ASCII...

 

Inicializamos una variable llamada Cadena que contiene ‘Prueba’

 

§         Carácter a ASCII

 

Ord(Cadena[1]); > Da el valor ASCII del segundo carácter de la variable Cadena, en nuestro caso ‘r’

Ord(“A); > Devolverá el valor 65 (El carácter A tiene dicho valor en la tabla ASCII)

...

 

§         Valor ANSI a carácter

 

Chr(Numero); > Da el carácter de dicho Número

Chr(65); > Devuelve el carácter A

...

 

o        Ejemplo de lo que hemos visto hasta aquí

 

Siendo:

 

§         Inicio un Carácter a Manipular...

§         Final el Carácter Manipulado...

§         Numero la variable que almacena el resultado de las manipulaciones pertinentes...

 

                        Inicio :=A;                             Inicializa Inicio con el carácter “A”

            Numero := Ord(Inicio);              A Numero se le atribuye el valor ASCII de Inicio (65)

                        Numero := Numero + 32;          Al valor ASCII de Numero se le suma 32

Final = Chr(Numero);                A final se le atribuye “a” ; obtenido del valor ASCII (97)

 

4.- Haciendo Un Ejemplo de un KeyGen usando todo lo visto hasta Ahora

 

Situación: Hemos de hacer un KeyGen Capaz de Solucionar el siguiente problema:

 

·         2 Cajas de Texto: LICENSE NUMBER (LN) y CORRESPONDING CODE (CC) de 15 Dígitos cada una.

·         Introduces Información en Ambas

·         Se hace lo siguiente:

 

§         Compara el primer dígito de nuestro CC con una (“D”)

§         Compara el primer dígito de nuestro LN con una (“G”)

§         Si son Distintas, el Serial es Inválido

 

§         Coge el séptimo carácter del CC

§         Coge el Segundo carácter del LN y suma a LN (“30”)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el sexto carácter del CC

§         Coge el tercer carácter del LN y suma a LN (“23”)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el tercer carácter del CC

§         Coge el cuarto carácter del LN suma a LN (“31”)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

           

§         Coge el octavo carácter del CC

§         Coge el quinto carácter del LN y suma a LN (“17”)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el cuarto carácter del CC

§         Coge el sexto carácter del LN y suma a LN (“19“)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el segundo carácter del CC

§         Coge el séptimo carácter del LN y suma a LN (“21“) 

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

           

§         Coge el quinto carácter del CC

§         Coge el octavo carácter del LN y suma a LN (“29“)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el noveno carácter del CC

§         Coge el noveno carácter del LN y suma a LN (“30“)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el décimo carácter del CC

§         Coge el décimo cuarto carácter del LN y suma a LN (“28“)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

           

§         Coge el décimo primer carácter del CC

§         Coge el décimo quinto carácter del LN y suma a LN (“24“)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el décimo segundo carácter del CC

§         Coge el décimo segundo carácter del LN y suma a LN (“21“)

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el décimo tercer carácter del CC

§         Coge el décimo tercer carácter del LN y suma a LN (“22“) 

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el décimo cuarto carácter del CC

§         Coge el décimo primer carácter del LN y suma a LN (“27“) 

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Coge el décimo quinto carácter del CC

§         Coge el décimo carácter del LN y suma a LN (“29“) 

§         Compara el resultado con el carácter cogido anteriormente de nuestro CC

§         Si son Distintos, el Serial es Inválido

 

§         Si se consigue pasar todas las comprobaciones; el Serial es Válido

 

5.- Solución al Problema expuesto

 

            He de decir, que éste algoritmo, no lo he inventado yo, ni mucho menos...es de mi primer KeyGen, si lo conseguís hacer; ya habéis hecho el primer KeyGen completamente operativo.

 

            No obstante, si habéis tenido algún problema, os adjunto la solución tanto en VB, como en D, está hecho paso a paso, tal y cómo lo planteamos, si tenéis dudas, remitiros a mi tutorial sobre GodeZIP :)

 

·         5.1 En Delphi

           

var // Declaración de Variables //

Licensecode,Serialcode: String;

P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14: Integer;  // Todas las Posiciones del LN //

S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14: String; // Todas las posiciones del CC //

 

begin //Inicio del Código//

Licensecode:= Licencia.Text; // Asigna a la variable de Licensecode lo que hay en la casilla de Licencia //

If strLen(pchar(Licensecode)) = 0 Then // Si no se ha introducido nada... //

begin                                                              

Showmessage ('Por favor rellena la casilla de licencia'); // Muestra este mensaje //

exit;

end;

 

If strLen(pchar(Licensecode)) < 14 Then // Si hay menos caracteres de los que usa para comprobar…

begin

Showmessage ('Has de Poner los 14 Caracteres'); // Muestra este mensaje //

exit;

end;

 

P1 := Ord(licensecode[1]); // Asigna el valor Ascii de la posición [x] del LN a un P[x] //

P1 := P1+30;                    //  Suma “x” en Ascii //

S6:= Chr(P1);                   // Convierte el resultado a Carácter y lo asigna a una posición [x] determinada del CC //

 

P2 := Ord(licensecode[2]);

P2 := P2+23;                            // Repite lo mismo pero con otro valor… //

S5:= Chr(P2);

 

P3 := Ord(licensecode[3]);

P3 := P3+31;                            // Igual… //

S2:= Chr(P3);

 

P4 := Ord(licensecode[4]);

P4 := P4+17;                            // Igual… //

S7:= Chr(P4);

 

P5 := Ord(licensecode[5]);

P5 := P5+19;                            // Igual… //

S3:= Chr(P5);

 

P6 := Ord(licensecode[6]);

P6 :=P6+21;                             // Igual… //

S1:= Chr(P6);

 

P7 := Ord(licensecode[7]);

P7 :=P7+29;                             // Igual… //

S4:= Chr(P7);

 

P8 := Ord(licensecode[8]);

P8 :=P8+30;                             // Igual… //

S8:= Chr(P8);

 

P9 := Ord(licensecode[9]);

P9 :=P9+29;                             // Igual… //

S14:= Chr(P9);

 

P10 := Ord(licensecode[10]);

P10 :=P10+27;                         // Igual… //

S13:= Chr(P10);

 

P11 := Ord(licensecode[11]);

P11 :=P11+21;                         // Igual… //

S11:= Chr(P11);

 

P12 := Ord(licensecode[12]);

P12 :=P12+22;                         // Igual… //

S12:= Chr(P12);

 

P13 := Ord(licensecode[13]);

P13 :=P13+28;                         // Igual… //

S9:= Chr(P13);

 

P14 := Ord(licensecode[14]);

P14 :=P14+24;                         // Igual… //

S10:= Chr(P14);

 

Codigo.text:= 'D'+S1+S2+S3+S4+S5+S6+S7+S8+S9+S10+S11+S12+S13+S14;  Muestra el CC añadiendole “D”  al inicio

Licencia.Text:='G' + Licensecode;  Al LN le añadimos la “G” Al principio

 

·         5.2 En Visual Basic

 

El código en VB es el mismo que en D; Así, que no necesita explicación; únicamente deciros, que puesto que en VB no es necesario declarar todas las variables antes de su uso, he prescindido de ello, no obstante, no lo hagáis así... os podéis volver locos...

 

Private Sub Generar_Click()

Dim Licensecode As String

Dim Serialcode As String

 

Licensecode = Licencia.Text

If Len(Licensecode) = 0 Then

MsgBox ("Por favor rellena la casilla de licencia")

GoTo Salir

ElseIf Len(Licensecode) < 14 Then

MsgBox ("Has de Introducir como Mínimo 13 Caracteres")

GoTo Salir

End If

 

Posicion1 = Mid(Licensecode, 1, 1)

    Numero = Asc(Posicion1)

        Numero = Numero + 30

            Serial6 = Chr(Numero)

 

Posicion2 = Mid(Licensecode, 2, 1)

    Numero = Asc(Posicion2)

        Numero = Numero + 23

            Serial5 = Chr(Numero)

 

Posicion3 = Mid(Licensecode, 3, 1)

    Numero = Asc(Posicion3)

        Numero = Numero + 31

            Serial2 = Chr(Numero)

 

Posicion4 = Mid(Licensecode, 4, 1)

    Numero = Asc(Posicion4)

        Numero = Numero + 17

            Serial7 = Chr(Numero)

   

Posicion5 = Mid(Licensecode, 5, 1)

    Numero = Asc(Posicion5)

        Numero = Numero + 19

            Serial3 = Chr(Numero)

 

Posicion6 = Mid(Licensecode, 6, 1)

    Numero = Asc(Posicion6)

        Numero = Numero + 21

            Serial1 = Chr(Numero)

 

Posicion7 = Mid(Licensecode, 7, 1)

    Numero = Asc(Posicion7)

        Numero = Numero + 29

            Serial4 = Chr(Numero)

 

Posicion8 = Mid(Licensecode, 8, 1)

    Numero = Asc(Posicion8)

        Numero = Numero + 30

            Serial8 = Chr(Numero)

 

Posicion9 = Mid(Licensecode, 9, 1)

    Numero = Asc(Posicion9)

        Numero = Numero + 29

            Serial14 = Chr(Numero)

 

Posicion10 = Mid(Licensecode, 10, 1)

    Numero = Asc(Posicion10)

        Numero = Numero + 27

            Serial13 = Chr(Numero)

 

Posicion11 = Mid(Licensecode, 11, 1)

    Numero = Asc(Posicion11)

        Numero = Numero + 21

            Serial11 = Chr(Numero)

 

Posicion12 = Mid(Licensecode, 12, 1)

    Numero = Asc(Posicion12)

        Numero = Numero + 22

            Serial12 = Chr(Numero)

 

Posicion13 = Mid(Licensecode, 13, 1)

    Numero = Asc(Posicion13)

        Numero = Numero + 28

            Serial9 = Chr(Numero)

 

Posicion14 = Mid(Licensecode, 14, 1)

    Numero = Asc(Posicion14)

        Numero = Numero + 24

            Serial10 = Chr(Numero)

 

Serialcode = "D" + Serial1 + ... +  Serial14 // Abreviada toda la suma de Serial; Has de completarla para que funcione

Codigo.Text = Serialcode

Licensecode = "G" + Licensecode

Licencia.MaxLength = 15

Licencia.Text = Licensecode

 

Salir:

End Sub

 

6.- Finalizando y Agradecimientos...

 

Bueno, esto es todo por hoy, ya me marcho, no sin antes dar las Gracias a mi grupo [K-FoR] por su apoyo moral, a Txeli, Karpoff, Dek_Oin, al Profe, y a todos los Miebros de Tutoriales 2000 , y por supuesto, a todos los que hacéis posible que este mundo sea menos comercial cada día.

 

            Ya sabéis, para alguna recomendación, consulta, o crítica constructiva: Raziel@telepolis.com, y también por si me he equivocado en algo del código, si he dicho algo que no era así...

 

            Un Abrazo a todos : RAZiEL.

 

Porque somos muchos...

 

 

www.000webhost.com