Está en la página 1de 8

MAKKAKKO LECCIONES DE CRACKING

By Makkakko

TUTORIAL 06: COMO CRACKEAR EL ARCHIVO “CRACKME2” DE


CoSH
Una vez analizados los distintos modos de alterar los saltos
condicionales, nos centraremos en otra de las formas de crackeo que
existen: la modificación del lenguaje ensamblador. Aunque a primera vista
pueda parecer algo muy complejo, veremos que no es tan difícil como parece
si tenemos un poco de picardía y de ojo. Este tutorial será más complicado
que los anteriores, aunque nos servirá de base para realizar futuros
cracks.

1.- OBJETIVO

Programa: Crackme2
Compañía/Autor: CoSH
Protección: Serial
Nivel de Dificultad: Nivel 1
URL descarga: http://www.elitecoding.net/~lucifer48/tut-
crkme.html

2.- NUESTRA TÁCTICA

Seguiremos las pautas que hemos utilizado en las lecciones anteriores


e introduciremos algunos elementos nuevos:

 Examinaremos las STRING REFERENCES con el W32Dasm y con el OllyDBG.

 Encontrado el mensaje “One of the Details you entered was wrong”, que
aparece al introducir un número de serie, buscaremos su origen.

 Iremos al lugar de origen de la zona “CHICO MALO” para encontrar el


origen de “CHICO BUENO”.

 Apuntaremos el origen de las ordenes “CHICO MALO” y “CHICO BUENO”.

 Modificaremos la orden que nos lleva a ”CHICO MALO” para que nos lleve a
la orden “CHICO BUENO”.

 Verificaremos que introduciendo cualquier número, el programa funciona.

3.- HERRAMIENTAS

OllyDbg 1.07 http://home.t-online.de/home/Ollydbg/odbg107a.zip


UltraEdit 32 v9.00c (Editor Hexadecimal, aunque vale cualquiera)
Un poquito de vista
Algo de picardía
4.- APRENDIENDO A SER UN MANITAS COMO MacGYVER

En las lecciones precedentes hemos visto alguna de las formas de


cracking existentes. Sin embargo, existen otras formas distintas. Según Mr.
Nobody, las principales formas de crackear programas son:

 Cambiar los saltos condicionales para que el programa vaya a la zona de


CHICO BUENO, cuando el número que introducimos no coincide con el del
programa o haciendo que salte siempre (74/75/EB).

 Hacer que el programa no haga nada cuando llegue a la zona de


comparación. De este modo pasará siempre a leer la línea siguiente. A
esta forma de crackeo se le llama “NOPEAR” (no operation” en inglés).

 Invertir el salto, modificando la orden inicial por otra nueva que nos
convenga.

En este tutorial nos centraremos en el estudio de la tercera: el


cambio de las ordenes en ensamblador. Para ello, utilizaremos el programa
CRACKME2 de CoSH.

Empezaremos abriendo el programa CRACKME2. Nos pide que introduzcamos


un nombre y un número de serie, así que ponemos lo primero que se nos
ocurra. Pulsamos CHECK y aparece el mensaje “One of the Details you entered
was wrong”. Utilizaremos este mensaje para descubrir la orden que nos lleva
a CHICO MALO.

Abrimos el programa OllyDBG, vamos a FILE – OPEN y seleccionamos el


programa “CRACKME2”. Pulsamos el BOTÓN DERECHO DEL RATÓN. Elegimos SEARCH
FOR y después ALL REFERENCED TEXT STRING. Aparecerá un cuadro en cuya parte
superior podremos leer TEXT STRINGS REFERENCED IN CRACKME2:.TEXT.
Clickeamos dos veces encima del mensaje que nos mostró antes el programa, y
aparecemos en:

00401536 |> 6A 00 PUSH 0


00401538 |. 68 64304000 PUSH CRACKME2.00403064 ; ASCII "ERROR"
0040153D |. 68 38304000 PUSH CRACKME2.00403038 ; ASCII "One of the
Details you entered was wrong"
00401542 |. 8BCE MOV ECX,ESI
00401544 |. E8 F5020000 CALL <JMP.&MFC42.#4224>
00401549 |. 6A 00 PUSH 0
0040154B |. FFD3 CALL EBX

Si nos fijamos bien, vemos que el inicio de la orden está marcado con
el signo “>”. Nos situamos encima de ella (00401536) y pulsamos el BOTÓN
DERECHO DEL RATÓN - FIND REFERENCES TO - SELECT COMMAND. OllyDBG nos
mostrará el salto o saltos con los que está relacionado:

Address Disassembly Comment


