id: 231 slug: vr-app-anti-piracy-mechanism-implementation title_ru: "Реализация механизмов защиты от пиратства в VR приложениях" tags: [vr-ar]
Реализация механизмов защиты от пиратства в VR приложениях
APK Quest-приложения извлекается с устройства за минуты: adb backup или прямое копирование из /sdcard/Android/obb/. После этого .apk загружается на форумы и устанавливается через sideload без каких-либо покупок. Для платных VR-приложений и корпоративных лицензированных тренажёров это прямые потери. Вопрос не в том, взломают или нет — вопрос в том, насколько дорого это обойдётся злоумышленнику.
Уровни защиты и где они реально работают
Проверка лицензии через платформенный API — первый и самый важный уровень. Для Oculus/Meta Store используется Entitlement Check через Oculus.Platform.Entitlements.IsUserEntitledToApplication(). Это асинхронный запрос к Meta-серверам при старте: если аккаунт не купил приложение — OnNotEntitled callback, приложение завершается. Работает надёжно для приложений из официального стора, но бесполезно для sideloaded APK.
Для SteamVR — ISteamApps.BkInitCallback() + SteamManager с проверкой SteamApps.BIsAppInstalled(AppID). Аналогично: работает только при наличии Steam-клиента и лицензии.
Для корпоративных приложений, распространяемых вне сторов, платформенный API недоступен — нужна собственная лицензионная система.
Собственная активация строится на нескольких принципах:
- Лицензионный ключ привязывается к
SystemInfo.deviceUniqueIdentifier(на Android — ANDROID_ID) + hardware fingerprint - Ключ верифицируется на сервере при первом запуске и периодически (раз в 24–72 часа)
- Сервер хранит список активированных устройств с лимитом активаций на ключ
- При отзыве лицензии (увольнение сотрудника, истёкший контракт) следующая проверка даёт блокировку
Уязвимость offline: если приложение работает без интернета (автономный тренажёр), нужна grace period — допустим, 7 дней без проверки сервера. Длиннее — риск работы с отозванной лицензией.
Обфускация кода через Unity обфускаторы (Obfuscar, BeeByte Obfuscator for Unity) переименовывает классы и методы в IL2CPP-сборке. Полноценная защита от реверса это не даёт — il2cppdumper восстанавливает структуру — но существенно усложняет патчинг конкретной проверки лицензии.
Критически важно: не хранить секреты в клиентском коде. Лицензионный сервер должен быть авторитетом — клиент не должен содержать логику «если флаг X = true, считать активированным». Любой такой флаг можно найти через Memory Editor (GameGuardian) и переключить.
Дополнительные меры для корпоративных VR
Для тренажёров, где контент является конфиденциальным:
Шифрование ассетов. AssetBundle с шифрованием AES-256: ключ не хранится в APK, запрашивается с сервера после успешной авторизации. Без ключа — зашифрованный blob бесполезен.
Integrity Check. При старте вычисляем hash критичных сборок (Application.dataPath) и сравниваем с эталоном на сервере. Модифицированный APK даст несовпадение. Реализуется через System.Security.Cryptography.SHA256.
Runtime Tamper Detection. Проверяем Debug.isDebugBuild, Application.isEditor, наличие root через Android JNI (/system/app/Superuser.apk). При обнаружении — завершение сессии или ограничение функциональности.
Из практики: в корпоративном VR-тренажёре для промышленного предприятия требовалось гарантировать, что контент не покинет устройства. Дополнительно к шифрованию ассетов реализовали запрет скриншотов через Android FLAG_SECURE (WindowManager.LayoutParams.FLAG_SECURE через JNI) — системный скриншот и запись экрана дают чёрный экран.
Этапы работы
Анализ угроз. Определяем, от чего реально нужно защититься: случайный sideload, целенаправленный взлом, утечка конфиденциального контента, несанкционированное использование лицензии.
Выбор уровней защиты. Под каждую угрозу — соответствующий механизм. Не делаем избыточную защиту там, где достаточно платформенного Entitlement Check.
Разработка. Лицензионный сервер (если нужен), клиентская интеграция, шифрование ассетов, integrity checks.
Тестирование. Проверяем все bypass-сценарии: отключение интернета, аккаунт без лицензии, попытка запустить на неактивированном устройстве.
| Уровень защиты | Ориентировочные сроки |
|---|---|
| Платформенный Entitlement Check (Meta/Steam) | 2–4 дня |
| Собственная лицензионная система с сервером | 2–4 недели |
| Шифрование ассетов + integrity + tamper detection | 4–8 недель |
Стоимость рассчитывается после анализа требований к безопасности и типа распространения приложения.





