Мое первое знакомство с играми FPS началось в юном возрасте с игры Combat Arms. Это была игра, разработанная Nexon, и, хотя она была действительно забавной, в ней постоянно было много читеров.

Признаюсь, это заинтриговало меня и заставило задуматься: «Как они это делают? Как я могу это сделать?". В то время я ничего не знал ни о программировании, ни о реверс-инжиниринге. Мне нужно было многому научиться, и вот как вы тоже можете это сделать.

Крункер

Krunker.io - это бесплатный шутер от первого лица (FPS), в который можно играть через браузер. Игра использует холст HTML5 для рендеринга графики. Мы можем убедиться в этом, просмотрев DOM.

Исходный код игры находится внутри game.js. Давайте просмотрим этот файл в браузере и посмотрим, какую информацию мы сможем собрать.

Эээ… Не сразу видно, что делает этот код. Он не отформатирован ни на один бит, а есть что-то в t.exports?

Прокручивая еще немного, появляется куча нецензурных слов? Вероятно, это связано с системой фильтрации внутриигрового чата.

Бандлеры

Компоновщики полезны для объединения ваших сценариев, ресурсов и других файлов и их упаковки (объединения) в меньший, более простой для восприятия набор файлов. Это сокращает время загрузки за счет уменьшения количества запросов, которые браузер должен делать для получения ваших ресурсов.

Это также сопровождается техникой, называемой минификацией, процессом удаления комментариев, форматирования и неиспользуемого кода для увеличения времени загрузки. Это также может быть объединено с обфускацией, процессом усложнения вашего кода для реинжиниринга с использованием таких методов, как замена имен функций бессмысленными, обфускация потока управления и т. Д.

Назад к Крункеру

Наш игровой код для Krunker сильно минифицирован, к счастью для нас, есть полезный инструмент, чтобы оживить этот код. Beautifier.io

Вводя код в beautifier, инструмент может вернуть форматирование, чтобы сделать этот код читаемым. Этот инструмент также способен на гораздо больше, но для нашего случая использования форматирование - это все, что нам нужно.

Теперь мы можем перенести этот код в выбранный нами редактор и начать обратный инжиниринг.

Итак, с чего мне начать?

Начните с осмотра, найдите любые строки или вызовы функций, которые привлекают ваше внимание. Некоторые хорошие поисковые запросы - это «игрок», «список игроков», «объект». Вы должны попытаться понять, что делают определенные функции и как вы можете использовать это, насколько вам известно. Поиск player.list в источнике приводит меня к интересному блоку кода.

Из этого фрагмента мы видим, что код выполняет итерацию по списку игроков, проверяет, не является ли игрок мной, проверяет, находится ли игрок в поле зрения, а затем что-то отображает. Если игрока нет в поле зрения, он ничего не отображает. А что, если я хочу, чтобы он всегда что-то отображал? Я просто изменю это выражение if ...

Это всегда должно выполняться! Давайте проверим это….

Подождите ... Как мне добавить изменения на сайт?

Нам нужен способ заменить скрипт их файлом на наш, к счастью для нас, Chrome очень расширяемый, и мы можем создавать расширения для таких вещей. Давай попробуем.

Вот манифест расширения, которое мы будем создавать. Нам нужны специальные разрешения для блокировки запросов, разрешения на доступ к сайту krunker.io, разрешение на запуск фоновых скриптов и некоторая другая информация. Подробнее о манифестах расширений Chrome в документации

Здесь мы блокируем запрос игрового скрипта Krunker и заменяем его нашим собственным.

Окончательная файловая структура ..

Перейдите к chrome: // extensions и отметьте режим разработчика в правом верхнем углу. Отсюда вы сможете открыть папку со своим расширением.

А теперь перейдем к Krunker.io

Мы можем видеть людей сквозь стены! Это сработало!

Признаюсь, в большинстве случаев это не так просто. Разработчики знают, что людям нравится вмешиваться в их код, и некоторые предпринимают большие усилия для защиты своего кода. Одним из популярных инструментов защиты Javascript является Jscrambler. Прочтите об отмене безопасности на стороне клиента Javascript здесь.

Не будь злым!