004014E4 JLE SHORT CRACKME2.00401536
004014F3 JLE SHORT CRACKME2.00401536
00401516 JNZ SHORT CRACKME2.00401536
0040151C JNZ SHORT CRACKME2.00401536
00401522 JNZ SHORT CRACKME2.00401536
00401528 JNZ SHORT CRACKME2.00401536
0040152E JNZ SHORT CRACKME2.00401536
00401536 PUSH (Initial CPU selection)
Como podemos ver hay siete saltos que nos llevan a 00401536 (zona de
CHICO MALO). Siguiendo las ordenes, vemos que tras ella se encuentra la
zona de CHICO BUENO:

0040154D |> 8D8E E0000000 LEA ECX,[DWORD DS:ESI+E0]


00401553 |. 8D5424 14 LEA EDX,[DWORD SS:ESP+14]
00401557 |. 51 PUSH ECX
00401558 |. 68 2C304000 PUSH CRACKME2.0040302C ; ASCII "Well done,"
0040155D |. 52 PUSH EDX
0040155E |. E8 D5020000 CALL <JMP.&MFC42.#926>
00401563 |. 68 3C314000 PUSH CRACKME2.0040313C
00401568 |. 50 PUSH EAX
00401569 |. 8D4424 18 LEA EAX,[DWORD SS:ESP+18]
0040156D |. C74424 28 0000>MOV [DWORD SS:ESP+28],0
00401575 |. 50 PUSH EAX
00401576 |. E8 B7020000 CALL <JMP.&MFC42.#924>
0040157B |. 8B00 MOV EAX,[DWORD DS:EAX]
0040157D |. 6A 00 PUSH 0
0040157F |. 68 20304000 PUSH CRACKME2.00403020 ; ASCII "YOU DID IT"
00401584 |. 50 PUSH EAX
00401585 |. 8BCE MOV ECX,ESI
00401587 |. C64424 2C 01 MOV [BYTE SS:ESP+2C],1
0040158C |. E8 AD020000 CALL <JMP.&MFC42.#4224>

Al igual que antes nos situamos en la línea donde se encuentra el


inicio de la orden (marcada con el signo “>”), y pulsamos el BOTÓN DERECHO
DEL RATÓN - FIND REFERENCES TO - SELECT COMMAND:

Address Disassembly Comment


00401534 JE SHORT CRACKME2.0040154D
00401536 LEA ECX, [DWORD DS:ESI+E0] (Initial CPU selection)

Clickeando dos veces sobre 00401534:

00401534 |. 74 17 JE SHORT CRACKME2.0040154D

Esta orden es la que está justo encima de la zona de CHICO MALO. Todo
esto significa que al introducir nuestro nombre y número el programa
verificará si coincide con cada uno de los parámetros existentes (en este
caso siete). Si coinciden va a la zona de registro (0040154D) y si no
coincide vamos a la zona de no registro (00401536).

Si conocemos las ordenes que nos llevan a las comparaciones y las


zonas de CHICO BUENO y MALO, podemos conseguir que siempre nos lleva a la
zona de CHICO BUENO. ¿Cómo lo podemos hacer?. Alterando el destino de la
orden, es decir, cambiando 00401536 por 40154D. Si nos fijamos otra vez en
los saltos a la zona de CHICO MALO:

004014E4 JLE SHORT CRACKME2.00401536 ===> cambiar por 0040154D


004014F3 JLE SHORT CRACKME2.00401536 ===> cambiar por 0040154D
00401516 JNZ SHORT CRACKME2.00401536 ===> cambiar por 0040154D
0040151C JNZ SHORT CRACKME2.00401536 ===> cambiar por 0040154D
00401522 JNZ SHORT CRACKME2.00401536 ===> cambiar por 0040154D
00401528 JNZ SHORT CRACKME2.00401536 ===> cambiar por 0040154D
0040152E JNZ SHORT CRACKME2.00401536 ===> cambiar por 0040154D
Hechos los cambios quedarían así:

004014E4 JLE SHORT CRACKME2.0040154D


004014F3 JLE SHORT CRACKME2.0040154D
00401516 JNZ SHORT CRACKME2.0040154D
0040151C JNZ SHORT CRACKME2.0040154D
00401522 JNZ SHORT CRACKME2.0040154D
00401528 JNZ SHORT CRACKME2.0040154D
0040152E JNZ SHORT CRACKME2.0040154D

Comprobemos que nuestra intuición no nos falla. Pulsamos el BOTÓN


