Como hacer trampa en TeaGames
www.teagames.com 

 Hace tiempo, estuve jugando en teagames.. logre terminar todos los niveles de Blueprint. Y no logre estar en la lista de top scores.. por aburrimiento, o simplemente porque si, descomprimi el SWF, realmente son 3 SWF, uno que llama a otro.. sinembargo esa es la unica proteccion que tienen sus juegos, una ves que lograste pasar al ultimo, ya lo tienes todo y puedes subir el juego a tu propia web, o lo que quieras.

Sin embargo tenia un problema.. cuando se mandaban la puntuacion se encriptaba, y no encontre la funcion.. mi teoria, es que el programa que use para desencriptarlo, no descomprimio todo.. podria haber tratado de usar algun otro.. pero senti que seria mas divertido hacerle cripto analisis.. asi que deje el swf de lado, y..

Regrese, jugué por unos 10 minutos, despues simplemente deje caer las pelotas.. y perdí.. estaba usando Mozilla Firefox con la extension "Live HTTP Headers", y vi que fue lo que se mando al servidor.. ahi vi que se llamaba al archivo blueprint/backend.php con un numero aleatorio en la URL y con algunos datos en metodo POST.. uno era "x" y tenia algo que en ese momento crei que era un hash MD5, incriblemente por pura casualidad tenia 32 caracteres.. esa casualidad costo algunas horas perdidas.. en fin.. otro especificaba de que etapa del juego era la peticion, si era el inicio o el fin.. uno mas llamado onload que no se para que es.. pero bueno xD

Era algo asi..

 

POST /games/blueprint/backend.php?r=98558513 HTTP/1.1
Host:
www.teagames.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; es-AR; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: es-mx,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Cookie: PHPSESSID=9d361832a63867d8b79aab3264c7c7a5
Content-type: application/x-www-form-urlencoded
Content-length: 75

x=a7a771a0e1d0d3ccd6a1a5a20484&command=endgame&onLoad=%5Btype%20Function%5D

 

Bueno.. ese no es el que vi esa ves, ese es uno ya generado por mi, para ponerme en primer lugar.. Realmente uso muchas cabezeras que no necesito, pero para evitar ser detectado, puse todas.

Lo importante era la variable "x".. que ahora tiene 28 caracteres, pero en su momento, y en la que capture eran 32.. en fin..

 

Pirmero, yo que estaba plenamente convencido que era un hash MD5, lo que me llevo a tomar los pasos erroneos unas cuantas horas.. por ejemplo, use md5cracker y lo deje en 4 pc's corriendo, ademas lo subi para que se iniciara la busqueda en miles de diccionarios o directorios que hay.. obviamente no encontre nada..

Bueno, dije.. debe estar empacado o codificado o se le esta haciendo algun md5 a un md5 o es el md5 de un sha-1.. realmente creia que era un hash.. ademas de que estaba haciendo un cracker que se aprovechara de los datos que ya sabia como, el usuario y la puntuacion.. hasta que decidi.. simplemente hacer algo mas sencillo, como ponerme de usuario "a" y dejarme de puntuacion "5" asi deberia ser mas sencillo, y podria ser detectado mas rapido.

Cual fue mi sorpresa cuando veo que el que yo crei que era un hash no tenia 32 caracteres.. y pues tristemente desperdicie horas de trabajo.. en fin, ahora me dedique a obtener datos.. muchos datos.. llegue a jugar unas 50 veces.. y perder y obtener la puntuacion que yo queria tardaba.. sobre todo si olvidaba poner un boton o me pasaba, etc.. sin embargo, obviamente descubri un patron.. muy interesante.

Primero.. 20 resultados eran del usuario "a", 10 eran de "aa" , 5 de "aaa", 5 de "asdf", 3 de "abc", 2 de "xyz", y 5 de "sirdarckcat"..

