Разработка AI-системы детекции читерства Anti-Cheat AI

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы детекции читерства Anti-Cheat AI
Сложная
~2-4 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Разработка AI-системы детекции читерства Anti-Cheat AI

Игровой чит — это гонка вооружений: читеры адаптируются к детекции быстрее, чем разработчики пишут сигнатуры. AI-системы сместили баланс: поведенческий анализ обнаруживает читерство по аномальному поведению, а не по конкретному инструменту.

Типология читерства и методы детекции

Классификация по типу:

cheat_categories = {
    'aimbot': {
        'signatures': ['instant_target_acquisition', 'superhuman_accuracy',
                       'head_only_shots', 'tracking_through_walls'],
        'detection': 'mouse_movement_statistics + aim_curve_analysis'
    },
    'wallhack': {
        'signatures': ['preemptive_aiming_before_visible',
                       'shooting_at_enemy_position_before_reveal',
                       'unusual_rotation_to_enemies_behind_cover'],
        'detection': 'player_vs_enemy_visibility_analysis'
    },
    'speedhack': {
        'signatures': ['position_delta_exceeds_physics',
                       'animation_speed_mismatch'],
        'detection': 'server_side_movement_validation'
    },
    'triggerbot': {
        'signatures': ['fire_delay_too_consistent', '0ms_reaction_on_crosshair'],
        'detection': 'reaction_time_distribution_analysis'
    },
    'radar_hack': {
        'signatures': ['positioning_correlates_with_enemy_map_positions'],
        'detection': 'behavioral_correlation_analysis'
    }
}

Анализ движения мыши (Aimbot Detection)

Статистика прицеливания:

import numpy as np
from scipy import stats
import pandas as pd

def analyze_mouse_movement(aim_trajectory: np.ndarray,
                            target_positions: np.ndarray,
                            sampling_rate: int = 128) -> dict:
    """
    aim_trajectory: (N, 2) массив позиций прицела по времени
    target_positions: (N, 2) позиции ближайшей цели
    """
    # Скорость курсора
    velocities = np.diff(aim_trajectory, axis=0) * sampling_rate
    speeds = np.linalg.norm(velocities, axis=1)

    # Признаки нормального игрока
    speed_cv = np.std(speeds) / (np.mean(speeds) + 1e-9)  # коэффициент вариации
    jerk = np.diff(velocities, axis=0)  # рывки (2-я производная)
    jerk_magnitude = np.linalg.norm(jerk, axis=1)

    # Aimbot сигнатуры
    snap_indices = np.where(speeds > np.percentile(speeds, 99))[0]
    snap_events = len(snap_indices)

    # Если прицел буквально "прыгает" к голове — instant snap
    if len(target_positions) > 0:
        errors_before_snap = []
        errors_after_snap = []
        for snap_idx in snap_indices:
            if snap_idx > 0 and snap_idx < len(aim_trajectory) - 1:
                before = np.linalg.norm(aim_trajectory[snap_idx-1] - target_positions[snap_idx-1])
                after = np.linalg.norm(aim_trajectory[snap_idx] - target_positions[snap_idx])
                errors_before_snap.append(before)
                errors_after_snap.append(after)

        avg_error_before = np.mean(errors_before_snap) if errors_before_snap else 0
        avg_error_after = np.mean(errors_after_snap) if errors_after_snap else 0
        snap_improvement = (avg_error_before - avg_error_after) / (avg_error_before + 1e-9)
    else:
        snap_improvement = 0

    # Сравнение с распределением честных игроков (из reference dataset)
    # Kurtosis движения: aimbot = высокий (резкие движения), человек = меньше
    aim_kurtosis = stats.kurtosis(speeds)

    aimbot_score = (
        0.3 * min(1, snap_events / 50) +          # частые снапы
        0.3 * min(1, snap_improvement) +           # точность после снапа
        0.2 * min(1, max(0, aim_kurtosis - 5) / 20) +  # нечеловеческий куртозис
        0.2 * max(0, 1 - speed_cv)                 # слишком равномерное движение
    )

    return {
        'aimbot_score': round(aimbot_score, 3),
        'snap_events': snap_events,
        'aim_kurtosis': round(aim_kurtosis, 2),
        'speed_cv': round(speed_cv, 3),
        'snap_accuracy_improvement': round(snap_improvement, 3)
    }

Реакция и timing анализ

Triggerbot Detection:

