Статья подготовлена по материалам исследования 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):
- Number of Records — общее число записей в окне
- Number of Visible-Target Rows — количество записей с видимой целью
- Visible-To-Total Ratio — доля записей с видимой целью
- Player’s Movement — влияние движения игрока на прицеливание
- Target’s Movement — влияние движения цели на прицеливание
- Mean View Directions Change — среднее изменение направления взгляда (через углы Эйлера)
- Mean Position Change — среднее перемещение игрока между записями
- Mean Target Position Change — среднее перемещение цели (только при видимости)
- Mean Distance — среднее расстояние до ближайшей видимой цели
Признаки, специфичные для шутеров от первого лица:
- Aiming Accuracy — динамический показатель: растёт экспоненциально при удержании цели, снижается линейно при потере
- Mean Aiming Accuracy — доля кадров, в которых игрок целился в видимую цель
- Hit Accuracy — доля попаданий среди всех выстрелов (попадания в голову весят больше)
- Weapon Influence — учитывает тип оружия, расстояние до цели и использование прицела (zoom)
- Fire On Aim Ratio — доля выстрелов при точном наведении на цель
- Fire On Visible — доля выстрелов при наличии видимой цели (даже без наведения)
- Instant On Visible — использование «мгновенного» оружия (например, дробовика) при видимой цели
- Time-To-Hit Rate — время от появления цели до первого попадания
Целевая переменная:
- Cheat (Label) — метка класса: если в окне более 50% времени использовался один чит — он и становится меткой; иначе — «normal». При наличии нескольких видимых целей в качестве текущей всегда выбирается ближайшая.
🤖 Модели и обучение
- Инструмент: Weka (Java-библиотека для интеллектуального анализа данных)
- Классификаторы:
- Logistic Regression (простой и интерпретируемый)
- SVM через алгоритм SMO:
- SVM-L (линейное ядро, C = 10)
- SVM-RBF (радиально-базисное ядро, C = 1000)
- Валидация: 10-кратная перекрёстная проверка (10-fold cross-validation)
- Оптимальный размер окна: 60 секунд — дал наилучшие результаты в большинстве сценариев
🧪 Четыре стратегии обучения: что работает, а что нет
-
Многоклассовая классификация (6 классов: L, AS, AM, SA, AF, Normal)
→ Результат: 80.9% точности, но катастрофическая путаница внутри Lock-группы:
- L: 38% ошибок
- AS: 57% ошибок
- AM: 47% ошибок
- SA: 41% ошибок
→ Модель не различает похожие читы, несмотря на высокую общую точность. -
Бинарная классификация (cheat vs normal)
→ 97.3% точности, 97.2% TPR, FPR = 2.1–2.6%
→ Отличное решение, если не требуется типизировать чит. -
Группировка читов:
- LB (Lock-Based) = {L, AS, AM, SA}
- AF — отдельно
- Normal
→ 98.2% точности, 98.1% TPR для LB, 100% TPR для AF
→ +18% точности за счёт отказа от попыток различить L/AS/AM/SA. -
Отдельная модель на каждый тип чита (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
- При увеличении размера окна ранжирование стабилизируется, но число экземпляров падает
💡 Рекомендации для разработчиков
- Используйте окна 30–60 секунд. Окна >60 сек «размывают» эпизодическое читерство.
- Собирайте только серверные логи — это безопасно и этично.
- Адаптируйте сетевые сообщения под нужды feature extraction: чаще передавайте данные о видимости и наведении.
- Избегайте чистой многоклассовой модели — она не справляется с похожими читами.
- Предпочитайте отдельные бинарные модели для каждой категории читов или используйте группировку (LB vs AF).
- Настраивайте порог детекции в зависимости от политики:
- 50–70% — мягкий режим (меньше ложных срабатываний)
- <30% — агрессивный (выше чувствительность, но риск банить про-игроков)
Система, предложенная Hashem Alayed и коллегами, демонстрирует, что высокоточное обнаружение читерства возможно без вторжения в клиент и без нарушения приватности. Ключ к успеху — в качественных поведенческих признаках, умной группировке читов и гибкой пороговой логике. Если вы разрабатываете античит для своего FPS, начните с 60-секундных окон, Mean Aiming Accuracy, Fire On Aim/Visible и отдельных моделей для Lock-группы и Auto-Fire — это проверенный путь к точности выше 95%.