Documentos de Académico
Documentos de Profesional
Documentos de Cultura
[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.
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
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:
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
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.
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
a 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:
00100101 -> 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.
01000110 -> 46h
XOR
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 = 25h
B = 63h
C = 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 diferentes
Para una llave de 16bits tenemos un total de 65535 2^16 = llaves diferentes
Para 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.
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
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
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
10
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
11
Es para limpiar le variable en donde tenemos guardado el serial generado anteriormente. Hago esto
porque tuve el problema de que si meta un nombre y luego daba a generar me sala su
correspondiente serial, pero si luego meta otro nombre y le daba a generar, siguen estando
algunos caracteres del serial anterior y por lo tanto se juntan con el nuevo y eso no est bien, por lo
tanto busque una manera de solucionar ese problema y sali esto. Creo que haba otra manera ms
sencilla de hacer esto, pero no recuerdo cual.....si alguien se acuerda que me diga porque me tiene
bastante intrigado, as que si puede escribir a la lista o a mi privado y contarme como es, se lo
agradecera.
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
12
generar:
invoke lstrlen,offset nombre ;Tomamos la longitud del nombre
mov [largo],eax ;Movemos el largo de la cadena a la variable largo
xor eax,eax ;Ponemos EAX==0
xor ecx,ecx ;Ponemos ECX==0
sBucle: ;Inicia el bucle
.if ecx==largo ;Si el largo de la cadena es igual al contador...
jmp final ;saltamos al final
.endif
mov al, byte ptr ds:[nombre+ecx] ;Tomamos el primer carcter del nombre
xor al,30H ;Lo xoreamos con 30h
mov byte ptr ds:[key+ecx],al ;Movemos el resultado a la variable key
inc ecx ;Incrementamos el contador
jmp sBucle ;Volvemos al inicio del bucle
final:
ret ;Volvemos de la llamada
Y las variables han quedado de esta forma:
nombre dd 30 dup (?)
largo dd ?
key dd 30 dup (?)
Muy sencillo, no tiene nada de raro. En el crackme, habamos xoreado, primero, los caracteres del
nombre con 30h (con eso generamos el serial vlido) y luego con 29h, pero eso es solo para realizar
las comparaciones, tal vez sea una forma de despistar a los muy newbies (a un cracker avanzado no
le hace ni cosquillas, je), as que lo nico que debemos hacer es xorear a cada carcter del nombre
con 30h y mostrar el resultado.
Si se fijan, en el crackme habamos establecido que el nombre y serial, tenan que tener si o s seis
caracteres para poder realizar las operaciones, pero aqu no tenemos esa condicin, sino que
mientras le metamos letras, nos generar un serial.
Despedida
Creo que este es el final del tut. Espero que les haya gustado. Si tienen alguna queja, comentario,
duda, lo que sea, escriban a reversing_ar@yahoo.com.ar
Agradecimientos
Es tanta gente a la que le tengo que agradecer que no me alcanzara todo el tut, je: Ricardo Narvaja,
RedH@wk, Pr@fesorX, Daniel, Odraude, Shadow&Dark, Morales (Gracias por aclararme el tema
del SEH), COCO, Yllera, Juan Jos, Joe Cracker (Gracias por la encomienda ), Flipi, AkirA
(lstima que te has retirado ), KaoD (Gracias por ser el beta-tester, je), DeGeTe, _Primax y por
supuesto a los dems integrantes de la lista.
+NCR/CRC! [ReVeRsEr]
Julio de 2004
reversing_ar@yahoo.com.ar
http://www.joe-cracker.tk/ncr.htm
13