Абсолютный чит: как взломали мультиплеер Age of Empires 2 Definitive Edition
И сумели научить персонажей уворачиваться от выстрелов.
Кстати, на сайте читать удобнее
В 2019 году вышел ремастер Age of Empires 2 Definitive Edition с обновленной графикой и кое-каким новым контентом. Картинка поменялась, но в основе игры лежал старый движок — в том числе та часть, что отвечала за мультиплеер.
Команда исследователей безопасности RedRocket сумела взломать мультиплеерный режим Age of Empires 2 Definitive Edition, используя материалы, описывавшие реализацию мультиплеера еще в оригинальных играх серии. В процессе исследователям удалось провернуть несколько интересных трюков.
В мультиплеере Age of Empires 2 нет сервера, хранящего все данные о сессии. Вместо этого игровая логика построена на концепции ходов:
- Клиент каждого игрока в мультиплеере обсчитывает игру самостоятельно.
- Любая команда, которую отправляет игрок, должна выполняться двумя ходами позже.
- Все команды должны верифицироваться и исполняться на всех клиентах.
- Если клиент не может верифицировать данные и выполнить команду, игра десинхронизируется и матч прерывается.
В идеальном мире, отмечают исследователи, такая архитектура должна хорошо противостоять взлому: если данные верифицируются, то хакеру не удастся манипулировать состоянием игры. Но мультиплеер Age of Empires 2 работает не в идеальном мире.
Сперва исследователи научились управлять своими юнитами. Для этого вручную, с помощью CheatEngine, в памяти процесса Age of Empires 2 Definitive Edition был найден объект одного из юнитов. После изучения объекта исследователи получили представление о его функциях и методах.
Затем был написан бот, внедрявшийся в процесс и управлявший передвижением юнитов с помощью вызова стандартных функций. Он мог, например, автоматически уводить войска из зоны, куда должны упасть снаряды катапульт.
Была проблема — такой трюк можно провернуть только в одиночном режиме. Если запустить бота в мультиплеере, ожидаемо происходит десинхронизация: команды бота не отправляются другим игрокам в сессии.
С помощью реверс-инжиниринга удалось найти функцию, отвечающую за отправку команд передвижения юнитов другим игрокам. Выяснив параметры вызова функции, исследователи переделали своего бота так, чтобы он работал и в одиночном режиме, и в мультиплеере. Тут же выяснился любопытный момент.
Движку игры без разницы, чьи отряды вы передвигаете. Интерфейс Age of Empires 2 позволяет выбирать и контролировать только собственные юниты или здания игрока. Но оказалось, что эта проверка есть только в части кода, отвечающей за интерфейс: в других местах она отсутствует.
Бота модифицировали еще раз: теперь он не управлял юнитами, а просто подменял указатели так, чтобы интерфейс думал, будто игрок имеет право выбрать любого юнита. У остальных частей движка вопросов не возникло: подделка указателей позволила управлять чужими юнитами.
Эксперименты показали, что все проверки делаются только в интерфейсной части игры — как в одиночном режиме, так и в мультиплеере. Внедрившись в код и подменяя указатели, можно делать все, что угодно и в обычном мультиплеере, и в рейтинговом режиме.
Если честно, не ожидал, что это вообще возможно. Запрет игроку передвигать юниты, принадлежащие другому игроку, это одна из первых проверок безопасности, что приходит мне в голову, когда речь идет о стратегии в реальном времени. Но оказалось, что пределов нет: похоже, проверки безопасности вообще отсутствуют.
RedRocket
На всякий случай было решено проделать еще один опыт. В играх серии Age of Empires игроки могут уничтожать свои юниты — например, чтобы вместо них построить кого-то еще. Что будет, если отправить команду убить юнит, который не принадлежит игроку?
Оказалось, что проверок нет и в этом случае. В результате исследователи превратили Age of Empires 2 Definitive Edition в кликер, где можно вручную перебить любое количество противников.
Последним экспериментом стала кнопка «убить всех», реализованная в актуальной версии Age of Empires 2 Definitive Edition для Steam. Она позволяла игроку уничтожить противника в мультиплеере, просто введя его идентификатор.
После этого бот пробегался по всем юнитам и зданиям противника и отправлял команды на их уничтожение. Оппонент моментально лишался всего, с точки зрения игровой логики он считался проигравшим и выбывал из матча.
Скорее всего, полагают исследователи, примерно так же устроен мультиплеер и в остальных частях серии. Способов защититься тут не очень много: разработчикам надо реализовать проверки данных для всех методов, вызывающихся при игре в мультиплеер.
Выкладывать исходники бота исследователи пока не стали, чтобы дать Microsoft время поправить уязвимость.
- Особенности DLC Return of Rome для Age of Empires II:DE
- В Age of Empires II: DE идёт событие "Пикантные экспедиции"
- Для Crusader Kings 3 вышел мод на королевскую битву
- Видео: на съемках «Шан-Чи и легенды Десяти колец»
- Для Age of Empires 2 вышел новогодний режим со стрельбой подарками из катапульты
- Эпоха империй