Sé que tengo la bandeja de borradores con muchos proyectos que terminar, pero entre unos y otros siempre hay que sacar algo de tiempo para la diversión, y que mejor manera que jugando un poco… a modificar juegecillos de Facebook, lo cual se ha ido convirtiendo con el tiempo en algo habitual con lo que suelo entretenerme.

Esta es una de muchas historias que empezaron y terminaron igual. En este caso concreto todo empezó matando cerdos… todo terminó con un marcador lleno de ceros (a la derecha) en el servidor de Rovio (por supuesto a modo de ejemplo, y como es costumbre informaré a los desarrolladores, Rovio en este caso, sobre ello)

La noche de hace un par de días fue un tanto larga… (algunos problemillas febriles sin mucha importancia). Entonces vi el anuncio de que por fin Rovio (la empresa del más que famoso “Angry Bird”) había lanzado el juego en Facebook. Aquí hay que decir que soy un gran fan de los pájaros enojados, y que ambos hemos pasado bastante horas matando el tiempo en lugares en los que tenía simplemente que esperar. Así que aunque no soy proclive a juegos en las redes sociales no pude resistirme a tirar del tirachinas unas cuantas de veces. Aunque parezca un poco curioso, mi cabeza cuando mira una pantalla a veces empieza a pensar un poco más allá y cuando me doy cuenta estoy intentando conocer los secretos más recónditos de lo que estoy mirando. No pude resistirme, y entre tanto matar cerdos comencé de nuevo a lanzarme esas preguntas de siempre: “Habrán hecho bien los deberes el equipo de Rovio encargado de Facebook?” “Será relativamente seguro o por otro lado será otro coladero de fallos de seguridad como tantos otros de Facebook?”. Antes de darme cuenta ya estaba jugando con editores de memoria RAM y buscando la aplicación Flash en ella.

Unos se divierten jugando, otros intentando ser simplemente los mejores en esos juegos, otros simplemente son felices por poder hacer trampas en ellos!! Yo por mi parte soy de los que se divierte jugando sin más y encontrando problemas en el código que hacen que sea inseguro o que facilitan el trampearlos. Es bonito ver como, una vez más, aplicando simplemente teoría, imaginación y tiempo todo es posible. Por supuesto no tiene nada de especial ni demasiada complejidad para muchos ser capaz de hacer “trampas” en juego Flash, la importancia es que esto tan solo es un juego, pero pone de manifiesto que cualquier aplicación tenga detrás el equipo que tenga está siempre expuesta a todo tipo de asaltos!! Y ningún sistema es impenetrable si se ponen los medios necesarios, un poco de cabeza, ingenio y tiempo. Las limitaciones generalmente tan solo existen en las ideas de las personas. Si tienes una idea y esta es buena, más del 50% estará terminado, el otro 50% será ponerla en práctica. Y por supuesto si todo falla, volver atrás,. replantearse de nuevo el problema y atacarlo por otro costado, y de nuevo volver a empezar tantas veces haga falta hasta lograrlo.

 

Los chicos de Rovio sin duda alguna pusieron las cosas relativamente complicadas en muchos aspectos, no obstante en otros se dejaron llevar quizás por el descuido o por la desgana o incluso por creer que ciertas medidas eran suficiente. Veamos con lo que me encontré:

 

-Búsqueda simple de valores

La primera idea aunque sea lo más simple y rápido de hacer, sin contar que disponemos de programas tipo CheatEngine que hace que sea trivial, no deja de ser lo primero que hay que hacer, a fin de cuenta igual funciona, y sino tal vez modificando el proceso un poco es posible. En este caso concreto, Rovio ha cerrado bien esta posibilidad, y tiene bien protegido el marcador de puntos frente a modificaciones puntuales en RAM de los valores. Sí, es posible encontrar los puntos y modificarlos, pero rápidamente cualquiera vería que es una vía muerta en principio, estos vuelven a restablecerse de inmediato.

La segunda idea consta de echarle algo de más imaginación al asunto y tratar de buscar otros posibles valores igualmente importante que puedan ser relativamente simples de encontrar/buscar y que Rovio hubiese podido pasar por alto, por ejemplo los puntos que da el destrozar un cerdo, un muro… el problema de este sistema es que encontrar el valor es algo más fatigoso dado que no es un valor dinámico como los puntos del jugador, sino que es un valor fijo, y con que existiese en la memoria Virtual del proceso unas cientos de ocurrencias de dicho valor seria casi imposible conocer cual es el que está fijando los puntos de aquello que queremos modificar… y eso siempre sin contar con que pueden ser valores “protegidos”. De cualquier modo, tampoco fue algo exitoso, los valores no fueron muy complicados de encontrar, pero igualmente inservibles, con algún tipo de doble protección para impedir su modificación.

 

