Engenharia reversa do Google Fool de abril



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 Deus

Tudo 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 jogo

Essa matriz corresponde a este campo:


Fig. 3. O campo de jogo

xa (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 mapa

Observe 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 atualizado

As 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ões

Isso será necessário para criar uma IA simples. Vamos começar com a lógica dele:


Fig. 8. lógica da IA

Uma cobra é uma máquina de estado (máquina de estado):

  1. Em X = 19, diminuímos até chegarmos a Y = 19.
  2. Em X = 19 e Y = 19, vá para a esquerda para X = 0.
  3. Passamos para a máquina de estado para ziguezagues:
    1. Suba uma célula e à direita para X = 18.
    2. Suba uma célula e deixe para X = 0.
    3. Voltar ao passo A.
  4. Em Y = 0, vá para X = 19.
  5. Volte para a etapa 1.

O código completo está publicado no GitHub .

Vídeo:

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


All Articles