Muy buenas a todos, esta vez vengo con un post acerca del Gamehacking. Todo esto del Gamehacking siempre me ha llamado la atención ya que soy muy fan de los videojuegos, es por eso que he decidido revivir mi infancia intentando hackear un videojuego que jugaba llamado ACEOnline
ACEOnline o también conocido como Airrivals, es como bien he dicho un MMORPG de aviones de combate estilo cyberpunk desarrollado por Masang Soft, una empresa sur coreana.
La distribución del juego es un tanto especial xD, en aquella época, estamos hablando del 2011 no existía esto de Amazon, Azure o Google Cloud, por lo que si tu MMORPG quería expandirse, necesitabas si o si proveedores externos que quisieran alojar el juego en sus servidores. En el caso de Estados Unidos, la empresa que alojó dicho juego fue Subagames y en Europa Gameforge 4D, este último cambio el nombre de ACEOnline por Airrivals, más adelante se unió para Latino America Axeso5 como distribuidor.
Es curioso porque hoy en día, cualquier empresa puede levantar un servidor en cualquier parte del mundo independientemente de donde esté ubicada por lo que no se necesita un proveedor externo que opere en una región en concreto xD pero bueno, los tiempos cambian.
En aquella época, el tema de servidores privados estaba en su máximo auge cobrándose víctimas como World Of Warcraft, Metin2, Aion o Lineage 2, por eso ACEOnline no fue la excepción xD. Después de un hackeo que hubo en unos servidores de Vietnam, creo que quien se encargaba era en aquel entonces Garena, se liberaron los ficheros oficiales encargados de levantar un servidor de ACEOnline lo que provocó una oleada de servidores privados y foros dedicados a ellos.
Han pasado 12 años más o menos desde que filtraron esos ficheros por lo que en este post lo que haremos será levantar un servidor privado e intentar ver que técnicas anti cheat tenían y porque no intentar buscar alguna vulnerabilidad dentro de estos ficheros.
Recalco, han pasado 12 años desde que se filtraron estos ficheros por lo que afirmo al 100% que muchas de estas vulnerabilidades están mas que parcheadas en el juego oficial así que dudo mucho que las técnicas mostradas aquí funcionen xD. No obstante, este post es puro informativo y su objetivo es puramente didáctico, no me hago responsable si se hace un uso indebido contra servidores oficiales.
Todos los ataques se hacen desde un entorno privado y seguro sin alterar los servidores oficiales ya que eso conllevaría un delito, igualmente no voy a mostrar los pasos para iniciar un servidor de este estilo, quien quiera que lo busque (Google es tu amigo xD)
Iniciando el juego por primera vez
Es importante recalcar de que, en este post, a pesar de que los ficheros originales estén públicos, no usaremos exactamente la versión oficial de estos ficheros si no que usaremos una versión modificada que añade ciertas mejoras de rendimiento tanto por la parte del servidor como la parte del cliente. Esto es debido a que el juego es tan antiguo que para que funcione correctamente necesitaríamos un Windows 7 xD. Esta nueva actualización añade soporte a Windows 10 por lo que mejor para nosotros.
Al abrir el juego y poner nuestras credenciales, la primera pantalla que nos aparece es esta:
Después de este toque de nostalgia que me ha venido tras escuchar la música del juego, tenemos que elegir qué tipo de nave queremos, podemos elegir entre:
- I-Gear: Un caza de combate, se caracteriza por ser rápido
- B-Gear: Un bombardero, su principal cometido es destruir gente a misilazos
- M-Gear: Una nave de soporte: Cura, teletransporta, da bufos, vamos hace cosas de soporte xD
- A-Gear: Típica torreta destroza todo te plantas en el suelo, y empieza a disparar a todo lo que se mueva xd
En mi caso me gustan los combates rápidos por lo que escogeré el I-Gear xD
Ya dentro del juego vemos todo lo característico a un MMORPG (Árbol de habilidades, Tiendas, Chat etc). Lo primero que hace un jugador son las misiones a modo tutorial que existen, una vez completadas eliges una facción con el fin de destruir la facción contraria.
Después de jugar y recordar viejos tiempos, vamos a ponernos manos a la obra y lo primero que vamos a hacer es abrir el Cheat Engine para… ¡¡¡Vaya!!! ¡¡¡El juego se ha cerrado!!!
Intentando usar el CheatEngine en el juego
Parece ser que nos encontramos ante el primer mecanismo anti-cheat que tiene, ya que nos aparece una cajita de texto diciendo que estamos usando el Cheat Engine, asi que vamos a coger IDA Pro y pongámonos manos a la obra xD
Si vamos al directorio del juego nos encontraremos algo como esto:
Al principio podemos ver que no hay ningún ejecutable (En otros casos puede que haya un .exe por ahí perdido) pero ese ejecutable no es el juego en sí. El juego es otro fichero dentro de la carpeta.
Si nos fijamos en la imagen hay dos ficheros que deberían levantarte al menos una ceja y esos son:
- Launcher.atm
- ACEOnline.dat
Si abrimos el Launcher.bat nos aparece lo siguiente:
Al parecer este bat ejecuta el Launcher.atm con una IP (En este caso es mi IP de la máquina virtual xD)
PD: No os voy a mentir, esto es una manera cutre de ejecutar el launcher del juego xD, lo suyo sería un .exe bien bonito donde el usuario le de click y misteriosamente salga la pantalla de login no un triste .bat xD
Os voy a ir adelantando y deciros que ACEOnline.dat es realmente el juego, aunque no lo parezca, es realmente un ejecutable solo que han cambiado la extensión para que sea un poquito más difícil de encontrar por lo que abriremos con IDA Pro ese fichero.
Cuando tenemos un binario en este caso sin cifrar, lo primero que hay que mirar son los strings por lo que iremos a View > Open Subviews > Strings y buscaremos el mensaje que nos apareció antes.
El string parece que es utilizado por la función sub_45B690 así que vamos a hechar un vistazo a ver que hace esa función:
Para hacer la vida un poco más fácil vamos a generar el Pseudocodigo de esta función para ver que hace:
Ahora se entiende mucho mejor. Al parecer esta función lo que hace es mostrar un mensaje por cada vez que detecta alguna herramienta de cheating. Si nos fijamos se le pasa un parámetro llamado uType y en función del uType se selecciona el mensaje de error.
Lo que mas me llama la atención es el __loaddll que aparece, yo creo en mi opinión que IDA se le ha ido la pinza y ese __loaddll es en realidad un exit(). Si indagamos un poquito vemos que efectivamente se trata de un ExitProcess por lo que cambiaré el __loaddll por un exit.
Una vez arreglado el tema de símbolos que resuelve IDA (Seguramente hay alguno mas por ahí) vamos a editar el nombre de la función por algo así como AC_PrintMessageBox para tener la referencia y vemos que esta función es llamada por EnumFunc, asi que vamos a ver que hace.
PROTIP: Cuando hacéis reversing de un software, si entendéis la funcionalidad de la función, intentad buscar un nombre acorde a lo que hace dicha funcionalidad para luego acordaros xD. No tengáis miedo de ir cambiando nombres a las funciones porque os será más intuitivo.
PROTIP2: Otro consejo que os doy para poner nombres (sobre todo si hacéis reversing en aplicaciones JAVA) es fijarse en los mensajes que el desarrollador escribe cuando hay excepciones. Para hacer un correcto tracking, normalmente ponen mensajes estilo “Function DecryptSomething IO exception” o parecido, con eso ya puede daros pistas de como se llama la función
Como se puede ver en el grafo generado por IDA Pro, la función es bastante grandecita y aunque generemos el pseudocodigo, hay muchas cosas que debemos de analizar previamente, pero lo que se puede hacer es buscar una parte que si conozcamos, y lo único que conocemos es la función que habíamos analizado anteriormente por lo que partiremos nuestro análisis desde ahí y veremos que es lo que hace cada parte, en este caso está en este fragmento de código.
Aunque parezca complejo de analizar en verdad tenemos muchas pistas para saber que está pasando, la primera de ellas la da ese parámetro i.
IDA no pone i porque le apetezca, lo pone porque estamos dentro de un bucle for, asi que vamos a buscar ese for que justifique esa variable i y lo encontramos exactamente aquí:
A pesar de que vemos cosas raras, antes de llegar al for, lo que sabemos es que itera sobre un array de 7 elementos y fijaos que hay mas arriba:
¡¡¡Vaya!!! Hay 7 elementos que coinciden con los strings:
- Cheat Engine
- ArtMoney
- AI Robot
- Macro Recorder
- AutoHotKey
- Injector
- Injection
Esta claro que el pseudocodigo, si lo limpiáramos seria algo como:
Una vez clara esa parte tenemos que ver que hace con la lista de cheats y ahí una pista interesante, a ver si la llegáis a descubrir:
¿No hay algo que os llame especialmente la atención? Efectivamente, se que muchos lo habéis visto y es ese GetWindowTextA().
GetWindowTextA es una API en Windows que sirve para obtener el nombre de las diferentes ventanas que tienes abiertas.
Por ejemplo, si yo llamara a GetWindowTextA contra IDA, esta función me devolvería el string “IDA – ACEOnline.dat.idb (ACEOnline.dat) …”
Que sacamos de esto, que seguramente esta función lo que hace es iterar en todas las ventanas en busca de algún titulo que contenga alguno de los nombres en el array que habíamos definido, sería algo tal que así:
Os voy a ser sincero, me he inventado un poco el C++ para que se entienda xD, no me lo tengas en cuenta jaja
Uno puede preguntarse ¿Oye y como lo hace la función para sacar todas las ventanas que tienes abiertas? En ningún momento hay un bucle o algo que enumere todas las ventanas o procesos.
Efectivamente tienes razón, pero esto es debido a que esta función es un callback. Si indagamos un poco vemos que quien ejecuta esta función es EnumWindows()
EnumWindows() es una función dentro de la API de Windows que se encarga de ir ventana por ventana ejecutando la función de callback que le pases por parámetros, con esto sabemos como funciona este primer anticheat, ahora falta bypassearlo.
En este caso bypassearlo es bastante sencillo, vasta con cambiar el nombre de la ventana de Cheat Engine por cualquier otra cosa, como, por ejemplo, “Programa 100% Legit”
Yo usaré un programa llamado Windows Title Changer by MurGee.com, podeis utilizar el que queráis, lo importante es que permita cambiar el título de las ventanas
Una vez hecho eso ¡Voila! Ya podemos ejecutar Cheat Engine y attachearlo al proceso
En el siguiente post hablaremos sobre como parchear el binario de manera definitiva para no tener que estar cambiando el nombre del programa xD
Hasta la próxima 🙂