-Decompilación de la aplicación Flash

Una de las formas más eficaces es echar mano de nuevo a los decompiladores de Flash. Obtener la aplicación Flash es fácil, aunque esta está partida en varios trozos: El juego principal, el entorno (compras, contactos…), el sonido, otra de sonido y los créditos. En particular podríamos comenzar por lo que sería el juego principal:

http://angrybirds-facebook.appspot.com/20120216-1322/flash/AngryBirdsFacebook.swf

 Evidentemente si accedemos directamente desde un navegador no podremos alcanzar dicho archivo puesto que está diseñado para ser cargado de otro modo. No obstante, si podemos utilizar dicho enlace en cualquier gestor de descargas, o en el mismo Firefox deshabilitando la ejecución automática de contenido Flash.

A este punto los chicos de Rovio cometieron dos errores. El primero es no proteger mejor la aplicación principal, como vimos en Towner es posible y una práctica muy aconsejable el cifrar el flash totalmente, y que sea un loader el que llama directamente el archivo flash (cifrado) y se encarga de su descifrado antes de cargarlo en RAM. En el caso de Towner el problema estaba que para el cifrado usaron una simple función XOR con un valor preestablecido que era inmediato adivinar. Es cierto que el contenido flash se sirve comprimido, pero actualmente existen multitud de herramientas para convertir un flash CWS (comprimido) a uno FWS (sin comprimir)

El segundo error es usar texto plano inteligible en la propia aplicación Flash una vez descargada, sin necesidad siquiera de decompilar. Esto hace que aplicaciones como Flasm sean muy útiles en estos casos.

Independientemente de las dos fallas bastante importantes de Rovio, estas podrían haber sido de todos modos sorteadas, como por ejemplo accediendo a RAM directamente y sacando de ella la imagen de la aplicación Flash descomprimida y descifrada, pero desde luego sería una capa de seguridad bastante importante. No se trata de crear a fin de cuenta el sistema invulnerable (que es imposible), sino de hacerlo lo más complicado que se pueda… sin repercutir por supuesto en usabilidad o rendimiento

Una alternativa efectiva y casi definitiva sería decompilar la aplicación Flash, modificarla a nuestro antojo, recompilarla, y usar apache en nuestro equipo para redireccionar las peticiones de la aplicaicón a nuestro equipo, de este modo estaríamos “inyectando” la aplicación modificada por así decirlo cada vez que la usásemos. Los servidores de Rovio no notarían nada extraño y casi con toda seguridad los datos se validarían correctamente.

En esta ocasión no llegué a realizar dicha práctica, no me hizo falta.

 

-Realizar un Spoof de los datos enviados de vuelta al servidor

Por desgracia para Facebook y para muchos usuarios, este no obliga de forma rotunda el uso de TLS/SSL a través de toda su plataforma, tanto de sus propias páginas como de las aplicaciones que se hospedan. A día de hoy debería de ser una obligación y no una alternativa, sobre todo cuando lo que están circulando de un lado a otro son nuestros datos. En cualquier caso, es posible ejecutar la aplicación a través de conexiones no seguras, y por tanto es fácil ver todo lo que pasa de una red a otra. Esto no quiere decir que sea posible modificar las peticiones de la aplicación hacia sus servidores ojo, pero si es una opción que puede meditarse, y tampoco pasa nada por tenerlo en cuenta.

En este caso concreto tampoco fue algo a lo que me ceñí, pero siempre es un buen punto de partida

 

-Traceado del código

En el último lugar de la lista de opciones viables (que sean confesables), siempre está el tracear el código que se está ejecutando en RAM. A fin de cuenta un contenido flash no es más que una aplicación que se ejecuta a través de una máquina virtual, a la cual puede adherirse un debugger. Una vez que tenemos una aplicación conectada a un depurador, podemos si queremos ver que instrucciones, posiciones de memoria y otros se están ejecutando. ¿Que sentido tiene este método?

Los datos pueden cifrarse o camuflarse, pueden usarse funciones que enmascaren sus valores o implementar rutinas para proteger las partes más sensibles del código. Pero del mismo modo si conocemos donde están estos datos podemos realizar un traceado inverso para saber que funciones o que operaciones se están realizando sobre esos datos. Si tenemos el código desensamblado Flash por otro lado mejor que mejor por supuesto, puesto que tendremos una visión mucho más amplia.

