GameDevЗадачка: Античит для OpenSource-игры

Хочу предложить вам одну задачу, которая, как я считаю, является довольно интересной.

Представьте себе, что вы разрабатываете OpenSource-игру (под любой любимой вами лицензией, но игроки должны иметь возможность создавать моды). А конкретно — шутер. Оценивая ваши ресурсы, вы пришли к выводу что можете позволить себе только мастерсервер который выдает список игровых серверов и больше ничего.
Для простоты условия, будем считать что у вас сразу после запуска игры уже есть тысяч десять игроков, т.е. игра будет довольно популярна и очень нужна античит система (которую вы можете встроить прямо в код игры). Но поскольку ресурсов у вас так и нет, вы должны возложить работу античит системы на плечи игровых клиентов и на игровые сервера.
Условия:
• Практически 100%-гарантия работы античит системы без ложных срабатываний;
• Возможность администраторского влияния в античит систему;
• Как сервера, так и клиенты могут быть с некоторым модификациями в коде;
• Античит должен отлавливать практически все виды читерства на клиенте и на сервере;
• Античит не должен слишком сильно мешать игрокам
• Кроссплатформеность
  • +4
  • nsinreal
  • 28 февраля 2011, 18:22

Комментарии (18)

Вы чуть ли не полностью описали teeworlds и его проблемы.
Ну впервые задумался я о этой проблеме именно из-за увлечением игрой и кодингом Teeworlds. Уже объявилась парочка клоунов (а точнее три) которые написали свои собственные версии античитов (Teeworlds Trusted Client, Apofig AntiCheat, Simple AntiCheat TeeWorlds). У всех из них есть большая трабла — они не поддерживают альтернативные клиенты. Первый из них — это сам по себе отдельный клиент. Третий — самый плохой вариант (ломается за 15 минут в текущем виде). А насчет второго — был очень веселый тред на форуме z-team.

Почему я считаю, что писать такие античиты для teeworlds — это плохо:
1. Это OpenSource игра, и либо вы забираете возможность использовать моды, либо вы не сможете отследить читы
2. Это чужая игра. Ни один из тех, кто писал свои античиты даже близко не майнтейнер teeworlds (а некоторые даже в принципе не понимают основ программирования, а также работы игры)
3. Нет системы игровых аккаунтов. Можно сменить имя и выйти из игры.

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

Как это можно было бы сделать:
1. Античит система (проприетарная, с закрытыми исходниками) при запуске сверяет файл с оригиналом или предыдущей версией игры.
2. Если есть отличия, то файл игры загружается на специальный сервер, где впоследствии будет проверяться (процесс загрузки можно оптимизировать, допустим для каждого 4096-байтного блока считать md5 и отправлять на сервер с целью узнавания, была ли такая версия игры уже).

Естественно, такая система имеет недостаток, который заключается в том, что используется ручная проверка, но по крайней мере это не убило бы всю систему моддинга.
— Однако, задача указанная в топике — немного другая. Там вообще не должно быть затрат со стороны администраторов. Т.е. запустил один раз — и оставил до следующей версии.
  • avatar
  • LRN
  • 28 февраля 2011, 19:28
  • #
  • 3
К сожалению мои познания в области реверс-инжиниринга бинарников и взлома компьютерных программ чрезвычайно ограничены. Поэтому есть вероятность того, что нижеизложенное основано на неверных предпосылках.

Проведём параллель с играми в реальном мире. Кто присутствует на каждом футбольном матче? Арбитр. Третье лицо, которое знает правила и следит за тем, чтобы все игроки эти правила соблюдали, причём все игроки должны соблюдать одни и те же правила. Игроки (и зрители) также могут наблюдать за процессом игры и, в принципе, могут поймать арбитра на жульничестве (если арбитр начинает рандомно показывать красные карточки, то он либо дебил, либо куплен, либо сошёл с ума). Арбитр (как правило?) дорожит своей репутацией. Игроки доверяют арбитру по умолчанию.

