.. V1.2

 

1.- Saludos

 

Saludos!!! Seguidores de mi curso sobre los KeyGens; Tras un breve periodo de letargo por mi parte; me presento ante ustedes, con otra rutina de serialización, un poquito mas “jodida” que la anterior, no obstante, extremadamente interesante como podréis comprobar...

 

Para romperla, y revertirla, nos hará falta tener conocimientos de ASM; así que armaros de un buen manual, y a la carga chavales...

 

2.- Implementando ASM en Otro lenguaje de Progrmación...

 

Para facilitarnos la tarea de hoy, tendremos que escribir código ASM dentro de nuestro lenguaje de programación; desgraciadamente, no todos los lenguajes soportan esto; con lo cual tendremos que prescindir de VB en contra de nuestros deseos...

 

¿Cómo podemos escribir código en ASM dentro de D?

 

Imaginemos que estamos dentro del Evento Click de Button1, en la ventana de código escribiríamos:

 

procedure TForm1.Button1Click(Sender: TObject);

var

X: Integer;

... >Código en Delphi...

...

asm > Indica que lo que viene a continuación es todo lenguaje ASM...

...

MOV X, EAX > Código cualquiera en ASM

INC X

end; > Fin del código en ASM...

            ...        

end.

 

Así todo lo que haya dentro del grupo asm... end; será únicamente código ASM. Pues bien, esa será nuestra principal arma de hoy contra nuestro programa, la escritura en ASM, que complementaremos con nuestro KeyGen en Delphi.

 

Tened en cuenta una cosa; Si queremos manipular variables dentro del código en ASM, previamente tendremos que declararlas como lo haríamos normalmente.

 

3.- Instrucciones Interesantes a Aprender en ASM previamente para hacer el KeyGen

 

Creo que todos dominaréis en mayor o menor medida las instrucciones básicas en ASM, como puede ser el MOV, ADD, SUB... no obstante, os cito alguna que otra, con la que podríais tener problemas...

 

·         SHR: Shift Logic Right, Desplazamiento lógico a la derecha. Copia en cada Bit del operando el contenido previo del Bit de su Izquierda. En el Bit de mayor peso se almacena un 0. El contenido previo del Bit de menor peso se copia en el Flag de acarreo.

 

La equivalencia en un lenguaje algo mas cotidiano sería algo así cómo: Dividir el operando (el número en cuestión) por dos; para números sin signo tantas veces cómo se indique...

 

     Imaginemos que tenemos un número l, almacenado en EAX, por ejemplo “2345678”; y nos encontramos

     frente a esto:

 

o        040123 SHR EAX,03

 

     Esta instrucción, sería equivalente a hacer lo siguiente:

 

            2345678 / 2 = 1172839

            1172839 / 2 = 586419,5

            586419,5 / 2 = 293209,75

 

    Y lambda quedaría transformada en 293209,75...

 

¿Qué ocurre con un número que tiene numerosas cifras decimales?

 

·         En algún momento tendríamos que redondear para no volvernos locos...

 

Caso concreto, el número p: según la calculadora de Windows; equivale a: 3,1415926535897932384626433832795

 

·         Obviamente en un problema de circunferencias, por ejemplo, no trabajaríamos con todas esas cifras... entonces redondearíamos, según nuestra conveniencia (3.14), cometiendo un ERROR de aproximación...

 

¿Qué ocurre si nuestro programa hace numerosas divisiones para generar el Serial?

 

·         Sencillamente, que existirán numerosos decimales, pero, como el ordenador no se lía con tantos números, sería mucho mejor dejarlo así, que hacer una aproximación por nuestra cuenta; (ERROR que podría delimitar perfectamente si el Serial generado por nuestro KeyGen es válido o no).

 

3.- Crackeando la Realidad...

 

            Llegamos a este apartado con un programa que tiene fama de extracción de Serial inmediata, de hecho, es cierto, pero el KeyGen, es un poco más enrevesado; por eso hay que hincarle el Diente hasta el fondo...

 

Nuestra Víctima de Hoy: Toggle DiskSpace

 

Primeramente deciros, que Toggle, no usa el mismo algoritmo de serialización para todos sus programas (son listos), no obstante, existen numerosas empresas, que para ahorrarse trabajo, incluyen la misma rutina de serialización en todas sus aplicaciones, hecho que provoca, que si cae en manos de cualquier Cracker alguna de dichas aplicaciones y éste hace su KeyGen, tendría prácticamente a la empresa cogida de los mismísimos...

 

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. Si te gusta el programa CÓMPRALO.

 

Nombre del Programa:

 Toggle DiskSpace 2.0.3.

Página Web:

http://www.Toggle.com

Tiempo a Emplear:

Unas 2.5 Horas

Dificultad:

Newbie - Aficionado - Avanzado - Experto – Élite

 

            Intentad localizar la Rutina de Serialización, VOSOTROS MISMOS!, que no es difícil; es más; Os daré algunas pistas sobre éste programa que me parecen interesantes:

 

