Розробка системи防作 для мобільних ігор
Шахрайство в мобільних іграх — це не абстрактна загроза. 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 може порушити економіку гри без будь-якого root-доступу.
Перепакування APK. Декомпіляція → модифікація логіки → перепідписування. Шахраї видаляють перевірки покупок, змінюють константи гри, додають автокліки.
Емулятори та ферми ботів. Автоматизовані сесії на емуляторах (LDPlayer, BlueStacks) для фермінгу ресурсів, маніпуляції рейтингом, накопичення внутрішньоігрової валюти для перепродажу.
Авторитет сервера — фундаментальний принцип
Все, що має цінність, обчислюється на сервері. Клієнт надає тільки вхідні дані (дії гравця); сервер обчислює результат. Це не «функція безпеки» — це правильна архітектура.
Конкретно: клієнт не повинен відправляти {gold_earned: X}. Клієнт відправляє {session_id, actions: [...], timestamp} — сервер обчислює, скільки золота зароблено за цими діями. Клієнтські значення ігноруються або використовуються тільки для валідації (розбіжність > N% вказує на підозру на шахрайство).
Для слабо пов'язаних з сервером ігор (idle games, офлайн-прогресія) це вимагає рефакторингу архітектури — серйозне, але вартісне рішення.
Захист пам'яті: шифрування ігрових змінних
Щоб 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_, наявність служби через 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). Build.FINGERPRINT в емуляторах містить generic або unknown.
Серверна валідація
Сервер збирає телеметрію: часові мітки дій, послідовності подій, економічні транзакції. Аномалії: урон, що перевищує максимально можливий, ресурси накопичені швидше, ніж дозволяє ігровий темп, телепортація по карті (позиція змінилася неможливо).
Прості правила: якщо damage_dealt за сесію > max_damage_per_second * session_duration * 1.1 — прапор. Складніше: ML-модель на основі історії нормальних сесій гравців, що виявляє аномальні паттерни.
Реакція: бан проти тіньового бану
Негайний бан помітний — читер створює новий акаунт. Тіньовий бан: читер продовжує грати, але бачить тільки інших читерів або отримує злегка погіршений досвід. Не знає, що забанений. Ефективніше для збереження чистого середовища для чесних гравців.
Технічно: флаг is_suspected_cheater на акаунті, спеціальна пулу матчмейкінгу, уповільнений дроп ресурсів. Повний бан після накопичення достатніх доказів.
Стек та інтеграція
Unity: PACT (Pixfort Anti-Cheat Toolkit), GameShield. Нативний Android/Kotlin — користувацька реалізація з нативним кодом через NDK для критичних перевірок. Серверна сторона (Node.js, Go, Python) — система правил + черга подій (Kafka або RabbitMQ) для аналізу потоку дій.
Для малих ігор базовий захист достатній: виявлення рута/jailbreak + шифрування змінних + авторитет сервера для економіки. Для конкурентних ігор з реальною монетизацією — повна система з ML-виявленням і тіньовим баном. Часова шкала: 1–2 тижні (базовий захист) до 2–3 місяців (повна система з серверною аналітикою). Вартість рассчітується після аналізу архітектури гри та моделі монетизації.