Es decir, con programas tipo CheatEngine o cualquier otro monitor de RAM es fácil encontrar valores concretos, pero no le uso que se le dan. En este caso concreto, es fácil encontrar ciertas posiciones de memoria (10 creo que eran) donde se almacenan los puntos en teoría, pero como comprobamos anteriormente no tenían efecto el modificaros. Pues bien. podemos partir de ello y realizar un traceado inverso, averiguando que instrucción o instrucciones están accediendo a dichas posiciones de memoria para escribir en ellas esos datos. Este procedimiento realizándolo un par de veces, rápidamente nos hace encontrar dos o tres instrucciones en ensamblador que modificándolas al aire resulta en un completo éxito.

Imaginad que las posiciones de memoria en las que se almacenan los puntos fuesen la 0x00-0x0A. Si vigilamos dicha posición de memoria y analizamos que instrucciones tienen acceso a ellas, nos damos la sorpresa que tan solo un par de instrucciones son las que escriben en ellas. Si no podemos controlar el valor que se escribe porque no es un valor “real” pro así decirlo, si podemos controlar la instrucción que da la orden de escritura en dichas posiciones. Modificando simplemente un registro llegado dicha instrucción se obtiene lo deseado. Por supuesto tenemos una gran colección de depuradores al alcance de cualquiera, desde Windbg, como Ollydbg, IDA… el propio CheatEngine puede usarse en parte para este tipo de cosas también.

Otra opción realmente interesante sería el simplemente deshabilitar rutinas/funciones de protección que se usan para enmascarar los datos. Esto es muy sencillo dado qeu muchas veces tan solo hay que sobreescribir la instrucción en ensamblador por operaciones NOP: 0x90. De echo, esto mismo es lo que se hace muchas veces en parches típicos de programas para “activarlos”. Imaginar que toda la rutina de verificación de una aplicación se rellenase con operaciones NOP, la rutina simplemente dejaría de tener utilidad. Normalmente si si se puede puede producirse lo mismo modificando la condición de un salto condicional (que se aplica del mismo modo a la aplicación flash en cuestión.

Este fue el primer sistema con éxito que probé, que fue el el segundo en poner en práctica (el primero fue la búsqueda de valores por supuseto). Lo bueno de este método es que si se comprende bien puede aplicarse prácticamente a cualquier otra aplicación existente, ya sea Flash o de escritorio. Lo malo del proceso es que no es algo tan intuitivo, y hay que saber un poco más sobre el funcionamiento interno de nuestros equipos. Además, no pueden evitarse de forma simple. Y aunque Rovio implementa algunos sistemas de protección para ello, con los cuales por cierto me topé unas cuantas veces: “Opps, error con el servidor refresque la página”, fue posible circunvalarlos.

La única opción para evitar este tipo de técnicas por parte de Rovio implicaría el uso de detectores de Debuggers en el propio código de la aplicación, rutinas cebo y de trampa para engañar al usuario y cosillas varias. Y siempre por supuesto protegiendo antes toda la aplicación Flash a una eventual decompilación, dado que esta podría darnos código directamente escrito en Action Script, bastante más simple de comprender que código en ensamblador. Con todo el código Action Script por delante es posible crear aplicaciones pequeñas como vimos con Towner para modificar lo que quisiésemos.

 

No obstante en este caso concreto es posible realizar un sistema aun más simple y fácil de los expuestos para obtener éxito en la tarea de modificar lo que deseemos, por ejemplo el marcador de un nivel. Este “sistema” es más ingenioso que técnico y la verdad se me ocurrió más tarde de todo lo anterior… cuando en realidad es más simple. Precisamente por su simpleza prefiero no exponerlo públicamente y evitar que cualquier lector le pique más las ganas de hacer trampas que de investigar y aprender, y ya sabéis que se trata de aprender y de tirar de las orejas y poner un poco colorados a los responsables, Rovio en este caso.

En cualquier caso tengo que decir como ya he dicho que soy fiel a la matanza de cerdos a pajarrazo, un juego adictivo y original. Por no decir que cuando terminé de “hackear” (nunca me ha gustado dicha palabra) el juego, las siguientes par de horas fueron dedicadas a conseguir todas las estrellas de los niveles abiertos actualmente, eso sí, sin trampas… bueno, exceptuando aquellos niveles en los que estaba probando todo lo comentado anteriormente, como me sucedió por ejemplo en el primer nivel de todos… en el que sinceramente se me fue un poco la mano… es lo que tiene muchas veces modificar sin estar seguro al 100%… el resultado a veces es… inesperado, y sí,el servidor aceptó por buena la puntuación (por supuesto he eliminado de la imagen las caras de los perfiles, y sí, es 1 millón y pico, siendo la segunda mejor puntuación de algo más de 30.000):

 

Un saludo amigos