Ingeniería inversa de los Inocentes de Google



Quizás uno de ustedes notó que el 1 de abril, Google agregó el juego interactivo "Snake" a la aplicación Google Maps para Android e iOS.

Los especialistas de Check Point generalmente están ocupados investigando las últimas amenazas cibernéticas, pero estaban muy interesados ​​en este juego, aunque estaban muy molestos por las pérdidas ... por lo tanto, surgió un pensamiento lógico: ¿por qué no descifrarlo?

Por lo tanto, nuestros empleados más traviesos comenzaron a pensar en el desarrollo inverso de la aplicación mediante depuración remota. En general, lo hicieron, y pronto completamos con éxito la tarea de nunca perder, e incluso agregamos una IA simple que juega el juego en sí.





En esta nota, describimos en detalle el hack.

Primero, abrimos la aplicación en el dispositivo virtual a través de Genymotion y lanzamos la "Serpiente", que se encuentra en el menú en la esquina superior derecha.

Parece que el juego se muestra en WebView, por lo que comenzamos la depuración remota en las herramientas de desarrollador de Chrome:



Luego fueron al sitio y encontraron el archivo v18.js en la pestaña fuente, que contenía varias funciones interesantes.

Primero, la función fa () inicia un campo 20 × 20:

this.height = this.width = 20; 

Nuestro objetivo principal es encontrar y cambiar una función que determina cuándo una serpiente se estrella contra una pared o contra sí misma para desactivar la posibilidad de perder. Las variables ancho y alto representan las dimensiones del campo de juego, por lo que buscamos ancho y alto dentro del código fuente y encontramos la función F (a, b) :



Parece que F (a, b) está verificando si las coordenadas del cuerpo de la serpiente están dentro del campo. Una opción es eliminar por completo las condiciones en la función para que siempre devuelva la verdad, transfiriéndonos así al "régimen de Dios", donde podemos atravesar paredes sin morir.

Para hacer esto, presionamos el botón Inspeccionar en la consola remota y cambiamos la función F (a, b) a lo siguiente:



Ahora podemos atravesar las paredes:


Fig. 1. Modo Dios

Todo esto es muy bueno, pero aún tenemos que jugar, recogiendo personas para ganar puntos. El siguiente truco resolverá este problema.

Hay muchas llamadas a wa (a) en la pila de llamadas. Si estudiamos esta función, veremos que es recursiva y es responsable de consultar cuadros de animación. wa (a) llama a las funciones xa (a, b) y ya (a) , que muestran las piezas del juego (tren, personas) y campo, respectivamente.

Considere la función xa (a, b) :



Se necesitan dos argumentos: 'a' y 'b'. El primero es parte de la variable global Q, que contiene información interesante sobre nuestro juego, incluida una matriz que representa un campo de juego (Fig. 2), donde vemos un tren (M), personas y objetos (K). La función también calcula la puntuación y la almacena en ci, que también es equivalente a Qb


Fig. 2. La matriz del campo de juego.

Esta matriz corresponde a este campo:


Fig. 3. El campo de juego

xa (a) también se refiere a la función sa (a) en la Fig. 4, que genera coordenadas aleatorias cada vez que se crea una nueva persona. Si llama a la función más de una vez, puede crear tantas personas como desee (Fig. 5).


Fig. 4. Función de llamada sa (a)

Como aqui:


Fig. 5. Llamada de función con la creación de cualquier número de personas en el mapa

Tenga en cuenta que incluso si llama a sa (a) más de una vez y toma a la persona, el puntaje no cambia. Al seleccionar un pasajero, la función ka (a, b) en la Fig. 6. Por lo tanto, debe cambiarse para que con cada llamada agregue 10 puntos y actualice la puntuación en la pantalla.


Fig. 6. Característica actualizada

Las coordenadas de cada parte del tren se indican en Qbob, donde el primer elemento es el primer remolque del tren.


Fig. 7. Matriz de vagones

Esto será necesario para crear una IA simple. Comencemos con su lógica:


Fig. 8. lógica AI

Una serpiente es una máquina de estados (máquina de estados):

  1. En X = 19, bajamos hasta llegar a Y = 19.
  2. En X = 19 e Y = 19, vaya a la izquierda a X = 0.
  3. Pasamos a la máquina de estados para zigzags:
    1. Arriba una celda y a la derecha a X = 18.
    2. Arriba una celda y se fue a X = 0.
    3. Volver al paso A.
  4. En Y = 0, ve a la derecha a X = 19.
  5. Regrese al paso 1.

El código completo se publica en GitHub .

Video:

Source: https://habr.com/ru/post/446920/


All Articles