def analyze_reaction_times(kill_events: pd.DataFrame) -> dict:
    """
    Реакция человека: 150-400 мс с нормальным распределением.
    Triggerbot: 0-5 мс, слишком постоянное (низкий CV).
    """
    reaction_times = kill_events['reaction_time_ms'].values

    # Описательная статистика
    mean_rt = np.mean(reaction_times)
    std_rt = np.std(reaction_times)
    cv_rt = std_rt / (mean_rt + 1e-9)
    min_rt = np.min(reaction_times)

    # Тест: является ли распределение нормальным?
    _, normality_p = stats.shapiro(reaction_times[:50])  # W-тест Шапиро

    # Human reaction time модель: логнормальное распределение
    # Среднее для шутеров: 200-250 мс, STD ~ 40 мс
    triggerbot_flags = []

    if min_rt < 20:  # < 20 мс = нечеловечески быстро
        triggerbot_flags.append('ultra_fast_reaction')
    if cv_rt < 0.05:  # слишком стабильная реакция
        triggerbot_flags.append('suspicious_consistency')
    if mean_rt < 80:  # систематически быстрее человеческого минимума
        triggerbot_flags.append('below_human_threshold')

    triggerbot_score = len(triggerbot_flags) / 3

    return {
        'mean_reaction_ms': round(mean_rt, 1),
        'std_reaction_ms': round(std_rt, 1),
        'cv': round(cv_rt, 3),
        'min_reaction_ms': round(min_rt, 1),
        'triggerbot_score': triggerbot_score,
        'flags': triggerbot_flags
    }

Поведенческий анализ (Wallhack, Macro)

Обнаружение wallhack через корреляцию позиций:

def detect_wallhack_behavior(player_data: pd.DataFrame,
                               game_events: pd.DataFrame) -> dict:
    """
    Честный игрок поворачивается к врагу ПОСЛЕ того, как видит его.
    Wallhack: поворот к скрытому врагу раньше, чем он становится видимым.
    """
    suspicious_events = []

    for _, event in game_events[game_events['event_type'] == 'enemy_spot'].iterrows():
        enemy_visible_time = event['visible_timestamp']
        player_tracking = player_data[
            (player_data['timestamp'] >= enemy_visible_time - 2) &
            (player_data['timestamp'] <= enemy_visible_time)
        ]

        if len(player_tracking) > 0:
            # Направление взгляда до видимости врага
            direction_before = player_tracking.iloc[0]['view_direction']
            enemy_direction = event['enemy_direction']
            angle_error = abs(direction_before - enemy_direction)
            angle_error = min(angle_error, 360 - angle_error)

            # Если игрок смотрит в сторону врага ДО его видимости
            if angle_error < 15:  # в пределах 15 градусов
                time_before_visible = enemy_visible_time - player_tracking.iloc[0]['timestamp']
                if time_before_visible > 0.5:  # больше 500 мс до видимости
                    suspicious_events.append({
                        'event_id': event['event_id'],
                        'time_before_visible': time_before_visible,
                        'angle_error': angle_error
                    })

    wallhack_score = len(suspicious_events) / max(len(game_events), 1)
    return {
        'wallhack_score': round(wallhack_score, 3),
        'suspicious_events': suspicious_events,
        'wallhack_detected': wallhack_score > 0.3
    }

Сессионная ML-модель

Агрегированные признаки за матч:

from xgboost import XGBClassifier

def build_session_cheat_classifier(match_features_db: pd.DataFrame) -> XGBClassifier:
    """
    Признаки за весь матч: headshot ratio, accuracy, position accuracy,
    kill assist patterns, movement entropy.
    """
    session_features = [
        'headshot_ratio', 'accuracy_pct', 'kd_ratio',
        'aimbot_score_avg', 'triggerbot_score_avg', 'wallhack_score_avg',
        'movement_entropy',         # разнообразие движений
        'position_change_rate',     # стремительное позиционирование
        'death_position_entropy',   # от чего умирает (разнообразие vs. одна точка)
        'spray_control_score'       # управление разбросом ствола
    ]

    model = XGBClassifier(
        n_estimators=300,
        scale_pos_weight=20,  # читеры < 5% базы
        eval_metric='aucpr'
    )
    model.fit(
        match_features_db[session_features],
        match_features_db['confirmed_cheater']
    )
    return model

Обход анти-чита и защита

Состязательная устойчивость: Читеры добавляют случайный шум к движениям мыши — симуляция человека. Контрмеры: глубокие поведенческие признаки (микровибрации, паттерны переключения оружия), graph-based: взаимодействие с другими игроками — читеры игнорируют "случайных" игроков. Community reporting: высокое число жалоб → усиленное расследование.

Сроки: Базовая сигнатурная детекция + aimbot score + сессионный XGBoost — 4-5 недель. Wallhack поведенческий анализ, adversarial robustness, client-side телеметрия, replay analysis — 3-4 месяца.