·         Como ya habréis podido averiguar, a simple vista; el programa no hará el cálculo del Serial válido usando el campo de Company (pone que es opcional, o sea, que no lo tocará), y nuevamente tenemos la lucha Nombre - Serial.

·         Se emplean números mágicos, como: ‘1374389535’, en decimal...

·         Previamente al cálculo de nuestro Serial; nuestro nombre es pasado a Mayúsculas enteramente.

·         Nuestro Serial, no aparecerá de forma repentina en ningún registro en concreto, sino que tendremos que ir explorando los registros con ‘?’...

·         El nombre, no puede ser inferior a 6 Caracteres, en caso contrario, el propio programa hará la vista gorda, y nos dirá “Enter your Name”...

 

Os recomiendo nuevamente que imprimáis el manual si tenéis la intención de estudiar el código desde SICE.

 

Así; Nos dejamos de monsergas, y usamos Hmemcpy; tras varios intentos con F12; y tras tracear un poco llegamos a nuestra rutina:

 

004027E3                 call    42987D > Pasa a Mayúsculas nuestro nombre

           

            La rutina de Serialización es un bucle; así, mientras no se han evaluado uno a uno TODOS los caracteres del nombre, empezando por la izquierda, no salta a 40281B...

 

            Previamente en EDI hay una constante almacenada, la cual se usará para el cálculo del Serial “73712”

 

004027F5                 movsx   eax, byte ptr [esi+eax] > Inicio de nuestra rutina; coge un carácter...

004027F9                 push    eax

004027FA                 call    _isalpha

004027FF                 add     esp, 4

00402802                 test    eax, eax

00402804                 mov     eax, [esp+18h]

00402808                 jz      402813 > Si el carácter no es una letra, salta a 402813

0040280A                 movsx   ecx, byte ptr [esi+eax]

0040280E                 add     ecx, esi > Suma al carácter la posición que ocupa en la cadena

00402810                 imul    edi, ecx > Multiplica el resultado por lo almacenado en EDI

00402813                 mov     ecx, [eax-8]

00402816                 inc     esi > Incrementa en 1 El contador...

00402817                 cmp     esi, ecx > Se compara la longitud de la cadena con el Contador

00402819                 jl      4027F5 > En caso de ser el contador inferior; vuelve a 4027F5 para seguir evaluando

 

Ésta rutina hace lo siguiente: Coge uno a uno los caracteres de nuestro nombre comenzando por la IZQ, y:

 

·         Si el carácter cogido es una letra: lo multiplica por lo que haya en EDI, previamente habiéndole sumado la posición que ocupa en el Nombrel (Siendo 0, el primer carácter empezando por la izquierda)...

 

·         Si el carácter cogido no es una letra: Pasa al siguiente, y no hace nada con él...

 

Hace esto hasta haber evaluado todo el Nombre (Y dará un número considerablemente grande) en EDI...

 

0040281B                 mov     eax, 51EB851Fh

00402820                 mul     edi

 

Aquí llega la parte interesante... Según las 2 instrucciones anteriores; se almacena en EAX una constante 51EB851Fh, y se multiplica a EDI... pero observad lo que ocurre mas abajo...

 

00402822                 mov     esi, edx > Mueve el contenido de EDX a ESI

00402824                 mov     edx, [esp+14h]

 

El resultado en teoría tendría que ser el almacenado y tratado en EAX; pero sigue generando nuestro Serial no con EAX sino EDX ¿Porqué?

 

Pues bien, esa duda me atormentaba, hasta que Black Fénix me la aclaró diciendo:

 

Es muy sencillo, cuando se multiplica un registro de
32 bits (EAX) por otro registro de 32bits (EDI) se
genera un número de 64bits (lo cual es lógico ya que
al multiplicar se incrementa el tamaño).

 

Los procesadores compatibles Intel guardan el resultado

en el par EDX : EAX, siendo EDX la parte alta del
resultado y EAX la parte baja.

En la división sucede lo contrario, en EDX se guarda
el resto de la división y en EAX la parte entera.

 

Pues eso es lo que ocurre, al ser el resultado tan grande; se guarda en 2 sitios distintos EDX : EAX; y el programador, decidió coger la parte que se guarda en EDX para seguir con el cálculo del Serial...

 

Ejemplo:

 

En EDX tenemos: 345678123456

            En EAX tenemos: 788345347858

 

Así nuestro Resultado total sería: 345678123456788345347858

 

Comentario Sabroso: cuando se usa MUL; la multiplicación se realiza sin signo...

 

00402828                 SHR     esi, 05

 

Y llegamos prácticamente al final de nuestra rutina con ésta instrucción; como expliqué anteriormente; se usa la expresión SHR nada menos que 5 Veces, el propio procesador se encarga de redondear nuestro resultado, trabajo que nos ahorra...

 

Y El resultado de las divisiones sucesivas corresponde con nuestro Serial Válido...

 

4.- Haciendo un KeyGen usando Delphi y ASM a la vez...

 

¿Porqué usamos las instrucciones en ASM?; Por 2 causas:

 

