El Arte del Cracking

Gamehacking – pt3: Utilizando Cheat Engine en nuestro MMORPG favorito

Buenas a todos, en este post no habrá muchas cosas de reversing ya que va a ser como una especie de mini tutorial sobre qué cosas se pueden y no se pueden hacer con el Cheat Engine.

A pesar de que este post está basado en el juego ACEOnline, quiero que sea lo más genérico posible para que vosotros podáis probarlo en cualquier juego que os guste: Lineage 2, WOW, AION etc.

Dicho esto, en este post hablaremos de lo útil que es Cheat Engine para el desarrollo de cheats aprendiendo técnicas como la búsqueda de punteros o definición de estructuras que nos van a ayudar a amenizar la búsqueda de valores dentro de un objeto.

Diferencias entre un juego de un solo jugador y un multijugador

Cuando queremos “hackear” un videojuego, es importante conocer la diferencia entre un juego de un solo jugador y un juego multijugador técnicamente hablando.

Cuando jugamos en un juego de un solo jugador, quien gestiona la memoria y todas las variables ya sean NPCs, el jugador etc., es el propio binario por lo que tendremos full control de la memoria al punto de poder leer y escribir lo que queramos, cuando queramos y donde queramos, pero cuando hablamos de un juego multijugador, no todo es tan bonito como parece XD

En un juego multijugador, quien gestiona la memoria de cada cliente es el propio servidor, es decir, es el servidor quien dice a dicho cliente, que es lo que tiene que pintar en cada momento dentro de su interfaz. Claro, estos datos se van actualizando cada cierto tiempo por lo que si modificamos dichos valores pues el servidor los sobrescribirá por unos nuevos todo el rato por lo que va a ser imposible poder editar algo.

Normalmente los datos que NO suelen modificarse dentro de un MMORPG son los siguientes:

  • NPCs y Entidades (Ya sean monstruos, tiendas u otros jugadores)
  • Dinero (Ya nos gustaría xD)
  • Objetos que dropean los monstruos
  • Vida, Mana, Stamina y atributos del jugador (Ataque, Defensa, Magia…)
  • Daño producido por el jugador o los jugadores

Seguramente me deje algunos más específicos como Habilidades etc. (Aunque algún juego os sorprendería XD) ¿Entonces, que se puede modificar? Ahí va la lista:

  • Nuestra posición (Teleport Hack, seguro que alguno os suena XD)
  • Atributos de las armas que no tengan que ver con el daño de estas (La velocidad de ataque y en el caso del ACEOnline: la velocidad de los mísiles y la cantidad de objetivos a apuntar)
  • La velocidad de nuestro personaje (Speed Hack; también os sonará a alguno XD)
  • El eje Z en el caso de los juegos 3D donde el personaje está en el suelo (Lo pongo aparte porque también se conoce como Fly Hack)

Como podéis ver, tampoco tenemos muchas opciones para modificar más allá de 4 variables, pero con esto es más que suficiente XD

Antes de comenzar a entender estos cheats es importante buscar donde se encuentra ubicado el jugador dentro de la memoria, esto nos servirá para más tarde filtrar en el Cheat Engine donde se encuentra cada valor al buscarlo, dicho eso, procedemos a buscarlo.

Buscando el puntero del jugador dentro de la memoria

La búsqueda de punteros es una técnica útil para poder posteriormente hacer cheats, ya que, nos va a facilitar mucho la búsqueda de los valores que nos interesaría modificar.

Pero antes que nada… ¿Qué es un puntero?

Un puntero, como en C++, es un valor dentro de la memoria que apunta a otro segmento de esta. Por decirlo así es como si hiciéramos un cartel de “Lavabos” y señalamos con una flecha donde están los lavabos XD, la señal en sí es un puntero ya que señala donde están en este caso los lavabos.

El problema viene cuando el sistema operativo utiliza el ASLR que permite aleatorizar el segmento de memoria donde se encuentran los datos con la finalidad de evitar robos de memoria o buffers overflows.