С компьютерными играми можно сделать то же самое: взять некое третье лицо (не обязательно сервер, принадлежащий разработчикам игры) и сделать его арбитром. Арбитр следит, за тем, чтобы ПО всех игроков было одной версии, а также мониторит отчёты, которые ему в реальном времени посылает контрольный модуль, присобаченный к клиенту. Контрольный модуль будет реагировать на попытки модификации исполняемого кода игры на лету и другие распространённые методы взлома.

Как это стыкуется с СПО? Вот тут, в общем-то, и содержится основное слабое место этой схемы.
Контрольный модуль — это бинарник, причём крепко зашитый. Предпочтительно — зашитый каким-то очень случайным образом (я хз, как вообще это делается). Плюс, его код также может содержать случайные последовательности. В общем, любые методы, которые предотвращают автоматический взлом. Бинарник этот посылается арбитром одновременно всем игрокам. Возможно потребуется некая синхронизация передачи данных, чтобы все игроки закончили скачивать бинарник примерно в один и тот же момент. В этот момент бинарник активируется на каждом из клиентов и в течение N секунд должен законнэктиться (PSK, ключ вшит в бинарник) к арбитру и подтвердить свою подлинность и целостность. После чего он запускает игру, проверяет версию её модулей, и начинает следить за её процессами, предотвращая их изменение. Периодически (раз в M минут) арбитр генерирует новую версию бинарника и отсылает её игрокам вместе с исходниками предыдущей версии (таким образом игроки получают действительно свободное ПО — только с некоторой задержкой) и информацией о том, как расшифровать данные, которые передавал бинарник всё это время.

ПО игроков знает, как генерируются исходники контрольного модуля и что контрольный модуль может делать. Поэтому работающий параллельно с клиентом модуль контроля и наблюдения за модулем контроля может не позволять модулю контроля делать что-то, что ему делать не полагается (например пропатчить ядро). После получения очередной порции исходников и ключей для декодирования потока модуль контроля и наблюдения за модулем контроля может декодировать информацию (не обязательно в реальном времени, это можно делать параллельно, или вообще отложить декодирование на потом), которая была отослана ранее, чтобы удостовериться, что модуль контроля не посылал ничего инкриминирующего (в случае, если ему удалось обойти модуль контроля и наблюдения и всё-таки нарыть какую-то информацию), а также что арбитр не давал модулю контроля никаких читерских команд. Также игра записывает и шифрует риплэй (записывает и шифрует сама, ключ для шифрования получает от модуля контроля, этот ключ также раскрывается каждые M минут), после игры он может быть проанализирован для определения честности арбитра и игроков (поскольку система позволяет избежать модификаций клиента и шифровать передачи, можно позволить клиентам иметь исчерпывающую информацию о ходе игры — всё равно игроки не смогут ею воспользоваться в реальном времени).

То есть система основана на предположении, что можно генерировать бинарники, которые не могут быть взломаны игроками (и в которых зашитые ключи не могут быть найдены) быстрее чем за N секунд. Также предполагается, что игроки не могут модифицировать код модуля контроля после его запуска (или могут, но неспособны вычислить и внести все нужные изменения быстро и атомарно). Также предполагается, что игроки доверяют арбитру, то есть арбитры — не случайно выбранные компьютеры в Интернете, а вполне известные (имеют закрытый ключ для подтверждения) личности. Конечно, это не даёт 100% гарантию того, что они никогда не воспользуются получаемой властью в неправедных целях, но и в реальном мире никто этого не гарантирует. Кроме того возможности, которые дают им модули контроля, довольно ограничены.

