viernes, 10 de enero de 2014

El rincón de HighSec: Ganar en el Candy Crush

Compartir este artículo:
Buenas a todos! En este nuevo post vamos a ver cómo sería posible ganar siempre al juego "Candy Crush" en Facebook y vamos a entender cómo funciona esta aplicación por dentro. Hace tiempo leí un artículo sobre esto que después he ido alargando y descubriendo más cosas que se basaban en lo mismo. El artículo sobre el que me base es: http://www.stavros.io/posts/winning-candy-crush/

Bien lo primero, ¿qué es el "Candy Crush"? Pues es un juego al que puedes jugar desde tu cuenta en Facebook o que te puedes descargar para tu smartphone, sincronizarla por ejemplo con Facebook y continuar tu partida. Básicamente el juego trata de hacer combinaciones de colores, cuantos más hagas mejor, y para ello tienes una serie de vidas que se van recuperando (cada partida gasta una vida), y además para cada partida tendremos una cantidad de movimientos máximos. Pero... Descubriremos en este post como hacer este juego muuucho mas fácil para tener resultados como estos...


Así que vamos a empezar, para poder realizar todo es necesario contar con un proxy, yo al igual que en el artículo que os mencione antes voy a utilizar "Charlie" que nunca lo había probado y la verdad que me ha gustado mucho ya que te saca muy en claro las respuestas del servidor en JSON que es lo que vamos a necesitar.

Lo primero que tenemos que hacer es descargar el proxy de la web que sale en la imagen, una vez hecho esto lo arrancamos y directamente se pone a la escucha de todas las peticiones como podemos observar...


Como he dicho este proxy tiene una cosa muy cómoda y es capturar las respuestas que nos devuelve el servidor para poder modificarlas, pero para poder capturar los paquetes y poder modificarlos es necesario que pongamos breakpoints en los dominios de los paquetes que queremos interceptar, para ello hacemos lo siguiente sobre el dominio que queramos (En este caso el del juego)...


Una vez hecho esto comenzara a capturar todos los paquetes que enviemos y recibamos de dicho dominio.


En nuestro caso la mayoría de las veces nos importaran las respuestas del servidor como por ejemplo la siguiente donde podemos ver que el servidor nos está mandando información como la cantidad de vidas que tenemos y demás...

Pues bien, este juego lo que hace son peticiones y con las respuestas en JSON introduce los datos en el juego para que nosotros podamos jugar, por lo que es tan sencillo como cambiar el parámetro "lives" dentro de la respuesta del servidor de 5 por ejemplo a 55 y tendremos 55 vidas. Un detalle importante es que deberemos cambiarlo en cada peticiones que tenga el parámetro vidas ya que si no se produce un error, pero veremos luego como automatizarlo ;)! Como vemos en la siguiente imagen al cambiar el 5 por 55 vemos que...

Pues que tenemos 55 vidas! De esta forma podríamos jugar de forma continua sin necesidad de esperas, pero... El juego seguía siendo un poco aburrido y decidí seguir mirando, tras echar un ojo a las peticiones vi que cuando iniciábamos un nivel nuevo el servidor nos devolvía algunos parámetros interesantes como podían ser la cantidad de colores que había en el nivel, las puntuaciones necesarias para obtener las medallas y algunas cosillas mas, aquí os dejo la respuesta del servidor en un JSON:

{
 "currentUser": {
    "userId": 1660136720,
    "lives":55 54,
    "timeToNextRegeneration": -1,
    "gold": 0,
    "unlockedBoosters": [],
    "soundFx": false,
    "soundMusic": false,
    "maxLives": 5,
    "immortal": false,
    "mobileConnected": true,
    "currency": "EUR",
    "altCurrency": "EUR",
    "preAuth": false
    },
 "levelData": "{\"numberOfStartMovesUntilPiano\":0,\"chameleonCandySpawn\":0,\"pepperCandyMax\":0,\"numberOfPianoStartMoves\":0,\"gameModeName\":\"Classic moves\",\"protocolVersion\":\"0.1\",\"useTotalWeightToTriggerPiano\":false,\"useSplitWeightToTriggerPiano\":false,\"numberOfColours\":4,\"tileMap\":[[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"],[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"],[\"18\",\"18\",\"18\",\"18\",\"18\",\"18\",\"18\",\"18\",\"0\"],[\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"0\"],[\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"0\"],[\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"0\"],[\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"0\"],[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"],[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]],\"licoriceSpawn\":0,\"pepperCandyExplosionTurns\":0,\"licoriceMax\":0,\"mysteryCandyMax\":0,\"mysteryCandySpawn\":0,\"scoreTargets\":[750,2200,3700],\"pepperCandySpawn\":0,\"leftWeightToTriggerPiano\":0,\"moveLimit\":11110,\"randomSeed\":1088126,\"isSpecialColorEnabled\":false,\"weightToTriggerPiano\":0,\"chameleonCandyMax\":0,\"isBalanceModeEnabled\":false,\"rightWeightToTriggerPiano\":0,\"maxDiff\":0,\"portals\":[],\"abTest\":\"true\", \"abTestName\":\"Tutorial_1_a_91136\"}\n",
 "seed": 1385815187810
}