Aquí la pregunta es… ¿Cómo sabe en un espacio aleatorizado donde se encuentran los datos tales como el jugador, los enemigos etc.? Muy buena pregunta, y la respuesta radica en los punteros.

Por decirlo así, un programa guarda de manera dinámica todas las referencias que les interesa. Lo curioso de esto es que para guardar esas referencias, necesita si o si un espacio donde no se vea afectado el ASLR, y ese espacio es donde se guarda el código fuente del juego, ese espacio se llamará Variables Globales.

Como podemos fijarnos en la imagen, el puntero que nos interesa se sitúa dentro del segmento de memoria que no afecta al ASLR, es decir que, si localizamos esa posición de memoria, da igual cuantas veces cierres el juego o lo abras, siempre apuntará en este caso al objeto Jugador.

Una vez explicado esta parte vamos a proceder a realizar la búsqueda de punteros XD

Existen varios métodos para buscar punteros, una de ellas consiste en buscar entre varias snapshots de memoria donde se encuentra en la zona de Variables globales el Objeto que queremos encontrar. No voy a detallar mucho esta metodología ya que lo haremos de una forma más simple y es usando Cheat Engine y su Debugger.

Para ello abriremos el Cheat Engine y buscaremos dentro de la interfaz del juego, un valor que sepamos que, si o si el Objeto Jugador va a tener, en este caso será el HP. Ahora cogeremos el Cheat Engine y buscaremos como tipo Float el valor actual que tenemos de HP que en este caso son 3416 y le daremos a First Scan.

NOTA: En algunos juegos, el HP se suele representar como un valor de 4 bytes sin decimales, pero en este tenemos la mala fortuna de que se represente como un float, para saberlo vasta con probar que, si buscamos el HP como un valor de 4 bytes, no lo encontraremos

Actualmente nos aparecen como unos 35 resultados, ahora procederemos a estrellarnos contra el suelo, añadiremos el nuevo valor pero esta vez en Scan Type escogeremos la opción Value Between… y como el valor que tenemos en pantalla es 2079, los valores serán entre 2078 y 2080, el motivo es que como estamos hablando de valores flotantes, es muy posible que en la interfaz nos ponga 2079, claro no sabemos si en verdad tenemos 2079,2 o 2078,7 así que para asegurarnos pondremos como rango entre el 2078 y el 2080 y efectivamente obtenemos dos resultados, vamos a agarrar estos dos resultados y los ponemos en la parte de abajo:

Ahora para encontrar el puntero vamos a darle Click Derecho > Find out who Access to this address a cualquiera de las dos y para encontrar el puntero tenemos que ver una línea parecida a esto:

MOV Cualquier registro, [registro en ensamblador + número hexadecimal]

En nuestro caso es [EDI + 0xC8C]

Esta línea lo que indica es que está accediendo al valor cuya dirección de memoria es el valor guardado en EDI + un offset C8C que en nuestro caso es la vida actual, si ahora seleccionamos la línea y vemos el registro EDI, esa dirección de ahí es nuestro objeto Jugador.

Como he dicho con anterioridad, este valor va a ir cambiando cada vez que reiniciemos el juego por lo que si queremos el puntero que apunta al objeto Jugador, lo podemos buscar con el Cheat Engine, pero esta vez buscaremos un valor Hex y 4 bytes

Ahora si bajamos un poco veremos una línea que tendría que llamarnos la atención:

Eso que veis es un puntero que apunta a nuestro objeto Jugador, ese puntero es estático, quiere decir que por muchas veces que reiniciéis el juego, si accedéis a ACEOnline.dat + 40F038 siempre encontrareis la dirección de memoria donde está el objeto Player.

Por ejemplo, si quisiéramos hacer un Cheat que accediera a la vida actual del jugador lo que tendríamos que hacer es algo tal que así:

float currentHP = ReadFloat(ACEOnlineBaseAddress + 0x40F038 + 0xC8C);

