Hardcoded serial

Material

En este primer tutorial emplearemos un crackme con una protección de Hardcoded hecho por RedH@wk para Crackslatinos (concretamente para un curso de Ricardo Narvaja)

Antes de nada veamos unas nociones básicas sobre hardcoded

  • Este sistema de protección utiliza un código que esta dentro del programa

  • A veces os podréis encontrar ese código en las string de referencia, pero no las probéis hasta que no estéis seguros por que algunos programadores ponen códigos falsos que al ingresarlos se ejecuta un código maligno para evitar mentes curiosas

Bueno ya podemos empezar este tutorial, en este tutorial crackearemos el programa de las 2 formas que existen para un hardcoded: Romper la Puerta y Hacer una copia de las llaves.

Antes de nada vamos a ver con que lenguaje esta programado y que compilador se ha usado en este programa, así que abrimos el PEiD y le damos al boton de “…” para cargar el programa y vemos lo siguiente:

0

Vemos que esta programado en ASM y con el compilador MASM32/TASM32, hecho esto ya podemos empezar

Rompiendo la Puerta

Primero abriremos el programa y veremos como se comporta, veremos que hay 2 botones y una caja de texto, metemos un serial cualquiera en la caja de texto y aceptamos y vemos que nos sale lo siguiente:

1

Bueno vemos que nos sale un mensaje de error, ya tenemos algo de lo que tirar para parchear el programa (si no saliese nada tendríamos que usar las API’s), vamos al OLLYDBG (File > Open) y abrimos el programa y en el lugar donde sale el código en ASM hacemos clic con el 2º botón Search for > all referenced text String

2

Y vemos como nos aparece el mensaje de error:

3

Así que pinchamos 2 veces sobre él y nos llevará a:

4

Ahí vemos el mensaje de error que en realidad empieza en la dirección de memoria: 00401074 y vemos que justo debajo esta el mensaje de felicitación, y vemos que en ambos mensajes pone al final algo de MessageBox que es una API que lo que hace es crear el cuadro del mensaje. Y también vemos que encima de los mensaje de error tenemos un salto y una comparación (podemos probar ya a cambiar ese salto pero preferimos estar seguros de que ese es el salto condicional que nos interesa, así que sigamos), para estar seguros de que es ese el CMP que nos interesa vamos a poner un BreakPoint, para ello pulsamos sobre la línea del CMP y pulsamos F2 o bien hacemos doble clic pero sobre la traducción en hexadecimal, en este caso 3BDA, y vemos como se nos pone en rojo la dirección de memoria:

5

Ahora pulsamos F9 o vamos a Debug > Run o bien le damos al botón que tiene forma de Play debajo de los menús ( el 4º empezando por la izquierda), de esta manera se ejecutará el programa (si no lo veis minimizad todo, que este programa no aparece en la barra de tareas) volvemos a poner un serial cualquiera y apretamos Verificar y nos llevará al OLLY (Si no se pone la pantalla del OLLY automáticamente restauradlo desde la barra de tareas) esto quiere decir que ese CMP se lleva acabo al apretar el botón verificar por lo tanto es el responsable de comparar el serial correcto con el falso, así que procederemos a parchearlo, nos ponemos encima de la línea del salto condicional y vemos esto:

6

Vemos que nos dice que si EBX y ECX son iguales el programa saltará (Vemos como se nos muestra una línea que indica la dirección de memoria 00401087 que es donde saltará si se produce ese salto) al mensaje de felicitación, ahora si, vamos a parchearlo, procederemos a cambiar el JE por JNE o JNZ (que ya hemos visto en el manual anterior que es lo mismo), es decir, saltará al mensaje de felicitación si EBX y EDX NO son iguales, así que para parchearlo hay 2 posibilidades, o bien hacemos doble clic sobre el texto (lo que sale en amarillo) y allí hacemos los cambios, o seleccionamos la línea hacemos clic con el 2º botón y elegimos Assemble y ahí hacemos los cambios (Vemos como el 74 se ha cambiado por 75), ahora quitamos el BreakPoint anterior (para ello podemos hacer doble clic de nuevo sobre las instrucciones en hexadecimal o bien hacemos clic sobre el botón B que esta debajo de los menús [el 7º empezando por la derecha] de esta manera se nos mostraran todos los BreakPoint que hemos puesto, elegimos el que queramos quitar hacemos clic con el 2º botón sobre el y elegimos Remove) y ejecutamos de nuevo el programa (F9 o las demas opciones que expliqué antes)

7

Y ya hemos roto la puerta.

Aclaración: En la parte teórica (que fue el manual 1) expliqué que para parchear había 2 formas mas (la de los NOP’s y la de hacer operaciones que dejen el programa como estaba, como por ejemplo las instrucciones INC y DEC), en este caso no podremos hacerlo ¿Por qué? Un programa ejecuta las instrucciones se realizan desde arriba hacia abajo

6

Si en este caso empleásemos ese camino veremos como realiza la comparación, pasaría por los nop’s (o por las instrucciones que dejan el programa como estaba antes) sin hacer nada y llegaría la zona de mensaje de error por lo que no conseguiríamos nuestro objetivo (si el mensaje de felicitación estuviese encima del de error si nos serviría) :latigo:

Ahora para guardar los cambios de forma permanente lo podemos hacer desde un editor hexadecimal o desde el mismo OLLY. En este caso lo haremos desde el OLLY.

Pinchamos sobre cualquier parte de donde se muestra el código ASM, hacemos clic con el 2º botón y elegimos Copy to executable > all modifications (aunque solo hayamos realizado un cambio) en el siguiente cuadro elegimos Copy all y nos aparecerá otra ventana dentro del OLLY en esa ventana hacemos clic con el 2º botón y elegimos Save File y elegimos otro nombre diferente al original para no sobrescribir y guardamos.

