Cómo construí el mejor truco de Candy Crush de todos los tiempos

Cómo construí el mejor truco de Candy Crush de todos los tiempos

POR JOE LEVY  


optad_b

Después de recibir mucho interés en Trivia Cracker , una extensión de Chrome que te permite hacer trampa en el juego popular Grieta de trivia , Decidí que sería interesante ver si existían los mismos tipos de vulnerabilidades en otros juegos populares. Dada su loca popularidad, el primer juego que pensé investigar, por supuesto, fue Candy Crush .

Para aquellos de ustedes que viven bajo una roca, Candy Crush saga es un juego de rompecabezas de tres en raya para Facebook , iPhone y Android, lanzados en 2012. Aunque se trata esencialmente de un nuevo diseño Enjoyado , Candy Crush ha logrado montar en las listas de tiendas de aplicaciones 'más populares' a diferencia de cualquier juego anterior. Incluso ahora, tres años después de su lanzamiento, es todavía va fuerte como una de las mejores aplicaciones en las tiendas de aplicaciones de iOS y Google Play. Y eso sin mencionar la locura 75 millones de me gusta   Candy Crush ha acumulado en Facebook.



Dada su popularidad, uno pensaría que los desarrolladores de un juego tan pulido y exitoso podrían haberse tomado el tiempo para implementarlo de una manera segura contra las trampas. Pero, resulta que escribir un código para engañar Candy Crush en realidad es bastante simple. Como con Grieta de trivia , en el transcurso de un fin de semana pude escribir y lanzar una extensión de Chrome, Galleta Candy Crush , Que me convirtió de un mediocre en el mejor de los casos Candy Crush jugador a una trituradora de caramelos como un dios. Puedes ver Candy Crush Cracker en acción a continuación, donde lo uso para obtener vidas extra y superar niveles con cualquier puntuación que desee:

Entonces, ¿qué pasa con Candy Crush saga ¿Cuál es la implementación que me permitió crear tan fácilmente una herramienta que permite a cualquiera hacer trampa? En resumen, batir un nivel en Candy Crush es tan fácil como enviar una solicitud al Candy Crush servidor diciendo que superaste el nivel. Incluso puede enviar una puntuación, cualquier puntuación, para decir que superó el nivel con esa puntuación. Los detalles de la vulnerabilidad, cómo la encontré y cómo construí una extensión de Chrome para aprovecharla se encuentran a continuación.

Como hackear Candy Crush saga

1) Encontrar la vulnerabilidad

Muchos de mis amigos son Candy Crush fanáticos, logrando puntajes y alcanzando niveles que nunca podría naturalmente. Pero mientras mi Candy Crush Las habilidades me han fallado continuamente, pensé que tal vez mis habilidades de ingeniería inversa podrían llevarme a nuevas alturas de aplastamiento de dulces. Sospeché que podría ser posible enviar mis propias solicitudes a Candy Crush Servidores, o utilizar algunos datos en las respuestas enviadas al cliente desde Candy Crush Servidores, para obtener una ventaja en el juego. Entonces, comencé a investigar qué tipo de datos Candy Crush el cliente y el servidor se intercambian.



Para inspeccionar estos datos, seguí el mismo proceso que con Grieta de trivia . Yo jugué Candy Crush en mi navegador en Facebook , mientras registra e inspecciona las solicitudes y respuestas enviadas entre Candy Crush Cliente y servidor, utilizando una herramienta que había creado anteriormente llamada Gargl . Sí, sé que podría haber usado Fiddler o Charles o las herramientas para desarrolladores de Chrome para hacer lo mismo. Decidí usar Gargl en su lugar porque, además de permitirle ver las solicitudes / respuestas del cliente / servidor, Gargl también le permite modificar y parametrizar estas solicitudes, y luego genera automáticamente módulos en un lenguaje de programación de su elección para que pueda realizar estas mismas solicitudes. sin escribir una línea de código. Pero más sobre eso más adelante.

