
Talvez um de vocês tenha notado que, em 1º de abril, o Google adicionou o jogo interativo "Snake" ao aplicativo Google Maps para Android e iOS.
Os especialistas da Check Point geralmente estão envolvidos na pesquisa das mais recentes ameaças cibernéticas, mas estavam muito interessados neste jogo, no entanto, ficaram muito chateados por causa das perdas ... então havia um pensamento lógico: por que não fazer isso!
Assim, nossos funcionários mais maliciosos começaram a pensar no desenvolvimento reverso do aplicativo usando a depuração remota. Em geral, eles fizeram isso e logo concluímos com êxito a tarefa de nunca perder - e até adicionamos uma IA simples que joga o jogo em si.
Nesta nota, descrevemos em detalhes o hack.
Primeiro, abrimos o aplicativo no dispositivo virtual através do Genymotion e lançamos o “Snake”, localizado no menu no canto superior direito.
Parece que o jogo está sendo exibido no WebView, então começamos a depuração remota nas ferramentas de desenvolvedor do Chrome:

Então eles foram ao site e encontraram o arquivo v18.js na guia fonte, e ele continha várias funções interessantes.
Primeiro, a função
fa () inicia um campo 20 × 20:
this.height = this.width = 20;
Nosso principal objetivo é encontrar e alterar uma função que determina quando uma cobra colide com uma parede ou contra si mesma, a fim de desativar a possibilidade de perda. As variáveis
width e
height representam as dimensões do campo de jogo; portanto, procuramos
largura e
altura dentro do código-fonte e encontramos a função
F (a, b) :
Parece que
F (a, b) está verificando se as coordenadas do corpo da cobra estão dentro do campo. Uma opção é remover completamente as condições da função para que ela sempre retorne a verdade, transferindo-nos para o "regime de Deus", onde podemos atravessar paredes sem morrer.
Para fazer isso, pressionamos o botão
Inspecionar no console remoto e alteramos a função
F (a, b) para o seguinte:
Agora podemos atravessar as paredes:
Fig. 1. Modo DeusTudo isso é muito bom, mas ainda temos que jogar, escolhendo as pessoas para ganhar pontos. O próximo hack resolverá esse problema.
Existem muitas chamadas para
wa (a) na pilha de chamadas. Se estudarmos essa função, veremos que ela é recursiva e é responsável pela consulta de quadros de animação.
wa (a) chama as funções
xa (a, b) e
ya (a) , que exibem peças de jogo (trem, pessoas) e campo, respectivamente.
Considere a função
xa (a, b) :
São necessários dois argumentos: 'a' e 'b'. O primeiro faz parte da variável global Q, que contém informações interessantes sobre o nosso jogo, incluindo uma matriz que representa um campo de jogo (Fig. 2), onde vemos um trem (M), pessoas e objetos (K). A função também calcula a pontuação e a armazena em ci, que também é equivalente a Qb
Fig. 2. A matriz do campo de jogoEssa matriz corresponde a este campo:
Fig. 3. O campo de jogoxa (a) também se refere à função
sa (a) na Fig. 4, que gera coordenadas aleatórias cada vez que uma nova pessoa é criada. Se você chamar a função mais de uma vez, poderá criar quantas pessoas quiser (Fig. 5).
Fig. 4. Função de chamada sa (a)Como aqui:
Fig. 5. Chamada de função com a criação de qualquer número de pessoas no mapaObserve que, mesmo que você chame
sa (a) mais de uma vez e leve a pessoa, a pontuação não muda. Ao selecionar um passageiro, a função
ka (a, b) na Fig. 6. Portanto, ele precisa ser alterado para que a cada chamada ela adicione 10 pontos e atualize a pontuação na tela.
Fig. 6. Recurso atualizadoAs coordenadas de cada parte do trem são indicadas no Qbob, onde o primeiro elemento é o primeiro trailer do trem.
Fig. 7. Matriz de vagõesIsso será necessário para criar uma IA simples. Vamos começar com a lógica dele:
Fig. 8. lógica da IAUma cobra é uma máquina de estado (máquina de estado):
- Em X = 19, diminuímos até chegarmos a Y = 19.
- Em X = 19 e Y = 19, vá para a esquerda para X = 0.
- Passamos para a máquina de estado para ziguezagues:
- Suba uma célula e à direita para X = 18.
- Suba uma célula e deixe para X = 0.
- Voltar ao passo A.
- Em Y = 0, vá para X = 19.
- Volte para a etapa 1.
O código completo está publicado
no GitHub .
Vídeo: