Как стать автором
Обновить

Игра по своим правилам: хак лидерборда в Telegram MiniApp

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров737

Как-то раз в одном из телеграм-чатов ребята закинули игру, в которой можно посоревноваться друг с другом.

Играли в Paint Io в боте @gamee - это аркада, где нужно закрашивать территорию, оставляя за собой след. Замыкаешь контур — зона твоя. Перережешь чужой след — выбиваешь соперника. Цель — захватить максимум поля.

В чате все люди серьезные, поэтому борьба за первенство началась сразу.

Он был прав, я потратил прилично времени, но удалось выйти только в топ-3
Он был прав, я потратил прилично времени, но удалось выйти только в топ-3

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

Начало исследования

Так как Telegram Mini App это в первую очередь веб-приложение, высока вероятность что она запустится и с браузера на компьютере.

Приложение немного сопротивлялось, требуя запуск на мобильном устройстве, но эмулировать запуск со смартфона не сложно (см ролик с примерами).

Игра запустилась на пк - отлично!
Игра запустилась на пк - отлично!

Сыграв короткую тестовую игру с включенными инструментами разработчика (DevTools), на сервер ушел http запрос, в котором содержались такие поля как "id": "game.saveWebGameplay" и score: 12

Несложно догадаться что это та самая команда, которая отправляет результаты игры на сервер, где 12 - количество набранных очков.

Кажется, что дело за малым, нужно подменить значение в запросе и отправить его снова.

Пробуем!

Правой кнопкой мыши на запрос - копировать как fetch
Правой кнопкой мыши на запрос - копировать как fetch

Вставляем скопированный текст в блокнот, и меняем значение в поле score на 50000.

Полученный запрос вставляем в консоль браузера и жмем Enter
Полученный запрос вставляем в консоль браузера и жмем Enter

К сожалению, я не делал скриншот этого этапа, придется поверить на слово, что сервер вернул ошибку checksum incorrect

Проверил ранее вставленный текст, действительно есть такое поле.
Проверил ранее вставленный текст, действительно есть такое поле.

Ищем загадочное checksum

Для этого открываю DevTools - Sources - Find All, фильтрую контент по слову checksum и вот оно, обнаружена функция, отвечающая за его генерацию.

На самом деле здесь нам несказанно повезло
На самом деле здесь нам несказанно повезло

Обратите внимание на зеленые комментарии, их оставили разработчики игры прямо в скриптах. В переводе с английского они пишут "Намеренно оставляем соль md5 здесь, а не в env (переменные окружения), потому что найти ее здесь будет сложнее"

Ну да, поиск по названию операция не из простых.

И так, мы видимо что наш checksum это md5-хэш с солью, которая прямо захардкожена здесь.

export const getChecksum = (score, playTime, url, gameStateData) => 
md5(`${score}:${playTime}:${url}:${gameStateData}:crmjbjm3lczhlgnek9uaxz2l9svlfjw14npauhen`);

Судя по всему, он хэшируется из полей score, playTime, url, gameStateData.

К счастью, абсолютно все эти поля передаются в нашем запросе, осталось подставить новые значения и захэшировать новый checksum.

Открыл первый в гугле md5 генератор, но наверняка можно было посчитать налету на js
Открыл первый в гугле md5 генератор, но наверняка можно было посчитать налету на js

Обновляем в запросе значение checksum и попробуем снова.

Ура! Запрос обработан и 50 тысяч очков сохраняется в профиле игрока.

Забираем первое место

Осталось нарисовать красивое число в лидерборде. У парня на первом месте было 39 258 очков, решил обогнать его ровно на 100 тысяч.

Считаю, что первое место в рейтинге чата получено абсолютно заслужено.

Безусловно, существует множество способов проделать аналогичное.

Так, например, в своем телеграм-канале «Деплой в пятницу» я разобрал еще один способ выхода в топ-1 — но уже для другой игры. Туда попадает всё, что не тянет на полноценную статью, и иногда даже что-то полезное.

Теги:
Хабы:
+1
Комментарии2

Публикации

Истории

Работа

Ближайшие события

19 марта – 28 апреля
Экспедиция «Рэйдикс»
Нижний НовгородЕкатеринбургНовосибирскВладивостокИжевскКазаньТюменьУфаИркутскЧелябинскСамараХабаровскКрасноярскОмск
24 апреля
VK Go Meetup 2025
Санкт-ПетербургОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
14 мая
LinkMeetup
Москва
5 июня
Конференция TechRec AI&HR 2025
МоскваОнлайн
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область