De todos modos, después de contar Gargl para empezar a grabar e ir a Candy Crush en Facebook en mi navegador, el primer paso fue averiguar con cuál de las muchas solicitudes enviadas en esta página de Facebook estaban relacionadas Candy Crush , frente al propio Facebook. La inspección del HTML en la página mostró que el Candy Crush El contenido flash está incrustado en Facebook a través de un iframe. El elemento justo encima de este iframe era un formulario destinado a publicar en una URL peculiar: https://candycrush.king.com/FacebookServlet/ .

Joe Levy

Sabía que King es la empresa que crea Candy Crush saga , así que sospeché que este es el dominio donde Candy Crush está alojado. El siguiente paso fue comenzar a jugar Candy Crush , y mientras jugaba a mirar las solicitudes, Gargl encuentra que la página está haciendo a cualquier URL que contenga 'king.com':



Joe Levy

Mientras supero los niveles en Candy Crush , Noté que parecía emitirse una nueva solicitud para cada nivel. Las solicitudes parecían emitirse justo después de completar con éxito un nivel:

Joe Levy

Entonces, al parecer, tal vez el cliente le dice al Candy Crush servidor cuando termina un juego. Esto me hizo pensar que tal vez el cliente no solo dice que el juego ha terminado, sino que también dice si el usuario superó el nivel o no, y si el nivel fue superado, con qué puntuación el usuario superó el nivel.

Pensé que tenía una pista y profundicé en los detalles de esta solicitud de 'gameEnd'.

2) La vulnerabilidad en detalle

Utilizando Gargl para ver el archivo “candycrush.king.com/api/gameEnd3? solicitud / respuesta en detalle, pude confirmar que efectivamente le dice al servidor cuando el juego termina y la puntuación con la que el usuario superó el nivel:

Joe Levy

Como puede ver arriba, la solicitud enviada al servidor contiene, como un parámetro de cadena de consulta, un objeto JSON que contiene la puntuación con la que se superó el nivel, la ID del nivel que se superó, así como un montón de otra información. El nombre del parámetro de la cadena de consulta es un 'arg0? No muy descriptivo', tal vez un intento de los creadores del juego para tratar de ocultar el hecho de que este parámetro es el secreto para hacer que todos tus Candy Crush ¡los sueños se hacen realidad!

El valor completo del valor del parámetro 'arg0' tiene el siguiente aspecto:

Joe Levy

Experimentando un poco y viendo esta solicitud mientras terminaba varios niveles, pude discernir qué significan la mayoría de los campos en arg0 y de dónde provienen. EpisodeId y levelId se utilizan para identificar el nivel y se pueden encontrar en la solicitud enviada al servidor cuando comienzas a jugar un nivel: https: //candycrush.king.com/api/gameStart2.

La semilla también se puede encontrar en esta solicitud 'gameStart', y parece representar una semilla aleatoria de cómo debería verse el diseño de los dulces en el nivel. Además, cada solicitud de API realizada a Candy Crush debe enviarse con un parámetro de cadena de consulta '_session', para identificar la sesión de usuario actual. Este valor también se puede encontrar en la solicitud gameStart, y realmente en cualquier solicitud para Candy Crush , para esa materia.

Así es como se ve la solicitud https://candycrush.king.com/api/gameStart2:

Joe Levy

De nuevo, parece que Candy Crush Los creadores son realmente malos para crear nombres de parámetros creativos o están tratando de ofuscar esta información para dificultar la manipulación de su API. EpisodeId se envía a través de un parámetro de cadena de consulta llamado 'arg0', levelId se envía como 'arg1' y la semilla se envía como 'arg2'. Sin embargo, por alguna razón, decidieron usar un nombre bastante descriptivo para el token de sesión: '_ sesión'.

Aparte de episodeId, levelId, score y seed, el resto de los campos en el parámetro de cadena de consulta arg0 de la solicitud gameEnd no son importantes y pueden codificarse como se indicó anteriormente. Es decir, a excepción de cs. En este caso, Cs probablemente significa suma de comprobación, porque si no envía el valor correcto, la solicitud fallará. Resulta que construir el valor del campo de suma de comprobación tampoco es tan difícil. Para obtener la suma de verificación correcta, simplemente MD5 hash una cadena específica y use los primeros seis caracteres de esa cadena como suma de verificación. La cadena de hash coincide con el formato:

