Обратная разработка первоапрельской «Змейки» от Google

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.


Возможно, кто-то из вас заметил, что Google на 1 апреля добавила в приложение Google Maps для Android и iOS интерактивную игру «Змейка».

Специалисты Check Point обычно заняты исследованием последних киберугроз, но здесь очень увлеклись этой игрой, правда, сильно расстраивались из-за проигрышей… поэтому возникла логичная мысль: почему бы её не взломать!

Таким образом, наши самые озорные сотрудники начали думать над обратной разработкой приложения с помощью удалённой отладки. В общем, у них получилось, и вскоре мы успешно выполнили задачу никогда не проигрывать — и даже добавили простой ИИ, который сам играет в игру.





В этой заметке подробно опишем хак.

Сначала мы открыли приложение на виртуальном устройстве через Genymotion и запустили «Змейку», которая находится в меню в правом верхнем углу.

Похоже, что игра отображается в WebView, поэтому мы запустили удалённую отладку в инструментах разработчика Chrome:



Затем перешли на сайт и нашли на вкладке с исходниками файл v18.js, а в нём несколько интересных функций.

Во-первых, функция fa() инициирует поле размером 20×20:

this.height = this.width = 20;

Наша главная цель — найти и изменить функцию, которая определяет, когда змейка врезается в стену или в себя, чтобы отключить возможность проигрыша. Переменные width и height представляют размеры игрового поля, поэтому мы поискали width и height внутри исходного кода и нашли функцию F(a, b):



Похоже, F(a, b) проверяет, находятся ли координаты тела змеи в пределах поля. Один из вариантов — полностью удалить условия в функции, чтобы она всегда возвращала истину, тем самым переводя нас в «режим Бога», где мы можем проходить сквозь стены, не умирая.

Для этого мы нажали кнопку Inspect в удалённой консоли и изменили функцию F(a, b) на следующую:



Теперь мы можем проходить сквозь стены:


Рис. 1. Режим Бога

Это всё очень хорошо, но нам по-прежнему придётся играть, самостоятельно подбирая людей, чтобы зарабатывать очки. Следующий хак решит эту проблему.

В стеке вызовов много вызовов функции wa(a). Если изучить эту функцию, то мы увидим, что она рекурсивна и отвечает за запрос кадров анимации. wa(a) вызывает функции xa(a, b) и ya(a), которые отображают игровые фигуры (поезд, люди) и поле, соответственно.

Рассмотрим функцию xa(a, b):



Она принимает два аргумента: 'a' и 'b'. Первый является частью глобальной переменной Q, которая содержит интересную информацию о нашей игре, включая массив, который представляет собой игровое поле (рис. 2), где мы видим поезд (М), людей и объекты (K). Функция также вычисляет счёт и сохраняет его в c.i, что также эквивалентно Q.b.


Рис. 2. Массив игрового поля

Данный массив соответствует такому полю:


Рис. 3. Игровое поле

xa(a) также обращается к функции sa(a) на рис. 4, которая генерирует случайные координаты при каждом создании нового человека. Если вызывать функцию более одного раза, то можно создать сколько угодно людей (рис. 5).


Рис. 4. Вызов функции sa(a)

Как здесь:


Рис. 5. Вызов функции с созданием любого количества людей на карте

Обратите внимание, что даже если вызывать sa(a) более одного раза и забирать человека, счёт не меняется. При подборе пассажира вызывается функция ka(a, b) на рис. 6. Таким образом, её нужно изменить, чтобы при каждом вызове она добавляла 10 очков и обновляла счёт на экране.


Рис. 6. Обновлённая функция

Координаты каждой части поезда указаны в Q.b.o.b, где первый элемент представляет собой первый вагончик в поезде.


Рис. 7. Массив вагончиков

Это понадобится для создания простого ИИ. Начнём с его логики:


Рис. 8. Логика ИИ

Змейка представляет собой машину состояний (конечный автомат):

  1. На X=19 идём вниз, пока не доберёмся до Y=19.
  2. На X=19 и Y=19 идём влево до X=0.
  3. Переходим к машине состояний для зигзагов:
    1. Вверх на одну клетку и направо до X=18.
    2. Вверх на одну клетку и налево до X=0.
    3. Назад к шагу А.
  4. На Y=0 идём направо до X=19.
  5. Возвращаемся к шагу 1.

Полный код опубликован на GitHub.

Видео:

Источник: https://habr.com/ru/post/446920/


Интересные статьи

Интересные статьи

Введение: Соревнование от финансовой группы HOME CREDIT по определению риска дефолта заемщикаСоревнования Kaggle с использованием структурированных данных очень часто выи...
Задумывались ли вы когда-нибудь о том, чтобы разработать собственное электронное устройство, но не знали, с чего начать? Тогда приглашаем вас к прочтению данной статьи, в которой мы пос...
Бывает, что люди, близкие к теме разработки софта спрашивают: чем проектная работа отличается от создания MVP (Minimal Viable Product)? Понятно, что при этом у каждого спрашивающего свой ...
Как быть, если двухфакторной аутентификации и хочется, и колется, а денег на аппаратные токены нет и вообще предлагают держаться и хорошего настроения. Данное решение не является ч...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...