Разработка античит-системы для мобильной игры
Читер в мобильной игре — это не абстрактная угроза. GameGuardian на Android меняет значения памяти в реальном времени: у персонажа бесконечное золото, бесконечные патроны, нулевой откат способностей. Lucky Patcher перепаковывает APK, убирает проверки покупок. Cheat Engine через USB-отладку меняет внутриигровые переменные. В играх с PvP-составляющей или монетизацией через внутриигровую валюту это прямые потери — игровой баланс ломается, честные игроки уходят, конверсия в покупки падает.
Анализ вектора атак
Прежде чем писать защиту, нужно понять, что именно атакуют.
Память процесса. Самое частое: поиск значения в памяти, его изменение. GameGuardian и аналоги работают именно так — сканируют виртуальную память процесса, находят значение (например, 1000 золота), модифицируют. Работает на рутованных устройствах и через отладочный интерфейс.
Трафик. MITM-атака на незащищённый API: клиент отправляет {damage: 500, gold_earned: 100} — подменяем на {damage: 50000, gold_earned: 99999}. Если сервер доверяет клиентским значениям — читер с Burp Suite меняет экономику игры без всякого рута.
Перепаковка APK. Декомпиляция → изменение логики → переподпись. Убирают проверки покупок, меняют константы игровых параметров, добавляют автокликеры.
Эмуляторы и фарм-боты. Автоматизированные сессии на эмуляторах (LDPlayer, BlueStacks) для фарминга ресурсов, накрутки рейтинга, накопления внутриигровой валюты для продажи.
Серверная авторитетность — главный принцип
Всё, что имеет ценность — считается на сервере. Клиент предоставляет только входные данные (действия игрока), сервер считает результат. Это не «функция безопасности» — это правильная архитектура.
Конкретно: клиент не должен отправлять {gold_earned: X}. Клиент отправляет {session_id, actions: [...], timestamp} — сервер рассчитывает, сколько золота заработано по этим действиям. Клиентское значение игнорируется или используется только для валидации (расхождение > N% — подозрение на чит).
Для слабосвязанных с сервером игр (idle games, offline-прогрессия) это требует рефакторинга архитектуры — серьёзное, но окупаемое решение.
Защита памяти: шифрование игровых переменных
Чтобы GameGuardian не нашёл значение 1000 в памяти — не хранить его как int 1000. Обёртка с XOR-шифрованием:
public class SecureInt {
private int encryptedValue;
private int key;
public SecureInt(int value) {
this.key = new Random().nextInt();
this.encryptedValue = value ^ key;
}
public int get() {
return encryptedValue ^ key;
}
public void set(int value) {
this.key = new Random().nextInt(); // меняем ключ при каждом set
this.encryptedValue = value ^ key;
}
}
В памяти хранится encryptedValue, который меняется при каждом присвоении. GameGuardian сканирует конкретное значение — не находит. Для Unity: есть готовые решения типа ObscuredInt из Pixfort Anti-Cheat Toolkit (PACT), который делает именно это.
Дополнительно: контрольная копия в другом месте памяти с другим XOR-ключом. Периодически сравниваем: если значения расходятся — внешняя модификация памяти.
Детектирование читерских инструментов
GameGuardian. Проверяем наличие пакета catch_.me_.if_.you_.can_ (его packageName), наличие сервиса через ActivityManager.getRunningServices(), процессов через /proc/ файловую систему. GameGuardian также часто требует рут — детектирование рута как дополнительный слой.
Обнаружение отладчика. android.os.Debug.isDebuggerConnected() — стандартный метод. TracerPid в /proc/self/status != 0. Для нативного кода — ptrace(PTRACE_TRACEME) трюк. Отладчик нужен для пошагового изменения переменных и понимания логики.
Скорость ввода. Клик-ферма: интервалы между нажатиями слишком равномерны, нет вариативности человеческого ввода. Серверная статистика: медиана и стандартное отклонение времени между действиями. Аномальная равномерность — подозрение на бота.
Детектирование эмулятора. BlueStacks, LDPlayer, NoxPlayer — у каждого артефакты: специфичные BuildProp значения (ro.product.model, ro.hardware), специфичные пути файловой системы, характеристики GPU (через OpenGL renderer string). Build.FINGERPRINT у эмуляторов содержит generic или unknown.
Валидация на сервере
Серверная сторона собирает телеметрию: временны́е метки действий, последовательности событий, экономические транзакции. Аномалии: урон больше максимально возможного, ресурсы накоплены быстрее чем позволяет игровой темп, телепортация по карте (позиция изменилась невозможным образом).
Простые правила: если damage_dealt за сессию > max_damage_per_second * session_duration * 1.1 — флаг. Сложнее: ML-модель на основе истории сессий нормальных игроков, которая детектирует аномальные паттерны.
Реагирование: бан vs shadow ban
Немедленный бан заметен — читер создаёт новый аккаунт. Shadow ban: читер продолжает играть, но видит только других читеров или получает незначительно ухудшенный опыт. Не знает, что забанен. Эффективнее для сохранения чистой среды для честных игроков.
Технически: флаг is_suspected_cheater на аккаунте, специальный matchmaking pool, замедленный дроп ресурсов. Полный бан — после накопления достаточных доказательств.
Стек и интеграция
Unity: PACT (Pixfort Anti-Cheat Toolkit), GameShield. Нативный Android/Kotlin — собственная реализация с нативным кодом через NDK для критичных проверок. Серверная часть (Node.js, Go, Python) — система правил + очередь событий (Kafka или RabbitMQ) для анализа потока действий.
Для небольших игр достаточно базовой защиты: root/jailbreak detection + шифрование переменных + серверная авторитетность для экономики. Для конкурентных игр с реальной монетизацией — полная система с ML-детектированием и shadow ban. Сроки: от 1–2 недель (базовая защита) до 2–3 месяцев (полная система с серверной аналитикой). Стоимость рассчитывается после анализа архитектуры игры и модели монетизации.







