Tutorial de lenguaje ensamblador

Por favor, elija una página de tutorial:

  • Fundamentos — Información sobre C
  • Herramientas
  • Registros
  • Instrucciones simples
  • Ejemplo 1 — SC CDKey Initial Verification
  • Ejemplo 2 -.- SC CDKey Shuffle
  • Ejemplo 2b — SC CDKey Decodificación Final
  • La Pila
    • Ejemplo de Pila
  • Funciones
  • Ejemplo 3 — Storm.dll SStrChr
  • Resumen del ensamblado
  • Código máquina
  • Ejemplo 4 — Destrozando la pila
  • Crackeando un juego
  • Ejemplo 5 — Crackeando un juego
  • Ejemplo 6 — Escribiendo un keygen
  • .Inyección y parcheo de dll
  • Búsqueda de memoria
  • Ejemplo 7 — Escribir un cheat para Starcraft (1.05)
    • Ejemplo 7 Paso 1 — Mostrar mensajes
    • Ejemplo 7 Paso 1b — Arriba, con ptrs func
    • Ejemplo 7 Final
  • Ejemplo 8 — Obtener los archivos IX86.dll
  • Ensamblado de 16 bits
  • Ejemplo 9 — Keygen para un juego de 16 bits
  • Ejemplo 10 — Escribir un loader

Esta sección repasará varias técnicas utilizadas por los crackers para registrar juegos/software. No menciono cd-cracks, porque no sé cómo hacerlos; más bien, menciono ataques que generalmente se basan en una clave o código de registro.

Protecciones comunes

La protección más común, y la que se discute aquí, es cuando un programa requiere una clave de registro para desbloquearse. Normalmente, la clave se basa o bien en un código de registro aleatorio proporcionado por el programa, o bien se basa en el nombre de usuario que se introduce.

Enumeraré algunas definiciones aquí. Tenga en cuenta que estas definiciones son mías, y no necesariamente se corresponden con las definiciones que otros utilizan. Son simplemente para facilitar la comprensión de esta sección y de las siguientes:

  • Un código de registro es un código generado por un programa, del que se deriva o comprueba la clave de registro.
  • Un nombre de usuario de registro o simplemente nombre de usuario es un nombre de usuario que un usuario introduce. La clave de registro se basa en ese nombre de usuario.
  • Una clave de registro es la clave utilizada para desbloquear un programa. Puede basarse en un código de registro, en un nombre de usuario de registro o no basarse en nada.

Encontrando el punto

El primer ejemplo repasa el algoritmo de verificación CDKey de Starcraft, pero yo proporcioné el algoritmo. El de Starcraft es el tipo de verificación más simple, la clave se verifica a sí misma sin un nombre de usuario o código. La pregunta es, ¿cómo encontrar el algoritmo?

Bueno, la desafortunada respuesta es que varía, y generalmente no es fácil.

El primer paso es, obviamente, desmontar el programa. Después de eso, como cracker, tienes que tratar de encontrar un punto débil en el programa. Aquí hay varias técnicas:

  • Busca el texto que pide la clave
  • Busca el código de registro en la memoria, y averigua dónde se accede
  • Introduce un código, haz que falle, luego busca en la memoria ese código fallido
  • Busca cualquier cosa única sobre el registro (colores, texto, diálogos, etc).
  • Buscar la clave del registro que almacena la clave
  • Buscar un archivo que almacene la información del registro
  • Buscar el mensaje de error cuando se da una clave errónea

La última técnica es la más útil, según he encontrado. Sin embargo, probarlas todas, y probar cualquier otra cosa que parezca que se adapta al juego funciona mejor. En el ejemplo de la siguiente sección, descubrí que buscar el texto que informa al usuario de que el software no está registrado funcionaba bien para el juego, como verás más adelante. Puede que haga un segundo ejemplo en el que busque el archivo que almacena la clave, y donde fue creado.

Para encontrar el verificador de CDKey de Starcraft, comencé con el tráfico de red, en la función Winsock (send() y recv()). A partir de ahí, retrocedí hasta encontrar dónde se envía el paquete que valida la clave de Starcraft con Battle.net. Fue mucho trabajo, pero en ese momento estaba aprendiendo sobre la actividad de red de Starcraft, así que fue más que nada un efecto secundario de lo que ya estaba haciendo. Si continúo escribiendo estos tutoriales, podría eventualmente entrar en tanto detalle, pero no tengo planes de hacerlo todavía.

Crackear el juego

Una vez que se encuentra el punto correcto, crackear un juego es a menudo muy fácil. Típicamente, un programa tendrá el siguiente código:

 if(keyIsValid) unlock() else displayError()

El ensamblaje para eso se vería como:

85 xx test keyIsValid, keyIsValid74 06 jz errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:

Como se discutió en la sección sobre el código de la máquina, los bytes a la izquierda pueden ser los bytes del código de la máquina (los hice rápidamente de una hoja de referencia, así que pueden o no ser exactamente correctos. Este programa se puede modificar cambiando un par de bytes, que pueden forzar al código a saltar siempre o a no saltar nunca.

Para forzar que el código salte (lo que, en este caso, hará que la tecla sea siempre válida), se sustituye la jz por un jmp (cambiando 74 por eb):

85 xx test keyIsValid, keyIsValideb 06 jmp errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:

Para evitar que el código salte (lo que, en este caso, hará que la tecla sea siempre válida), se sustituye la jz por un par de instrucciones nop:

85 xx test keyIsValid, keyIsValid90 nop90 nope8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:

Haz el cambio correspondiente, ejecuta el juego y escribe cualquier código. Debería producirse el resultado esperado.

El siguiente ejemplo mostrará esto en un juego real (en un juego que no nombraré aquí, por razones obvias).

Escribiendo un Keygen

Incluso mejor que crackear un juego es escribir un keygen para él. El usuario introduce su nombre de usuario o código de registro, y el keygen produce una clave válida.

Por lo general, esto requiere que el algoritmo sea completamente revertido y comprendido. Luego se hace una copia del mismo en C (o cualquier otro lenguaje) que produce los mismos resultados. Tenga en cuenta que los tres primeros ejemplos de este tutorial hacen precisamente eso: convertir el código ensamblador de nuevo en C. Así que cualquiera que los haya seguido debería estar en una buena posición para escribir un keygen, que vendrá en un tutorial posterior.

Preguntas

Siéntete libre de editar esta sección y publicar preguntas, haré lo posible por responderlas. Pero es posible que tengas que ponerte en contacto conmigo para hacerme saber que existe una pregunta.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.