Crackme&KeyGen

19
Tutorial nº 34 – by +NCR/CRC! [ReVeRsEr] Introducción Hola a todos!!!. Esta vez vamos a tratar de crear un crackme sencillo, del estilo Name/Keygen y su correspondiente KeyGen, también sencillo. Considero que es una práctica importante que cada uno, además de crackear programas comerciales o de otras personas, pueda llegar a desarrollar sus propias aplicaciones y las crackee para tener un espectro más grande del tema. Yo he tenido días en que me bajaba cinco programas de la red y de los cinco, tres tenían una protección similar. Por lo que en realidad no se aprendía mucho. Pero creo que de esta forma, podemos crear cosas no tan comunes en los programas y ver de que manera los podemos tirar abajo, je. En esta primera ocasión y considerando que no soy ni siquiera un novato en la programación, vamos a crear un crackme bien sencillo [email protected] http://www.joe-cracker.tk/ncr.htm 1

description

crack

Transcript of Crackme&KeyGen

Tutorial n 34 by +NCR/CRC! [ReVeRsEr]

Introduccin

Hola a todos!!!. Esta vez vamos a tratar de crear un crackme sencillo, del estilo Name/Keygen y su correspondiente KeyGen, tambin sencillo.

Considero que es una prctica importante que cada uno, adems de crackear programas comerciales o de otras personas, pueda llegar a desarrollar sus propias aplicaciones y las crackee para tener un espectro ms grande del tema.

Yo he tenido das en que me bajaba cinco programas de la red y de los cinco, tres tenan una proteccin similar. Por lo que en realidad no se aprenda mucho. Pero creo que de esta forma, podemos crear cosas no tan comunes en los programas y ver de que manera los podemos tirar abajo, je.

En esta primera ocasin y considerando que no soy ni siquiera un novato en la programacin, vamos a crear un crackme bien sencillo y su correspondiente keygen. Si alguno quiere hacer algo parecido, pero con un poco ms de complejidad que lo haga as aprendemos mucho ms....

Manos a la obra....

Las herramientas que vamos a utilizar ya son conocidas por todos nosotros, el que no las tenga que las busque en el FTP de Ricardo o por la red.

Por supuesto, para la programacin vamos a utilizar a MASM como Compilador/Ensamblador, a RadASM como entorno de programacin y a nuestro querido Olly para depurar el programa.

Este tut est orientado a la gente que est dando sus primeros pasos en ASM, creo la gente con la que hablo siempre en la lista, los ms conocidos ya saben de sobra todo esto que voy a decir, as que muchachos no se ran, je.

Ya todos conocemos, o deberamos conocer, la ventana principal del RadASM. El que no sepa nada de esto, que se dirija a los tuts de programacin que estn en el FTP/http de Ricardo Narvaja y los lea, son de los maestros de la programacin, je.