Y con eso podemos acceder a la vida actual independientemente de que el juego se reinicie (Sería como hacer un “bypass”, “bypass” muy entre comillas, al ASLR XD)

NOTA: En algunos juegos puede que os aparezcan dos punteros (nombre del proceso + offset) Esto es debido a que uno pertenece al objeto Player en sí y el otro es el que pertenece a la lista de entidades (EntityList), que son todos los NPCs, enemigos y jugadores dentro de un mapa, esto es porque en algunos juegos, el primer objeto suele ser el jugador

Dicho esto vamos a empezar a realizar aquellos hacks de la época XD

Modificando la posición del jugador (Teleport Hack)

El primer cheat que hablaremos es el Teleport Hack. El teleport hack se volvió muy popular entre todos los MMORPG ya que consiste en teletransportar a un jugador de un sitio a otro sin necesidad de recorrerlo.

Estos tipos de hacks son bastante sencillos de hacer, pero también muy fáciles de detectar, y para ello necesitamos el lugar en la memoria donde se guardan las coordenadas del jugador.

Como muchos juegos se inventan el sistema de coordenadas como les da la gana, utilizaremos otra característica del Cheat Engine que es buscar valores Unknown, porque de estas coordenadas uno no se puede fiar XD, pero si pueden servir como referencia en el caso de que estemos incrementando la coordenada o reduciéndola XD

IMPORTANTE: Veréis que el puntero del objeto Player ha cambiado, esto es debido a que esto se ha escrito en días diferentes XD

Para ello le daremos a New Scan, en Scan Type pondremos “Unknown Init Value”, Value Type pondremos “Float” y al darle First Scan nos aparecerán un montón de valores XD.

La idea es ir avanzando y retrocediendo, tomando como referencia el valor de las X (Eso lo sabremos gracias a las coordenadas situadas en la esquina superior derecha de la ventana), siguiendo este esquema:

  • Cuando incrementemos en el eje de las X, en Scan Type pondremos “Increased value” y le daremos a Next Scan
  • Luego decrementaremos en el eje de las X, en Scan Type pondremos “Decreased Value” y le daremos a Next Scan
  • Haremos todo el rato lo mismo hasta tener unos pocos valores (menos de 1000 como mucho)

Un ejemplo sería esta imagen:

¿Os acordáis que hemos conseguido el puntero del objeto Jugador? Esto nos puede servir como referencia para descartar todos los valores que estén en una dirección de memoria inferior al puntero, es decir, si el puntero es 0x03A0A1D0, todas las direcciones que aparecen listadas que sean inferiores a ese valor, los descartaríamos, al igual que todos aquellos que sean muy superiores, por ejemplo, los que empiecen por 0x0400000 ya que estoy al 90% seguro de que esa dirección de memoria no pertenece al objeto Player XD, el resultado serían estas direcciones (Unos 16 valores jeje):

Ahora el siguiente paso es ensayo y error, vamos a probar a modificar los valores a ver que pasa, cogemos el primero y… ¡Epaaaa! ¡Algo se ha movido!

Vamos a fijarnos en el valor de las X de arriba y modificamos el valor por, no lo se, 2000 por ejemplo y…

Antes:

Ahora:

Con esto ya tenemos el teleport Hack jaja, ahora para encontrar el eje Y y Z (Que normalmente suele estar al lado) vamos a ir “Click Derecho > Find out what accesses to this address” y nos fijamos en lo siguiente:

Parece que en ESI + 0x20 se encuentra la coordenada X, eso quiere decir que si quisiéramos acceder a la coordenada tendríamos que hacer algo tal que:

float X = ReadFloat(ACEOnlineBaseAddress + 0x40F038 + 0x20);

Bien David, ¿Dónde está Y y Z? Buena pregunta, y normalmente Y y Z suelen estar en los subsiguientes offsets, es decir, 0x28 y 0x30 ya que un float son 8 bytes, vamos a verificarlo creando una nueva dirección de memoria manual y sumaremos 0x28 al puntero del objeto Player.