Haciendo una copia de llaves

Cargamos de nuevo el Crackme, hacemos lo propio para ver las String referencias (en el lugar donde sale el codigo en ASM hacemos clic con el 2º boton Search for > all referenced text String) y demos doble clic de nuevo sobre el mensaje de error, apareceremos sobre el mensaje de error y si miramos mas arriba vemos otra API que se llama GetDlgTextItemA (esta API sirve para obtener el texto), así que colocaremos un BreakPoint (ya sabéis como hacerlo) por que sospechamos que esa API es la responsable de coger el texto que nosotros metemos para compararlo con el serial correcto.

8

El BreakPoint se puede poner al inicio de la API (como me gusta hacer a mi) o sobre el CALL (que al fin y al cabo ahí es donde empieza realmente la API), una vez puesto el BreakPoint ejecutamos el programa con el F9 (si no veis el programa minimizad todo) metemos un texto cualquiera y le damos a verificar, ahora el programa parará y nos iremos al OLLY y tracearemos un poco (para ello tenemos 2 botones, el F7 si queremos entrar dentro de los CALL’s cuando los haya, o el F8 si no queremos entrar en los CALL’s) y nos vamos fijando en todas las ventanas del OLLY, traceamos un poco saltándonos la call de la API GetDlgItemTextA (con F8) y vemos que debajo hay 2 MOV’s el 1º mueve un valor a EBX y el segundo mueve otro valor a EDX y debajo esta la comparación, así que suponemos que los valores que se mueven a EDX y EBX son los de nuestro serial cualquiera y el del serial correcto.

Vayamos a examinar el primer MOV pulsaremos F7 o F8(para saltarnos el call de la API) y nos colocamos sobre el mov, debajo de donde se muestra el código en ASM y encima del DUMP encontramos esta ventanita (puede ser que la tengáis que hacer mas grande por que a veces al iniciarse el OLLY aparece muy pequeña, casi escondida)

9

Vemos que se mueve el valor 506C6452 a EAX (Esta claro que eso es uno de las 2 serial, ¿pero como sabemos cual es? Hay 2 maneras, una corta y otra larga, pero como es mejor saberlo todo voy a explicar las 2 formas)

Forma larga

Los procesadores Intel usan little endian, así que pone los números hexadecimales al revés, es decir, el numero 506C6452 realmente es: 52646C50, veamos cual es el valor ASCII de este número Hexadecimal, abrimos la calculadora de Windows, vamos al menú Ver > Científica (De esta manera vemos que aparecen mas opciones) a la izquierda del todo, debajo de donde metemos los numero marcad Hex (y vemos como las letras desde la A hasta la F se activan) ya que el número que vamos a introducir es hexadecimal, e introducimos las 2 primeras cifras (en hexadecimal 2 cifras siempre son una letra/símbolo/número en ASCII) que en este caso es 52.

10

Aclaración: Si, si, esta es la calculadora de Windows, lo que pasa que en el campo tengo un Windows modificado y esta calculadora es una versión Plus

A continuación marcamos la opción de Dec (de decimal) y el número se nos transformará a decimal, que es 82, ahora vamos al bloc de notas y mientras apretamos ALT pulsamos las tecla 5 y 2 (el 5 y el 2 no a la vez, mientras tengáis pulsado ALT pulsáis primero 5 y luego 2, si no os va con la numeración de arriba de las letras probad con los números de la derecha del teclado :latigo: ), y vemos que se escribe una “R” si convertimos el siguiente número a hexadecimal que es 64, nos saldrá que en decimal es 100, hacemos lo del ALT y nos escribe “d” (en el código ASCII hay que distinguir entre minúsculas y mayúsculas) y si seguimos así, la siguiente letra será “l” y la siguiente será “P”. Vamos que ese serial es RdlP y como supondréis es el que introduje yo, es decir, el incorrecto, así que sabemos que en EBX se guarda nuestro serial y lógicamente en EDX se guardará el serial correcto.

Nota: El proceso de conversión de hexadecimal a decimal no se tiene que hacer a la fuerza con la calculadora de Windows, puedes usar cualquier otra que permita conversiones entre sistemas numéricos o incluso realizar la conversión a mano, y tampoco hace falta hacer lo del ALT, hay tablas del código ASCII por la red (lo que pasa que en el campo no tengo Internet y no me se la tabla de memoria)

Forma corta

En el lugar donde se nos mostraba los valores que se iban a mover, nos situamos sobre DS:[0040300C]=506C6452 (cuando un numero aparece entre [] significa que es una posición de la memoria y en este caso significa que la posición de memoria [0040300C tiene el valor 506C6452) pulsa sobre él con el 2º botón y elegimos Follow in Dump:

11

Y apareceremos en:

12

Ahí vemos como es efectivamente RdlP.

Ahora pinchamos sobre el 1º mov (si es que no lo estábamos ya) y pulsamos F7 para tracear y llegamos al 2º mov (que como ye hemos deducido es donde se moverá el serial correcto) y miramos nuevamente abajo y vemos lo siguiente:

13

Se moverá la posición de memoria 0040204B que contiene el valor de 38393839 al registro EDX. Y sigamos el camino que sigamos (la conversión manual o 2º botón en DS:[0040204B]=38393839 y luego Follow in Dump) daremos con la misma solución.

P.D Lo cierto es que me ha quedado bastante largo este tutorial, pienso que es por que al ser el primero he explicado con muchos detalles como hacer cosas como poner los BreakPoint’s como ejecutar el programa, como modificar el código ASM, etc.… espero que el próximo sea mas corto.

18 de agosto de 2007

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *