Статья подготовлена по материалам исследования Hashem Alayed et al., представленного на IEEE Conference on Computational Intelligence in Games (CIG), 2013

В 2013 году команда исследователей под руководством Hashem Alayed предложила воспроизводимую, приватную и высокоточную систему обнаружения читерства в онлайн-шутерах от первого лица (FPS). В отличие от большинства коммерческих античитов, их подход полностью основан на серверных логах и поведенческих признаках, не затрагивая клиентскую память и не нарушая приватность игроков. Ниже — подробный разбор архитектуры, признаков, моделей и результатов, который может послужить практическим руководством для разработчиков.


🎮 Игровая среда и инфраструктура

Для экспериментов была создана собственная игра «Trojan Battles» — онлайн-шутер от первого лица, разработанный с нуля:

  • Клиент: Unity3D
  • Сервер: C#, non-authoritative (не валидирует игровую логику, только маршрутизирует и логирует)
  • Режим: deathmatch на 2–3 игроков, длительность — 10 или 15 минут
  • Сетевой трафик: клиенты отправляют данные на сервер с частотой 15 сообщений в секунду, включая регулярные «heartbeat»-сообщения с позицией, состоянием и информацией о видимых целях
  • Логирование: все данные собираются исключительно на сервере, что делает систему устойчивой к подделке и соответствует требованиям конфиденциальности
  • Читы: реализованы как встроенные опции в клиенте и могут включаться/выключаться игроком вручную во время матча

🧠 Типы читов, использованные в экспериментах

Все читы относятся к категории AimBot, но обладают разной степенью «маскировки»:

Тип Описание
Lock (L) Мгновенное и непрерывное наведение на видимую цель
Auto-Switch (AS) Периодически включает и выключает Lock, чтобы запутать детектор
Auto-Miss (AM) Намеренно промахивается при наведении на цель
Slow-Aim (SA) Плавно наводится на цель, имитируя естественную реакцию человека
Auto-Fire (AF) / TriggerBot Автоматически стреляет, как только прицел оказывается на цели

Все читы могут комбинироваться (например, SA + AM), что значительно усложняет их обнаружение.


📊 Сбор и подготовка данных

  • Проведено 18 матчей: 8 по 10 минут, 10 по 15 минут → около 460 минут игровых данных
  • В 16 матчах: 1 читер + 1 честный игрок
  • В 2 матчах: без читов (для сбора «нормального» поведения)
  • Отдельный тестовый матч: 3 игрока — 1 честный, 2 читера (L и AF)
  • Фильтрация: записи с долей видимых целей менее 5% отбрасывались как шум

Данные разбивались на временные окна длиной 10, 30, 60 и 90 секунд. Для каждого окна извлекался набор из 18 признаков.


📐 Признаки для обучения моделей

Универсальные признаки (применимы и за пределами FPS):

  1. Number of Records — общее число записей в окне
  2. Number of Visible-Target Rows — количество записей с видимой целью
  3. Visible-To-Total Ratio — доля записей с видимой целью
  4. Player’s Movement — влияние движения игрока на прицеливание
  5. Target’s Movement — влияние движения цели на прицеливание
  6. Mean View Directions Change — среднее изменение направления взгляда (через углы Эйлера)
  7. Mean Position Change — среднее перемещение игрока между записями
  8. Mean Target Position Change — среднее перемещение цели (только при видимости)
  9. Mean Distance — среднее расстояние до ближайшей видимой цели

Признаки, специфичные для шутеров от первого лица:

  1. Aiming Accuracy — динамический показатель: растёт экспоненциально при удержании цели, снижается линейно при потере
  2. Mean Aiming Accuracy — доля кадров, в которых игрок целился в видимую цель
  3. Hit Accuracy — доля попаданий среди всех выстрелов (попадания в голову весят больше)
  4. Weapon Influence — учитывает тип оружия, расстояние до цели и использование прицела (zoom)
  5. Fire On Aim Ratio — доля выстрелов при точном наведении на цель
  6. Fire On Visible — доля выстрелов при наличии видимой цели (даже без наведения)
  7. Instant On Visible — использование «мгновенного» оружия (например, дробовика) при видимой цели
  8. Time-To-Hit Rate — время от появления цели до первого попадания

