Это читерство! Изучаем принципы борьбы с читами и пишем простую защиту

Хакеры разрабатывают читы, геймеры их покупают, компании нанимают инженеров, чтобы разрабатывать новые способы защиты. Хакеры снова находят лазейку, и круг замыкается. В этой статье мы посмотрим, как работают (и работают ли!) разные оборонительные методы, и попробуем создать свою систему защиты от читерства.

Защита дескриптора драйвером

Некоторые античиты используют собственный драйвер. Он позволяет задействовать более широкий спектр возможностей для защиты приложения. Времена хуков SSDT прошли из-за высокой вероятности конфликта с другим программным обеспечением.

В Windows появилась специальная функция для перехвата некоторых событий системы — ObRegisterCallbacks. Драйвер античита урезает права дескриптора процесса, устанавливая callback на его получение. При попытке запросить полный доступ к защищенной игре приложение третьего кольца получит лишь доступ к общей информации о процессе.

Существуют и внутриигровые проверки: игра сама может проверять, модифицированы ли отдельные переменные или код в целом. Простой пример: если патронов в обойме будет больше, чем максимальное количество патронов в обойме, значит, что-то тут не так.

INFO

В прошлой статье я рассказывал о разных видах читов.

Виды защиты от внутренних читов

Для обхода внутренней защиты придется реверсить код.

Защита: хук функции LoadLibrary.

Обход: ManualMapping.

ManualMapping — это ручная загрузка библиотеки в адресное пространство процесса. Она включает в себя парсинг заголовков, аллокацию памяти, запись, ручной импорт библиотек и вызов точки входа библиотеки. Выполняя ManualMapping, мы полностью имитируем функцию LoadLibrary, но не оставляем информации о загруженной библиотеке.

Защита: мониторинг активных потоков и трейсинг адреса библиотек.

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

Обход: хуки и code caving.

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

Code cave — участок нулей в памяти приложения, который никогда не используется им во время исполнения. В этот участок можно встроить код чита. Выполнив проверку, относится ли код к адресному диапазону игры, античит пропустит его.

Защита от внешних читов

Для защиты от внешних читов используется драйвер.

Защита: мониторинг известных процессов или мониторинг всех процессов и поиск читерских программ по их сигнатурам.

Обход: обфускация.

Обфускация изменяет, запутывает, виртуализирует код, изменяет сигнатуры. Античит ищет только известные ему сигнатуры, и обфусцированные версии кода будут проигнорированы.

INFO

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

Античит от внешних читов

Напишем простой античит. Его будет легко обойти, потому что это только пример. В реальности античиты — это комплексные приложения, которые следят за многими аспектами системы.

Мы будем искать неподписанные процессы в системе — потому что читы редко подписывают, — получать их хеши и сравнивать с хешами известных читов. Для поиска процессов воспользуемся Process, а для валидации готовым wrapper для функции WinVerifyTrust из wintrust.dll.

Список известных нам читов:

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


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

  • Спасибо, статья несет определенную пользу. Но написанный "античит" по логике похож на "антивирус, который определяет вирусный процесс на основе факта получения этим процессом списка процессов в системе" - т.е поведение слишком распространенное и может применяться и легитимным ПО в том числе

  • На счет внутренних читов. Нужно понимать, что адресное пространство полностью принадлежит хакеру, из ядра можно безопасно произвести смену контекста, выделить память, записать и вызвать свою длл. Защититься благо тоже можно, вот здесь есть несколько примеров того, как реализуется правильная защита от инжектов: https://github.com/HoShiMin/Avanguard

    На счет внешних читов. Предотвратить/обнаружить чтение/запись из под драйвера невозможно (без использования гипервизора), единственным вектором обнаружения внешнего чита использующего драйвер, будет детектирование по следующим признакам: создание объектов, способ коммуникации, хэдеры, хуки аля inline/irp, итд, все это в конечном счете приводит к странному участку памяти, который находится вне легетимных модулей.