Взламываем игры в тг. Часть 2
100 Баксов [100$]Сегодня удалось хакнуть еще одну игрушку в тг, рассказываю как это было.
По сути, я просто обошел алгоритмы игры, и заставил ее сохранить мне тот счет, который я хочу
История
В одном из чатов ребята соревновались в игрушке Karate Kido 2, и чтобы выйти на первое место нужно было набрать более 40 тысяч очков.
Так как ранее я уже успешно накручивал себе счет в телеграм-игре, решил попробовать повторить опыт, тем более механика многих тг-игр похожа.
Историю о моем первом хаке игры можно почитать здесь - https://telegra.ph/Kak-ya-vzlomal-igru-i-vyshel-v-top-11-25
Начало исследования
Первым делом, запускаем игру с пк, а не с телефона. Для этого я авторизовался в телеграме через Google Chrome, открыл инструменты разработчика (DevTools) и запустил игру.
Сыграв коротенькую игру, обратил внимание, что на сервер уходит http запрос, в котором передается мой текущий счет (score) и секретный хэш checksum, который генерится в игре автоматически.
Чисто теоретически, нет никаких сложностей заменить score на свое значение и отправить запрос снова.
Но предыдущий опыт показал, что checksum здесь не просто так, и в нем шифруется наш счет.
Соответственно, остается понять как формируется этот самый checksum.
Ищем загадочное checksum
Для этого открываю DevTools - Sources - Find All, фильтруем контент по слову checksum и видим, что на этот раз разработчики явно заморочились.
Вот как формируется checksum:
checksum: l()("".concat(n || 0, ":").concat(t || 0, ":").concat(s, ":").concat(d || "", ":crmjbjm3lczhlgnek9uaxz2l9svlfjw14npauhen"))
Как видим, в нем используются переменные n,t,s,d, чуть выше по коду можно увидеть, что n - это счет (score), t - игровое время (playtime), s - ссылка на игру (gameUrl), а d - какое-то gameStateData
Плюс они применяют механизм замыкания, применяя метод l(), который хоть убейся я так и не нашел откуда импортируется.
Поняв, что самостоятельно checksum я не сгенерирую, меня посетила такая мысль: а что если я очень быстро приостановлю выполнение кода, подменю некоторые цифры на свои, и заставлю игру "схавать" измененные значения.
Подмена счета
Для того, чтобы приостановить выполнение JavaScript в браузере, можно воспользоваться такой технологией как брейкпоинт (breakpoint)
Для этого я просто кликаю чуть левее перед той строчкой кода, где хочу поставить игру на паузу. Я выбрал кусочек кода прямо перед рассчетом checksum. Запускаем игру снова.
Как видно на скриншоте, я проиграл, но результат игры еще не известен, так как игра приостановилась именно на указанной мной строке кода. Теперь в правой части экрана я заменяю набранный счет 110 на желаемый (я захотел 50505, выглядит красиво), и просто жмем кнопку продолжить.
Ура!
То самое checksum "схавало" подставленный мной счет, и сгенерировал такой хэш, который для сервера стал валидным.
Таким образом снова удалось забрать первое место, затратив на исследования всего несколько минут.
Игра, в которую мы играли, называется Karate Kido 2
Запускается в телеграме через бот @gamee
P.S. Исследовать игру мне помогли знания и навыки, которыми обладают тестировщики (или QA инженеры). Освоить эти навыки можно здесь 👉 https://telegra.ph/Dostupnaya-professiya-s-zarplatoj-bolee-200-tysyach-rublej-03-03
Другие мои проекты: @baxproject
Мой канал - @bax_100