Игра разбивается на несколько кусков, все важные для игрового процесса данные пересылаются через модуль контроля и поэтому передаются в зашифрованном виде. Куски, не содержащие влияющих на игровой процесс частей, могут модифицироваться свободно, модуль контроля не будет возражать. Куски, которые влияют на игровой процесс, в своей совокупности должны быть совместимы друг с другом и совместимы с клиентским кодом других игроков («совместимы» означает, что они поддерживают одну и ту же версию протокола и правил игры, они не обязательно должны быть идентичны с точностью до бита, т.к. могут быть на разных платформах), арбитр это проверяет по хэшам этих кусков (хэши считает и передаёт модуль контроля). Арбитр хранит у себя большой набор таблиц совместимости кусков по их хэшу, этот набор он также показывает игрокам перед началом игры (чтобы игроки знали, какие версии клиента поддерживаются). Одобренные как «чистые» версии происходят прежде всего из центрального репозитория сообщества разработчиков игры (подписываются релиз-инженером; списки одобренных версий регулярно обновляются), но арбитр волен поддерживать и модифицированные версии на своё усмотрение (главное, чтобы все игроки имели совместимые модификации).

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

Что-то типа того.
Есть очень большая проблема. Арбитры не за просто так работают. А ресурсов у нас нет. Хотя схема очень интересна.
А игровые сервера значит работают за просто так? :) Найти хоста — всегда проблема, в этом ничего нового нет.
Игровые сервера работают за счет фанатов. Такова ситуация в teeworlds.
Арбитры работают за счёт фанатов.
Понимаете ли. Одно дело — захостить у себя сервер. Другое дело платить кому-то
Кому платить? Что платить? Зачем платить?
А что именно могут предложить фанаты арбитрам кроме денег?
То есть захостить сервер фанат может, а захостить арбитра он не может? В принципе, дизайн не запрещает совмещать сервер с арбитром. Это вопрос распределения уязвимостей: если верить арбитру, то можно и совместить его с сервером. Тогда если арбитр решит пожульничать, ему будет это проще сделать (предполагается, что сервер имеет больше информации, чем клиенты, и не все действия сервера клиенты смогут потом проверить). Если же сделать их раздельными, то секьюрность сервера напрямую зависит от секьюрности всей системы, но у арбитра будет меньше возможностей для неблагоприятной активности. Возможны также трудности в техническом плане (код сервера отличен от кода клиента, за ним приглядывать нужно особым образом — дополнительные расходы на реализацию и поддержку контрольного модуля для сервера).
Всмысле, захостить арбитра. Дома его поселить что-ли :-)? Или вы подразумеваете под этим какую-то программу? Если все же арбитр — это человек, то подумайте — никому не хочется делать работу за просто так.
В целях эффективности арбитр должен выполнять все действия автоматически. Человеческий контроль за его работой может быть выполнен по логам. Впрочем, возможность контроля в реальном времени это не исключает.
А, так вот в чем дело. Тогда идея интересна
  • avatar
  • SPU
  • 01 марта 2011, 21:07
  • #
  • 0
Шифрование обмена с сервером на основе загруженного в память кода ядра игры, которое не должно быть подвержено изменениям со стороны моддеров.

Бинарное содержимое ядер всех версий известно (и алгоритм использования этого содержимого в процессе шифрования), поэтому если ядро не затронуто, то на стороне сервера данные будут расшифрованы без проблем. Если ядро изменено, то хендшейк просто не пройдет (или в процессе передачи данных что-то нарушится, если код незначительно изменен). Главное, во-первых, чтобы код ядра был использован в шифровании максимально широко. Например, хэши от большого количества ячеек, выбранных в псевдослучайной последовательности, ну и, во-вторых, чтобы код самого взаимодействия с сервером так же входил в ядро.

При таком раскладе даже наличие исходников клиента и сервера ничем не поможет.
Единственное что я не пойму: вот почему я не могу в моде сделать какой-нибудь аимбот? Ядро не пострадало, все хорошо.
Бота можно сделать вообще не трогая код игры. Сложнее, но можно. Поэтому анализ на сервере все равно придется делать. Либо сделать архитектуру модифицируемой (не защищаемой) части игры такой, что читерского бота в ней сделать нельзя.
Либо сделать архитектуру модифицируемой (не защищаемой) части игры такой, что читерского бота в ней сделать нельзя.

Как?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.