Pues lo que podríamos hacer seria cambiar "numberOfColours" para hacer que en vez de 6 colores nos aparecieran 3 o 4, por otro lado podríamos modificar el "moveLimit" para que en vez de tener solo 10 movimientos podamos tener como vemos en la petición 110. Si modificamos estos parámetros comprobamos que en las pantallas realmente tenemos los colores que queramos y con la cantidad de movimientos que queramos.
Como vemos el juego se ha vuelto mucho más sencillo, pero... Aun tenemos que estar analizando las peticiones y respuestas del servidor, pues vamos a ver cómo podríamos automatiza esto mediante el proxy "Charlie" para que no tengamos que hacer absolutamente nada aparte de encenderlo y "jugar".
Para ello necesitamos habilitar la opción "rewrite" del proxy...

Tras hacer esto nos aparecerán las opciones de re-escribir que tiene el proxy...

Para poner una regla de re-escritura tendríamos que seleccionar "Add", darle el nombre que queramos, y a continuación definir como vemos en la imagen la regla que queramos sobre escribir, en mi caso cuando las vidas sean -1 que las sustituya por 1 por lo que nunca llegaremos a tener 0 vidas, por otro lado siempre le podríamos poner un 5 delante del número de vidas que tengamos, así siempre tendremos entre 50 y 55, es decir ilimitadas ;)

Y de igual forma podríamos sustituir los colores y un largo etc que dejare que busquéis vosotros ya que solo hay que hacer exactamente lo mismo que hemos dicho hasta ahora...

Hasta aquí llega esta PoC donde hemos visto como sería posible cambiar algunos de los parámetros, aunque si probáis veréis que es posible hacer mucho mas como cambiar el tipo de partida, que podemos ponernos la puntuación que queramos al terminar la partida modificando la petición, etc... Pero eso os dejo a vosotros probar!
Espero que os haya gustado y que hayáis visto como es posible modificar la información en aplicaciones de este estilo, ya que he estado investigando y ni mucho menos es el único juego/app que lo hace de esta forma asi que… A probar ;)
Un saludo,
Eduardo - eduardo@highsec.es - @_Hykeos




6 comentarios:

  1. Interesante Edu, desde luego con Charles u otros proxys tenemos un Cheatengine (http://www.flu-project.com/2011/08/modificando-valores-con-cheatengine_24.html) en toda regla, salvando las distancias, para alterar el comportamiento de los videojuegos que requieren información de un server.

    Probaste con algún otro juego? :)

    Un abrazo

    ResponderEliminar
  2. Buenas Juanan! Si, estuve probando algunos mas del estilo al apalabrados y algunos mas de los mismos de Candy Crush, vamos los que salen en la tele, y por ejemplo el Farm Heroes es muy parecido internamente.

    De todas formas para este aun se pueden hacer muuuchas mas cosas como tener todos los bonus y que sean ilimitados y mas.. ;)

    Un abrazo

    ResponderEliminar
  3. El problema es que el Charles proxy la versión sin registrar, a los 30 minutos de estar encendido se reinicia, y que cuando llevas 30 días de la versión trial, ya no funciona más. Claro que 50$, es muy caro...

    ResponderEliminar
  4. Muy buen artículo.
    Jugaba este juego aunque me pudrió en el nivel 400 y monedas.

    Una información interesante sería saber que debería hacer el desarrollador del juego para evitar estos hackeos ¿Mandar el número de vidas cifrados, por ej?
    Muchas gracias, saludos

    ResponderEliminar
  5. Excelente analisis! Muy buen PoC
    Saludos
    Adolfo

    ResponderEliminar
  6. puedes probar con astro garden porfa,ai muchas maneras de settings ,pero no funcionan ,alomejor tu puedes consegir gracias

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...