Целевая переменная:

  1. Cheat (Label) — метка класса: если в окне более 50% времени использовался один чит — он и становится меткой; иначе — «normal». При наличии нескольких видимых целей в качестве текущей всегда выбирается ближайшая.

🤖 Модели и обучение

  • Инструмент: Weka (Java-библиотека для интеллектуального анализа данных)
  • Классификаторы:
  • Logistic Regression (простой и интерпретируемый)
  • SVM через алгоритм SMO:
    • SVM-L (линейное ядро, C = 10)
    • SVM-RBF (радиально-базисное ядро, C = 1000)
  • Валидация: 10-кратная перекрёстная проверка (10-fold cross-validation)
  • Оптимальный размер окна: 60 секунд — дал наилучшие результаты в большинстве сценариев

🧪 Четыре стратегии обучения: что работает, а что нет

  1. Многоклассовая классификация (6 классов: L, AS, AM, SA, AF, Normal)
    → Результат: 80.9% точности, но катастрофическая путаница внутри Lock-группы:
    - L: 38% ошибок
    - AS: 57% ошибок
    - AM: 47% ошибок
    - SA: 41% ошибок
    → Модель не различает похожие читы, несмотря на высокую общую точность.

  2. Бинарная классификация (cheat vs normal)
    97.3% точности, 97.2% TPR, FPR = 2.1–2.6%
    → Отличное решение, если не требуется типизировать чит.

  3. Группировка читов:
    - LB (Lock-Based) = {L, AS, AM, SA}
    - AF — отдельно
    - Normal
    98.2% точности, 98.1% TPR для LB, 100% TPR для AF
    +18% точности за счёт отказа от попыток различить L/AS/AM/SA.

  4. Отдельная модель на каждый тип чита (5 бинарных классификаторов)
    Лучшие показатели по TPR:
    - L: 94.1% TPR
    - AS: 97.3% TPR
    - AM: 90.9% TPR
    - SA: 100% TPR
    - AF: 100% TPR

В тесте с 3 игроками:
- L-модель: 96.6% TPR на читере L, 100% на честном игроке
- AF-модель: 100% TPR на читере AF, 96.9% на честном игроке

Параллельный запуск всех моделей даёт максимальную чувствительность и низкий FPR.


📈 Пороговое правило для продакшена

Поскольку в реальных условиях данные не размечены, авторы предлагают использовать пороговое правило:

  • Для матча длительностью 30 минут и окна 60 сек:
    NR = 1800 / 60 = 30 окон
  • При пороге 50%: игрок считается читером, если ≥15 окон помечены как «cheat»

Для одновременного обнаружения разных типов читов:

LBCR = max( NCR(L), NCR(AS), NCR(AM), NCR(SA) )
OverallNCR = LBCR + NCR(AF)

Если OverallNCR ≥ порога → бан. Такой подход позволяет выявлять смену читов в течение матча.


🔍 Ключевые признаки

Ранжирование по важности (метод: квадраты весов SVM-L):

  • Mean Aiming Accuracy — главный признак для всех AimBot-детекторов
  • Для Auto-Fire: Fire On Visible и Fire On Aim
  • При увеличении размера окна ранжирование стабилизируется, но число экземпляров падает

💡 Рекомендации для разработчиков

  1. Используйте окна 30–60 секунд. Окна >60 сек «размывают» эпизодическое читерство.
  2. Собирайте только серверные логи — это безопасно и этично.
  3. Адаптируйте сетевые сообщения под нужды feature extraction: чаще передавайте данные о видимости и наведении.
  4. Избегайте чистой многоклассовой модели — она не справляется с похожими читами.
  5. Предпочитайте отдельные бинарные модели для каждой категории читов или используйте группировку (LB vs AF).
  6. Настраивайте порог детекции в зависимости от политики:
    - 50–70% — мягкий режим (меньше ложных срабатываний)
    - <30% — агрессивный (выше чувствительность, но риск банить про-игроков)

Система, предложенная Hashem Alayed и коллегами, демонстрирует, что высокоточное обнаружение читерства возможно без вторжения в клиент и без нарушения приватности. Ключ к успеху — в качественных поведенческих признаках, умной группировке читов и гибкой пороговой логике. Если вы разрабатываете античит для своего FPS, начните с 60-секундных окон, Mean Aiming Accuracy, Fire On Aim/Visible и отдельных моделей для Lock-группы и Auto-Fire — это проверенный путь к точности выше 95%.