::: - 1 ::: BuFu6gBFv79BH9hk

UserId es la única información que aún no tenemos y que se necesita para construir la cadena anterior. Se envía en la solicitud 'gameInit' que ocurre cada vez que carga Candy Crush saga —Https: //candycrush.king.com/api/gameInitLight. Puede realizar esta solicitud en cualquier momento (pasando _session como un parámetro de cadena de consulta, por supuesto) y la respuesta contendrá su userId:

Joe Levy

Genial, ahora tenemos todo lo que necesitamos para realizar la solicitud gameEnd.

Intentemos introducir esta información en el compositor de Fiddler, apuntando al primer nivel del juego, y veamos qué sucede cuando ingresamos una puntuación de 100,000, calculamos la suma de verificación, hacemos la solicitud gameEnd y luego recargamos Candy Crush saga :

Joe Levy

Bueno, amigos míos, parece que logramos descifrar Candy Crush !

Tiempo Candy Crush saga tomó algunas medidas defensivas, permitiendo que una sola solicitud para completar el nivel, con cualquier puntaje, esté en conflicto directo con el “ Programación defensiva 'Práctica de la programación, en particular el' nunca confíes en el cliente ”Principio de programación web. Dado que el servidor no tiene control sobre cómo actúa el cliente, no puede asumir que el cliente no actuará de forma maliciosa, por lo que debe protegerse a sí mismo. Una mejor manera de implementar 'completar niveles' sería hacer que el cliente envíe al servidor cada movimiento que hace el usuario en el nivel, y que el servidor determine si esos movimientos obtienen una puntuación lo suficientemente alta como para completar el nivel. Si bien este método tampoco es perfecto, al menos significa que el cliente, ya sea mediante la acción manual del usuario o mediante algún método automatizado, tiene que jugar el nivel en lugar de simplemente decirle al servidor 'yo gano'.

Sin emabargo, Candy Crush no hizo esto y, en cambio, confía en el cliente. Ahora era solo cuestión de crear un cliente malicioso para aprovechar el hecho de que el cliente puede decirle al servidor que ganó cualquier nivel arbitrario. Idealmente, uno que sea fácil de instalar y usar para usuarios no técnicos. Mmm ... ¿qué tal una extensión de Chrome que solo agrega un botón al Candy Crush juego, cuando se juega en Facebook , Que cuando se hace clic supera el nivel actual automáticamente ??

3) Aprovechando la vulnerabilidad

Como mencioné anteriormente, Gargl le permite tomar las solicitudes que tenía para registrarlas, modificarlas y parametrizarlas según sea necesario, y luego generar automáticamente módulos en un lenguaje de programación de su elección para realizar estas mismas solicitudes. No voy a entrar en los detalles de ese proceso, ya que puede ver uno de mis Publicaciones de blog de Gargl para encontrar esa información, pero básicamente generé un Archivo de plantilla Gargl para Candy Crush Varias solicitudes de API, utilizando el Extensión Gargl Chrome , y luego usó un generador Gargl para convertir ese archivo de plantilla en un Candy Crush Biblioteca de JavaScript . Usar Gargl para esto me permitió crear una biblioteca JavaScript que habla con Candy Crush Servidores, sin escribir una línea de código para hacerlo, y también tener un archivo de plantilla para el futuro en caso de que quiera hacer lo mismo más adelante con otro lenguaje de programación.

Una vez que tuve esto Candy Crush Biblioteca de JavaScript, fue una simple cuestión de crear una extensión de Chrome en JavaScript que se ejecuta en el dominio cargado en el Candy Crush El iframe de la página del juego de Facebook (candycrush.king.com), agrega un botón al HTML para el juego, y cuando se hace clic en ese botón, se le pide al usuario una puntuación, sigue los pasos anteriores para encontrar el EpisodeId, levelId, seed, _session y userId, y luego emite la solicitud gameEnd para superar el nivel actual.

Joe Levy

Y así, Galleta Candy Crush ¡nació! ¿Tienes curiosidad por conocer los detalles exactos de cómo funciona Candy Crush Cracker? Consulte el código fuente en GitHub .

Foto vía m01229 / Flickr (CC BY 2.0)