Si modificamos los valores de este nuevo offset, veremos que nos movemos también por la Y y si sumamos 0x30, pasará lo mismo con el eje Z y con esto ya tenemos un Teleport Hack XD

Si solo modificáramos el eje Z, tendríamos también un Fly Hack (algo que en este juego no tiene mucho sentido porque ya volamos XD)

Reattack Hack y Speed Hack

Tanto el Reattack Hack como el Speed Hack lo voy a hacer todo junto porque el procedimiento para sacarlo es el mismo XD

En este caso es diferente a otros juegos debido a que quien da la velocidad de movimiento es el motor que tengamos equipado, por ejemplo:

Si nos fijamos, el Speed es de 162 a 210 m/s así que vamos a modificar estos valores y para ello en Cheat Engine buscaremos por el nombre del objeto que es en este caso Jet IX [‘27]

Vamos a recoger todas estas direcciones y vamos a ir una a una buscando algo parecido a esta imagen:

Para ello le damos “Click Derecho > Browse This Memory Region”, un ejemplo de algo que NO nos serviría sería algo como esto:

O algo como esto:

Para que quede claro, solo nos sirve aquellas opciones que tengan el nombre del motor y lo que parece ser una descripción (Que coincide con esto XD)

En mi caso me he quedado con estas dos:

Cuál de las dos es? Ni idea XD, pero para averiguarlo vamos a hacer lo siguiente (Atentos porque esto lo haremos también con el Reattack Hack XD):

Vamos a la primera opción y le damos a “Browse this Memory Region”.

Ahora le damos a Tools > Dissect Data Structure

Y ahora vamos a Structures > Define New Structure > OK y ¡Voila!

En este caso lo que acaba de hacer Cheat Engine es definir una estructura haciendo guessing de que valores podría contener dicha estructura y lo ha hecho bastante bien honestamente XD

Fijaos en los valores 162 – 210, voy a modificar el 210 por 999 a ver qué pasa:

Si avanzamos vemos que no pasa nada, vamos a reiniciar el personaje dándole a Main Menu y volver a entrar al mapa a ver si sucede algo XD

Parece que vamos un poco rápidos honestamente XD y con esto tendremos un Speed Hack XD

Vamos a por el Reattack Hack y para ello buscaremos el nombre de los mísiles:

Repetimos lo mismo que con el Speed hack hasta llegar a la siguiente estructura:

Si bajamos un poquito hacia abajo en el offset 0xA3 veremos un 1800

Y si nos fijamos en el Reattack Time del arma veremos esto:

¿No os parece un poco sospechoso (1,80s – 1800) XD? Vamos a modificar esos 1800 en 500, reiniciamos nuestro personaje y que pasará…

Estamos disparando a una velocidad vertiginosa XD, con esto tendríamos nuestro Reattack Hack

NOTA: Como os habéis fijado, a diferencia del Teleport Hack, no os he proporcionado ningún offset porque no lo hay XD. Lo que estamos haciendo en realidad es modificar la base de datos de ítems que está cargada en memoria de manera local y al reiniciar el personaje, los cambios se aplican. En estos casos, si quisiéramos hacer una herramienta que automatice esto, tendríamos que utilizar una búsqueda por patrones, que busque en memoria donde se encuentra el objeto y modifique su valor de manera dinámica (Algo un poco más complejo de hacer XD)

Conclusiones

Como conclusión, hemos repasado los hacks más importantes en la escena de los MMORPG de la época del 2005 XD. Pensad que estos hacks eran posibles debido a que no existían el tema de los Anti-Cheats o estos eran muy básicos.

Como siempre si queréis desarrollar este tipo de cosas hacedlo bajo vuestra responsabilidad y no fastidiéis nunca la experiencia de los demás jeje.

Los siguientes posts hablaremos sobre esta serie hablaremos de ataques a nivel de protocolo montando un Proxy para poder ver e inyectar paquetes jeje

Muchas gracias por leerlo y nos vemos en un siguiente post.

Un saludo y hasta la próxima