Primero que nada vamos a crear un proyecto nuevo en nuestro rad, para ello vamos a File ( New Project. En la nueva ventana que nos aparece ponemos el nombre del proyecto y seleccionamos Win32 App. Luego, le damos a siguiente y seleccionamos el Template que queremos, generalmente, nosotros trabajamos con DialogApp.tpl, as que lo seleccionamos y damos al botn siguiente hasta que nos aparezca el form principal. Ah colocaremos los controles que necesitaremos en el crackme.

Hacemos click en esta parte:

Y seleccionamos el archivo *.dlg, en este caso se llama KeyGenMe.dlg. Ah colocan los controles que quieran, yo he colocado un GroupBox, dos edits, tres botones y un control para aadir el logo.

Lo fundamental son los dos edits y a menos un botn, se puede hacer sin botn pero es un poquito ms complicado, por ahora hagmoslo as. Me queda de esta manera:

Ahora viene la parte ms divertida, je, la de agregar el cdigo. La idea que tom para este crackme es bastante sencilla, en pocos minutos lo tens listo.

Lo que haremos ser, xorear cada uno de los caracteres del nombre con algn valor constante para generar algn tipo de serial a partir de dicho nombre, luego xorear cada carcter del serial con otros valor distinto al anterior y almacenarlo en una variable. Por ltimo, tomaremos el serial generado en primer instancia y lo xorearemos con el mismo valor con el que xoreamos el serial que introduce el usuario y lo compararemos, carcter a carcter, con este ltimo.

Por ejemplo:

Nuestro nombre es Cracker, y el serial que metemos es 012345. Tomaremos la C del nombre y lo xorearemos con, por ejemplo, 30H y as sucesivamente con todos los caracteres del nombre:

C xor 30H = s

r xor 30H = B

a xor 30H = Q

c xor 30H = S

k xor 30H = [

e xor 30H = U

r xor 30H = B

As que el serial que generamos es sBQS[UB, para el nombre Cracker. Por supuesto que los clculos que se realizan son a nivel bit, pero nosotros solo lo vemos con los valores ASCII de cada carcter. Por ejemplo, cuando xorea C con 30H, en realidad est haciendo 43H xor 30H (el 30H es el valor ASCII del nmero 0).

Luego tomaremos el serial y haremos lo mismo, pero con otro valor:

0 xor 29H = 19h

1 xor 29H = 18h

2 xor 29H = 1Bh

3 xor 29H = 1Ah

4 xor 29H = 1Dh

5 xor 29H = 1Ch

He puesto los valores hexadecimales dado que genera caracteres raros como flechas de direccin y otras cosas que las pueden ver con el Olly, y si lo copian al clipboard, vern esto:

Raro, no?.

En esto deben tener cuidado, es decir, cuando generan un serial deben tener bien en claro las operaciones que realizan porque muchas veces, si no prestamos atencin, se llegan a generar cosas muy raras. Por eso hay que poner lmites y hacer algunas comprobaciones. En fin, sigamos...

Ya tenemos el serial verdadero, generado a partir del nombre, y un nuevo serial generado a partir del serial que introdujo el usuario. Ahora, xorearemos el serial vlido (con el mismo valor con el que generamos el segundo serial) y lo compararemos con el otro serial.

Si xoreamos el serial vlido con 29h, obtenemos:

S xor 29h = Z (5Ah)

B xor 29h = k (6Bh)

Q xor 29h = x (78h)

S xor 29h = z (7Ah)

[ xor 29h = r (72h)

U xor 29h = | (7Ch)

B xor 29h =k (6Bh)

Si comparamos carcter a carcter con el segundo serial, vemos que no son iguales, por lo tanto no hemos introducido un serial vlido, en cambio, si hubiramos metido este mismo serial hubiramos obtenido el mismo serial, xoreado con 29h, que se genera con el segundo serial, se entiende ?, es un poco lioso, je. Veamos:

Con el nombre Cracker, generamos el serial sBQS[UB. Con el serial invalido generamos el serial

(cuyos valores hexa son 19 18 1B 1A 1D 1C). Si a los dos seriales generados, los xoreamos con 29h, no dan el mismo resultado, en cambio:

Metemos como nombre Cracker y obtenemos sBQS[UB, al xorear este serial con 29h tenemos un nuevo serial que es : Zkxzr|k. Bien hasta aqu, no?.

Bueno, supongamos que tenemos mucha suerte y metimos como serial sBQS[UB, justo el vlido para el nombre que metimos, pues al xorearlo con 29h tendremos Zkxzr|k. Pues si comparamos este serial con el anterior veremos que son iguales, por lo que ese ser el momento en que daremos el mensaje de felicitaciones (.

Como pueden ver, la operacin xor es una especie de encriptacin, una muy sencilla, pero que, bien implementada, puede llegar a complicarnos un poco la vida, je.

Les agrego algo que dice Caos Reptante en su tut sobre ASM para ver si aclara las cosas:

XOR:El resultado es 1 si uno y slo uno de los dos operandos es 1, y 0 en cualquier otro caso

1 xor 1 = 0

1 xor 0 = 1

0 xor 1 = 1

0 xor 0 = 0

Ejemplo: 1011 xor 0110 = 1101

Bien, un amigo paraguayo nos dice esto:

XORO exclusivo lgico sobre bits: Esta instruccin realiza un XOR lgico de los operandos y almacena el resultado en el operando de destino. Cada bit del byte o palabra resultante se pone en 1 solo si el bit correspondiente de cada operando contiene valores opuestos.

Por ltimo, agrego algo de lo que dice el amigo BlackFenix sobre el tema:

La encriptacin de datos es una de las mejores tcnicas que podemos utilizar para proteger nuestras aplicaciones de los eventuales crackers. La encriptacin XOR es uno de los mtodos ms sencillos que existen, su rapidez y fcil implementacin la hacen ideal para los creadores de virus y para cualquiera que desee implementar un sencillo mtodo de encriptacin.

La encriptacin XOR (exclusive OR) se basa en la propiedad lgica de dicha operacin.

Cojamos dos valores 25h y 63h en binario:PRIVATE00100101 -> 25h

01100011 -> 63h

Segn el funcionamiento de la operacin lgica XOR, los bits del primer operando que sean iguales a los del segundo, resultaran en 0 (false) y el resto de bits en 1 (true) por lo tanto si realizamos el XOR de 25h con 63h obtendremos:

01000110 -> 46h

Como podemos comprobar se cumple la lgica de esta instruccin. Si ahora cogemos este valor y volvemos a realizar un XOR con 63h.PRIVATE01000110 -> 46hXOR

01100011 -> 63h

obtendremos

00100101 -> 25h

! El dato original !, Esta es la base de la encriptacin XOR, pongamos ahora un ejemplo genrico.Si tenemos un dato A que deseamos encriptar y una llave de encriptacin B, efectuaremos una operacin XOR tal que as:

A XOR B = C

donde C ser el valor encriptado. Si sustituimos las variables por datos:

25h XOR 63h = 46h

A = 25hB = 63hC = 46h

Posteriormente para recuperar el dato encriptado (A) haremos:

C XOR B = A

que usando los anteriores valores queda

46h XOR 63h = 25h

En este ejemplo se ha utilizado una llave (B) de 8 bits, el tamao de la llave puede ser ms grande 16,32 o ms bits, si la llave es ms grande, mayor seguridad, ya que hay ms llaves posibles. Aqu tienes un resumen de las posibles combinaciones posibles segn el tamao de la llave.

Para una llave de 8bits tenemos un total de 256 = 2^8 llaves diferentesPara una llave de 16bits tenemos un total de 65535 2^16 = llaves diferentesPara una llave de 32bits tenemos un total de 4294967295 = 2^32 llaves diferentes.Para una llave de 64bits tenemos un total de 18446744073709551616 = 2^64 llaves diferentes.Para una llave de 128 bits tenemos 3.4028236692093846346337460743177e+38 = 2^128 llaves diferentes.

Hay que tener en cuenta esto si vamos a implementar una proteccin que utilice encriptacin, ya que si se intenta un ataque por fuerza bruta sobre nuestra encriptacin y nuestra llave es de 8 bits, el tiempo necesario para conseguir una llave vlida ser muy inferior que si por el contrario nuestra llave es de 32bits o superior. Todo esto no sirve de mucho si no se toman las medidas necesarias para ocultar la llave, para que me entiendas, no sirve de nada tener una super-puerta de seguridad anti-robo y a prueba de bombas y todo lo que tu quieras si nos dejamos la llave debajo del felpudo. Por lo tanto deberemos ocultar nuestra preciada llave de cualquier ladrn :-). Un ltimo comentario, en la encriptacin XOR siempre podemos encontrar la llave si tenemos los datos encriptados y los datos sin encriptar con un simple XOR de ambos valores:

B = A xor C

46h = 25h XOR 63h

Para encriptar un bloque de datos en assembler de 32 bits haramos algo as:........mov esi,Original_Data_Ptr // carga puntero al buffer a encriptarmov edi,Crypted_Data_Ptr // carga puntero al buffer donde guarda los datosmov ecx,Data_Length // carga longitud del buffer a encriptaror ecx,ecx // comprueba si es 0jz @NoEncrypt // si es 0 no encriptamov al,XORKey // carga la llave XOR en AL@NextByte:mov ah,byte ptr [esi] // lee byte a encriptarxor ah,al // encriptamov byte ptr [edi],ah // y guarda buffer destinoinc esi // pasa al siguiente byte del bufferinc edi // pasa al siguiente byte del bufferdec ecx // decrementa contador de bytes encriptadosjnz @NextByte // continua si an quedan ms@NoEncrypt:........en 16 bits seri:........les si,Original_Data_Ptrlds di,Crypted_Data_Ptrmov cx,Data_Lengthor cx,cxjz @NoEncryptmov al,XORKey@NextByte:mov ah, byte ptr es:[si]xor ah,almov byte ptr ds:[di],ahinc siinc didec cxjnz @NextByte@NoEncrypt:........La desencriptacin se realizara de la misma manera pero pasando en Original_Data_Ptr el buffer encriptado y en Crypted_Data_Ptr el buffer donde desencriptar. Esta es una de las ventajas de la encriptacin XOR, no hace falta escribir otra funcin que desencripte, ya que se puede utilizar la misma. Por eso muchos virus utilizan este tipo de encriptacin: ocupa poco espacio, es rpida y sirve tanto para encriptar como para desencriptar.Bueno, una vez digerida esa info, vamos a tratar de pasar la primer idea del crackme a un lenguaje de programacin como es ASM.

Primero pongo el cdigo con algunos comentarios y luego lo explico:

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

mov

eax,uMsg

.if eax==WM_INITDIALOG

invoke LoadIcon,hInstance,500

mov hIcon,eax

invoke SendMessage,hWin,WM_SETICON,NULL,hIcon

;###############################################################################

Todo eso es respecto del cono, si quieren miren el tut de Daniel (La Calavera) que explica bien todo eso.

;###############################################################################

.elseif eax==WM_COMMAND

mov eax,wParam

.if eax==1005 ;Si presionamos About nos muestra un mensaje

invoke MessageBox,hWin,offset men,offset tit,MB_ICONINFORMATION

.elseif eax==1006 ;Si presionamos Salir, salimos del programa

invoke EndDialog,hWin,0

.elseif eax==1004 ;Si presionamos OK comienza a generarse el serial

invoke GetDlgItemText,hWin,1003,ADDR nombre,10 ;Tomamos el nombre .if eax==6 ;Si tiene seis caracteres invoke GetDlgItemText,hWin,1007,ADDR serial,10 ;Tomamos el serial

.if eax==6 ;Si tiene seis caracteres call generar ;Realizamos los clculos

.endif ;Terminamos el clculo

.if flag==1 ;Si el flag vale 1, felicitaciones invoke MessageBox,hWin,offset men2,offset tit2,MB_ICONINFORMATION

mov [flag],0 ;Limpiamos el flag

.endif

.endif

.elseif eax==1002 ; Si presionamos en la imagen nos da otro mensaje

invoke MessageBox,hWin,offset men3,offset tit3,MB_ICONINFORMATION

.endif

Bueno, los primeros MsgBox son los mensajes de agradecimiento y alguna que otra cosa ms, pero nada que se relacione con el clculo del serial. Luego si viene lo que importa:

.elseif eax==1004 ;Si presionamos OK comienza a generarse el serial

invoke GetDlgItemText,hWin,1003,ADDR nombre,10 ;Tomamos el nombre

.if eax==6 ;Si tiene seis caracteres

invoke GetDlgItemText,hWin,1007,ADDR serial,10 ;Tomamos el serial

.if eax==6 ;Si tiene seis caracteres

call generar ;Realizamos los clculos

.endif ;Terminamos el clculo

.if flag==1 ;Si el flag vale 1, felicitaciones

invoke MessageBox,hWin,offset men2,offset tit2,MB_ICONINFORMATION

mov [flag],0 ;Limpiamos el flag

.endif

.endif

En esa parte, si presionamos el botn cuyo ID es 1004, tomaremos en primera instancia, el nombre que esta en el edit con la funcin GetDlgItemText y lo almacenaremnos en una variable llamada nombre. Luego, yo decid que si el nombre tena seis caracteres segua haciendo las dems cosas, sino, no hace nada. Si el nombre tiene seis caracteres, tomamos el serial que esta en el edit cuyo ID es 1007 y lo guardamos en la variable serial. Ahora, volvemos a verificar si el serial tiene 6 caracteres, en caso afirmativo, llamaremos a la funcin encargada de generar el serial, sino chao!!!.

Si hemos metido el nombre y el serial con seis caracteres, pasaremos a esta parte:

DlgProc endp

generar:

xor eax,eax ;Limpiamos los registros

xor ebx,ebx

xor edx,edx

bucle: ;Inicia el bucle

.if ebx==6 ;Si EBX es igual a seis, salta al segundo bucle, sino...

jmp bucle2

.endif

mov al,byte ptr ds:[nombre+ebx] ;Mueve el primer carcter del nombre

.if al>=41H && al=61H && al