DERECHO DEL RATÓN y elegimos ASSAMBLE (tenemos que estar situados encima de
la orden que vamos a cambiar, en este caso: 004014E4. En el cuadro que nos
aparecerá cambiamos 00401536 por 0040154D. Hacemos lo mismo con el resto de
las ordenes (004014F3, 00401516, 0040151C, 00401522, 00401528 Y 0040152E).
Una vez hechos todos los cambios quedará así:

004014E4 7E 67 JLE SHORT CRACKME2.0040154D


004014E6 |. 8D6E 60 LEA EBP,[DWORD DS:ESI+60]
004014E9 |. 8BCD MOV ECX,EBP
004014EB |. E8 5A030000 CALL <JMP.&MFC42.#3876>
004014F0 |. 83F8 05 CMP EAX,5
004014F3 7E 58 JLE SHORT CRACKME2.0040154D
004014F5 |. 8D86 E0000000 LEA EAX,[DWORD DS:ESI+E0]
004014FB |. 8BCF MOV ECX,EDI
004014FD |. 50 PUSH EAX
004014FE |. E8 41030000 CALL <JMP.&MFC42.#3874>
00401503 |. 8DBE E4000000 LEA EDI,[DWORD DS:ESI+E4]
00401509 |. 8BCD MOV ECX,EBP
0040150B |. 57 PUSH EDI
0040150C |. E8 33030000 CALL <JMP.&MFC42.#3874>
00401511 |. 8B07 MOV EAX,[DWORD DS:EDI]
00401513 |. 8038 36 CMP [BYTE DS:EAX],36
00401516 75 35 JNZ SHORT CRACKME2.0040154D
00401518 |. 8078 01 32 CMP [BYTE DS:EAX+1],32
0040151C 75 2F JNZ SHORT CRACKME2.0040154D
0040151E |. 8078 02 38 CMP [BYTE DS:EAX+2],38
00401522 75 29 JNZ SHORT CRACKME2.0040154D
00401524 |. 8078 03 37 CMP [BYTE DS:EAX+3],37
00401528 75 23 JNZ SHORT CRACKME2.0040154D
0040152A |. 8078 04 2D CMP [BYTE DS:EAX+4],2D
0040152E 75 1D JNZ SHORT CRACKME2.0040154D
00401530 |. 8078 05 41 CMP [BYTE DS:EAX+5],41

OllyDBG nos muestra en rojo los cambios que hemos hecho. Vamos a
comprobar si funciona. Pulsamos DEBUG - RUN. Introducimos un nombre y un
número y ... Well done.

Como ya sabemos que funciona, haremos los cambios de modo definitivo


con el editor hexadecimal. Abrimos el ULTRAEDIT y después FILE y OPEN.
Abrimos el archivo CRACKME2. El ULTRAEDIT nos muestra las ordenes en
hexadecimal del programa. Ahora presionamos SEARCH y después vamos a FIND.
Vamos a buscar la cadena de números hexadecimales que corresponden a cada
una de las ordenes a cambiar, y cambiaremos:

004014E4 7E 50 / 7E 67
004014F3 7E 41 / 7E 58
00401516 75 1E / 75 35 En azul ==> los números originales
0040151C 75 18 / 75 2F
00401522 75 12 / 75 29 En rojo ==> los números que debemos poner
00401528 75 0C / 75 23
0040152E 75 06 / 75 1D

Los números subrayados serán los nuevos bytes que hay que cambiar. P.
ej, si antes la cadena de bytes era: 7E 50 8D 6E 60, ahora quedará así: 7E
67 8D 6E 60. Haremos lo mismo con cada una de las cadenas de bytes:
buscaremos la cadena y modificaremos el byte correspondiente (los bytes
nuevos serán los subrayados).

Después de cambiar cada una de las ordenes, pulsamos FILE y SAVE. Si


ULTRAEDIT no nos deja guardar los cambios es porque tenemos abierto el
OllyDBG o el programa CRACKME2. Cerrádlos y guardará los cambios que hemos
hecho.

Hechos los cambios vamos a comprobar de nuevo si funciona. Abrimos el


programa CRACKME2, metemos el nombre y el número ... ¡¡FUNCIONA!!.

El proceso ha sido un poco más laborioso, pero el resultado ha sido


el mismo. Esta forma de crackear tan solo modifica el destino de la orden.
Como hemos visto, podemos alterar las ordenes en idioma ensamblador para
ajustarlas a lo que nosotros queremos, tan solo debemos asegurarnos que el
salto sea siempre a la zona correcta, a la zona de CHICO BUENO.

5.- AGRADECIMIENTOS

 Ricardo Narvaja. No dejéis de leer su “Curso de Crackeo para newbies”.


Lo podéis encontrar en la web de Karpoff (http://karpoff.welcome.to/).

 Mr. Nobody. Tampoco os podéis perder su “Curso otoñal de crackeo”. Lo


podéis encontrar en http://decada.hypermart.net/crack/files/coctodo.zip.
Aquí encontrareis la teoría que necesitáis sobre los saltos
condicionales.

6.- DESPEDIDA

Podéis seguir intentando crackear programas en la siguiente


dirección: http://www.elitecoding.net/~lucifer48/tut-crkme.html. También
podéis encontrar programas para crackear en:
http://www.karpoff.hpg.ig.com.br/CrackMEs.htm.

Continuad crackeando y aprendiendo ...

Hasta la próxima Makkakko Lección.

Makkakko. Agosto 2.002

ADDENDA AL TUTORIAL 06: ATANDO LOS CABOS SUELTOS


Aunque parezca que hemos crackeado correctamente el programa, hemos
dejado dos pequeños cabos sueltos. Como buen crackeador que queremos ser,
hemos de dejar de lado las chapuzas y asegurarnos que el crack funciona
correctamente. Seguro que estáis pensando, ¿qué está diciendo este tío?.
Muy sencillo. Ejecutad otra vez el CRACKME2 (en su versión ya crackeada).
Introducimos un nombre largo, p. ej. TENGOUNNOMBREMUYLARGO, y un número de
serie también largo, p. ej. 12345678901234567890. Pulsamos CHECK y ... ¡¡SE
HA COLGADO EL ORDENADOR!! (por lo menos en el mío lo hace).

Esto nos demuestra que no somos tan buenos aprendices como parece.
¿Dónde está el problema?. La solución es muy sencilla, tan solo debemos
fijarnos otra vez en las ordenes que se encuentran entre 004014E4 y
00401530:

004014DB |. 8B1D FC214000 MOV EBX,[DWORD DS:<&USER32.PostQuitMessa>


004014E1 |. 83F8 05 CMP EAX,5
004014E4 7E 67 JLE SHORT CRACKME2.0040154D
004014E6 |. 8D6E 60 LEA EBP,[DWORD DS:ESI+60]
004014E9 |. 8BCD MOV ECX,EBP
004014EB |. E8 5A030000 CALL <JMP.&MFC42.#3876>
004014F0 |. 83F8 05 CMP EAX,5
004014F3 7E 58 JLE SHORT CRACKME2.0040154D
004014F5 |. 8D86 E0000000 LEA EAX,[DWORD DS:ESI+E0]
004014FB |. 8BCF MOV ECX,EDI
004014FD |. 50 PUSH EAX
004014FE |. E8 41030000 CALL <JMP.&MFC42.#3874>
00401503 |. 8DBE E4000000 LEA EDI,[DWORD DS:ESI+E4]
00401509 |. 8BCD MOV ECX,EBP
0040150B |. 57 PUSH EDI
0040150C |. E8 33030000 CALL <JMP.&MFC42.#3874>
00401511 |. 8B07 MOV EAX,[DWORD DS:EDI]
00401513 |. 8038 36 CMP [BYTE DS:EAX],36
00401516 75 35 JNZ SHORT CRACKME2.0040154D
00401518 |. 8078 01 32 CMP [BYTE DS:EAX+1],32
0040151C 75 2F JNZ SHORT CRACKME2.0040154D
0040151E |. 8078 02 38 CMP [BYTE DS:EAX+2],38
00401522 75 29 JNZ SHORT CRACKME2.0040154D
00401524 |. 8078 03 37 CMP [BYTE DS:EAX+3],37
00401528 75 23 JNZ SHORT CRACKME2.0040154D
0040152A |. 8078 04 2D CMP [BYTE DS:EAX+4],2D
0040152E 75 1D JNZ SHORT CRACKME2.0040154D
00401530 |. 8078 05 41 CMP [BYTE DS:EAX+5],41

Como podemos ver, las ordenes subrayadas están haciendo una


comparación: CMP EAX,5. ¿Qué significa esto?. Si nos fijamos un poco, vemos
que desde 00401513 hasta 00401530 compara cada uno de los números que hemos
introducido con los valores 36, 32, 38, 37, 2D y 41 (compara valores hexa
con su equivalente en ASCII). Si los dígitos introducidos son inferiores a
5, el programa nos lleva a 00401536 que es la zona de CHICO MALO. El
problema que puede haber es que si el salto nos lleva siempre a la zona de
CHICO BUENO (cuando los dígitos son menos de 5), si introducimos más de 5
(como ocurría en la orden original), el programa se puede atascar.

Vamos a solucionar este pequeño problema. Cambiaremos 5 por otro


número superior, p. ej. 25, y así, si los dígitos que introducimos son
inferiores a 25 (que suele ser lo más habitual), saltaremos siempre a la
zona de CHICO BUENO (que es la que previamente hemos alterado).

004014F0 |. 83F8 05 CMP EAX,5 ==> cambiar 5 por 25


¿Cómo hacemos el cambio?. Con Olly nos posicionaremos encima de la
orden 004014F0. Pulsamos el BOTÓN DERECHO DEL RATÓN - ASSAMBLE. Cambiamos
el 5 por el 25, y pulsamos ASSAMBLE. Una vez hecho el cambio cancelamos.

Tendría que quedar así:

004014F0 |. 83F8 05 CMP EAX,25

Haremos exactamente lo mismo con 004014E1 (cambiar el 5 por 25).

Comprobamos si funciona (recordad que lo debéis probar sobre el


archivo CRACKME2 que ha sido crackeado previamente conforme a este
tutorial). Pulsamos DEBUG - RUN, e introducimos un nombre y un número hasta
el final del cuadro. Clickeamos en CHECK ... y todo solucionado.

Una vez comprobado, pasaremos a hacer los cambios de modo definitivo


con el ULTREDIT. Buscaremos las dos cadenas de bytes con SEARCH - FIND:

83 F8 05 7E 67 ==> cambiar 05 por 25


83 F8 05 7E 58 ==> cambiar 05 por 25

Después FILE - SAVE para guardar los cambios. Ejecutamos CRACKME2 y


el archivo funcionará perfectamente. Ahora si queremos podemos hacer un
parche distribuible con PATCH FX.

Ha sido un poco complicado, pero por fin el programa funciona


perfectamente. Como veis vale la pena el tomarse la molestia de atar todos
los cabos que hayamos podido dejar sueltos. No es aconsejable hacer
chapuzas.

Esto es todo por hoy.

Hasta la próxima Makkakko Lección.

Makkakko. Agosto 2.002.

ADDENDA BIS AL TUTORIAL 06: LA MEJOR FORMA DE


RESOLVER EL PROBLEMA

Después de todos los cambios que hemos tenido que hacer para
conseguir crackear el programa, seguro que os estareis preguntando si no
había una forma mucho más sencilla de hacerlo. Pues habéis acertado, la
respuesta es si.

Si recordáis, en 004014E1 se hacía una comparación del número de


letras que habíamos introducido. Si era inferior a cinco, íbamos a 00401536
(CHICO MALO). Para solucionarlo nos situamos encima de 004014E1 y cambiamos
5 por 1 con ASSAMBLE.

004014E1 83F8 01 CMP EAX,1


004014E4 |. 7E 50 JLE SHORT CRACKME2.00401536
Respecto a la segunda comparación hacemos exactamente lo mismo:
cambiamos 5 por 1 en la instrucción 00404F0.

004014F0 83F8 01 CMP EAX,1


004014F3 |. 7E 41 JLE SHORT CRACKME2.00401536

Nos queda solventar el último de los problemas: las comparaciones


entre los dígitos introducidos y los que el programador ha establecido como
el serial. Si os fijasteis en su momento 00401516, 0040151C, 00401522,
00401528 y 0040152E están comparando cada uno de los dígitos. Si no son
equivalentes el programa nos lleva a la zona de CHICO MALO, si coinciden
pasa a la siguiente comparación. Como vemos la solución es muy sencilla:
haremos que si no coinciden los dígitos pasemos a la siguiente orden y si
coinciden pasaremos a la zona de CHICO MALO. Por eso cambiaremos el 75 por
74.

00401516 74 1E JE SHORT CRACKME2.00401536


0040151C 74 18 JE SHORT CRACKME2.00401536
00401522 74 12 JE SHORT CRACKME2.00401536
00401528 74 0C JE SHORT CRACKME2.00401536
0040152E 74 06 JE SHORT CRACKME2.00401536

La última orden nos hace la última comparación de los dígitos


(utiliza el 74 para que si los números son equivalentes salte a la zona de
registro). Solo tendremos que cambiar el 74 por EB, para que respecto a
esta última comparación salte siempre y nos registre.

00401534 EB 17 JMP SHORT CRACKME2.0040154D

Como veis, era mucho más sencilla esta forma que las anteriores. Sin
embargo, es bueno conocer y practicar sobre la forma de alterar el lenguaje
ensamblador. Aunque ha sido difícil, estoy convencido que habréis perdido
el miedo que teníais.

Hasta pronto ...

Makkakko. Agosto 2.002

También podría gustarte