·         Es mucho mas complicado de lo que parece hacer un procedimiento que conforme obtengas un número coger únicamente la parte Alta.

 

·         El redondeo que hace el micro es similar al del programa; si lo hiciéramos manualmente dividiendo el número 5 veces, erraríamos, y aunque fuera en una sola cifra, el Serial sería no válido...

 

Adjunto mi Código En Delphi para que lo veáis mejor...

 

procedure TForm1.Button1Click(Sender: TObject);

var

Variable: String;

Condicion, X,Y,I, Longitud, Posicion: Integer;

Suma: Integer;

P1: Integer;

 

begin

Variable:=Edit1.text; // Introduce en Variable Nuestro nombre

Longitud:=strlen(pchar(Variable)); // Longitud de la Cadena

Suma:= 73712; // Inicializa Suma con el valor de la Constante Inicial

 

IF strlen(pchar(Variable)) < 6 then

        begin

        Showmessage('Introduce Seis Caracteres Como Mínimo'); // Si la longitud es menor de Seis; Muestra el Mensaje

        exit;

        end;

 

For I:= 1 to Longitud do // Bucle para ir cogiendo uno a uno los caracteres del Nombre y evaluarlos

    begin

    P1 := I - 1;

    Condicion := Ord(Variable[I]);

   

If (condicion < 123) and (condicion > 96) then // Si es una letra minúscula la pasa a Mayúscula

    begin

    Condicion:= Condicion - 32;   // 32 Es la relación ASCII entre una letra mayúscula y una Minúscula

    Posicion := Condicion + P1;   //  Al carácter se le suma la posición que ocupa en la cadena

    Suma := Suma * Posicion; //  Multiplica el Resultado por el Total (Suma)

    end

 

Else If (condicion < 91) and (condicion > 64) then // Si el carácter es una letra mayúscula

    begin

    Posicion := Condicion + P1; //  Al carácter se le suma la posición que ocupa en la cadena

    Suma := Suma * Posicion; //  Multiplica el Resultado por el Total (Suma)

    end

 

else // Si no es una letra ni Mayúscula ni Minúscula

    begin

            // Ignora el Carácter

    end;

 

// Vuelve hacia arriba, hasta que no se hayan evaluado todos los caracteres

 

X:=1374389535; // Constante que usa el programa para la generación del Serial

Y:= Suma; // Total de las operaciones anteriores

 

Asm

MOV     EAX, X              // Mueve el contenido de X a EAX

MUL     Y                       // Multiplica el Total por X

MOV     X, EDX              // Cogemos la parte Alta de nuestro número

SHR     X, 05                 // Hacemos la división 5 Veces...

end;

 

Edit2.text:=Inttostr(X); // Muestra el resultado final en otra casilla de Texto…

end;

end;

end.

 

Listo; Compilamos y tenemos nuestro KeyGen; de todas formas, podéis encontrar el mío en la página del grupo...

 

Una Curiosidad; Cuando el Algoritmo de nuestro KeyGen sobrepasa el límite del rango permitido; devuelve 0; puede parecer un error; pero...

 

Probad esto:

 

            User Name: 64564564564564564577687y8iyu8g7867t86t867766776786t678yughghgjggjghjg7dfsrter6te

            Company: La que queráis

Reg Key: 0

 

El programa se registrará; usando el Serial 0; ¿Qué curioso, verdad?

 

5.- Finalizando y Agradecimientos...

 

            Con esto finaliza la quinta parte de mi tutorial; y no me marcharé sin dar Gracias a:

 

·         LEiRUS: Por testear mi KeyGen e intentar buscarle fallos y ser un loko de atar...

·         ViPER: Por escribir tan buenos manuales y ser un friend de puta madre...

·         Txeli: Por su entusiasmo en Aprender... y sus traducciones...

·         Black Fénix: Por responder a las dudas de un novato :)

·         Karpoff: Por Apoyarme en mis tutos...

 

·         Profesor X: Por intentar ayudarme, y por estar tan loco...

·         CrkViZ: Por estar como una cabra; y hacerme pasar tan buenos ratos...

·         Dek_Oin: Por decir tantas paranoias y recomendarme este programa...

·         AFA: Por seguir mis tutos; pronto será otro del Grupo... Ánimo Chaval!!!

·         Kuato_Thor: Por hacer tan buenos Manuales...

·         Nandois: Por hacer mis ejercicios, ya hace tiempo que no sé de ti...

 

            Y si se me olvida alguien, y se da por aludido, que me perdone, que sois muchos :) GRACIAS A TODOS

 

Otra curiosidad; pregunté a mi profesor de Facultad la duda que tenía sobre MUL; y me respondió exactamente lo mismo que Black Fénix; ¿Será Black Fénix mi profesor? :)

 

Y ya sabéis, para cualquier duda o crítica constructiva... raziel@telepolis.com

Y si queréis visitar nuestra site: www.pagina.de/Kfor

 

RAZiEL

Porque somos muchos...

 

 

 

www.000webhost.com