Bueno, el usuario "a" es el que me ayudo a descubrir que sucedia con la puntuacion, se veian secciones que no cambiaban, y 2 secciones que si cambiaban, pero  no cambiaban, incrementando, sino lo que parecia un patron al azar.. Poco a poco vi que estos numeros al azar tenian un patron, se repetian cada 16 posiciones (16 porque usamos hexadecimal :P), lo que los hacia no al azar xD, ahora, dado que solo secciones del codigo cambiaban, debe ser un tipo de criptografia clasica, y muy debil, por lo que lo primero que se me vino a la mente era modular, sinembargo el hecho de que el patron no tuviera distancias entre valor y valor iguales o al menos equivalentes, me hizo cambiar de idea, lo que se me ocurrio despues, fue que era un XOR, y pues solo hice:

P^S

Donde P es mi puntuacion, y S el valor que cambiaba constantemente.

El primer valor que cambiaba, me daba resultados super extraños, pero el segundo, me daba:

A5A5A5A5

Es decir, estaba XOReado con A5.

Ahora solo desXORie el resto del codigo.

y me salio algo asi:

0201020197040005

Mi usuario era "a" y mi puntuacion "5"

a tiene valor en ASCII de 97, por lo que ese 97 era mi nick, y ese 5 era mi puntuacion..

Ahora este es el codigo desXORiado con puntuacion 5 y usuario "aa"

020199029797040005

Como vemos, cambian pocas cosas.. lo mas importante esta en negritas.

el 9797 es porque agregue una a extra, y el 0005 es porque mi puntuacion sigue siendo 5.

Ahora este es el codigo desXORiado con puntuacion 10 y usuario "a".

0201120197040010

Como mi usuario es a, solo hay un 97, y como mi puntuacion es 10, la segunda parte cambio a 0010.


Bien, ahora vamos con las otras partes que cambiaron, pero ejemplo:

020199029797040005  usuario=aa&puntuacion=5

0201020197040005  usuario=a&puntuacion=10

noten, como al agregar una letra, el numero incrementa en uno.. este equivale a la longitud del nick.

Lo que me hace descubrir..

020199029797040005

0201020197040005 

ese 4 debe significar la longitud de la puntuacoion.. aunque ese dato es constante :P

Y el primer 2 debe significar la longitod del primer parametro, que veremos a continuacion.

por lo que este programa funciona de la siguiente manera:

[LONGITUD][DATOS][LONGITUD][DATOS][LONGITUD][DATOS]

Puede ser que con los datos que les he dado no tenga mucho sentido lo que les digo, pero para su mejor entendimiento, los codigos que les mande los converti a decimal, ya que antes estaban en hexadecimal.

en hexadecimal tienen algo asi:

 a7????a4??a1????????

que  desxoreado es:

02????01??04???????? 

cada byte es representado por dos numeros hexadecimales.

Bien.. ahora lo unico que nos falta es descubrir que es este primer dato.

este es un checksum.. simplemente, debemos de sumar el valor de las letras del nick, y sumarle la puntuacion modulo 255..

y.. señores eso es todo.. 

nos deja algo asi:

([LC][CHECKSUM][LN][NOMBRE][LP][PUNTUACION])^A5

Con esto podemos generar nuestro propio codigo. :)

Despues por medio de netcat o telnet podemos emular las cabeceras de un navegador, tomando como plantilla el que puse al principio.

1.- ¿porque hago publica esta informacion? 

R.- Porque encontre un metodo mas sencillo de cambiar la puntuacion :P

R.- Porque TeaGames cree que baneando una IP va a detenerme xDD.

R.- Porque no es justo que yo sea el unico que sepa.

 

2.- Esto no es un blog, no puedes dejar comentarios.. pero cualquier cosa mandame un mail, a sirdarckcat @ gmail . com

3.- Esto lo descubri, con el uso de Mozilla Firefox, LiveHTTPHeaders, SWFDECOMPILERy mi imaginacion :P

4.- La clave es valida para todos los juegos de teagames, solo que cambia el archivo que guarda las puntuaciones, y el nombre de la variable.. no me mandes un email preguntandome como obtenerlo, lee lo que hice yo, y te daras cuenta. 

Att.
SirDarckCat
elhacker.net