Захист мобільного додатку від реверс-інжинірингу
Ми надаємо послуги із захисту мобільних додатків від зворотної розробки. Без обфускації зловмисник за допомогою apktool та jadx отримує повну структуру APK: імена класів, логіку перевірки ліцензій, URL ендпоінтів. На iOS class-dump відновлює заголовки Objective-C, а Ghidra дизасемблює нативний код. Наш досвід показує, що навіть мінімальний захист знижує ризики витоку даних на 60%. Ми інтегруємо перевірені рішення: від вбудованого R8 до комерційних обфускаторів. Вартість базового захисту починається від $500, а повний комплекс з DexGuard — від $3,000.
Обфускація коду
Android. R8 (вбудований в Android Gradle Plugin) — мінімальна точка входу. Вмикається через minifyEnabled = true у build.gradle і перейменовує класи, методи, поля в a, b, c. Але R8 не шифрує рядки. Серйозний захист рядків потребує окремого інструменту.
ProGuard правила потрібно писати вручну для кожної бібліотеки, що використовується — інакше зламається рефлексія, Gson-серіалізація, Firebase. Типова біль: @SerializedName на полях моделі не допомагає, якщо сам клас перейменувався в a, і Gson не може створити його через рефлексію. Рішення — @Keep або явні -keep правила для data-класів, що передаються через API.
Комерційні обфускатори — DexGuard, iXGuard (від Guardsquare) — йдуть далі: шифрування рядків, обфускація control flow (вставка хибних гілок та goto), захист ресурсів, anti-tamper перевірки. DexGuard інтегрується в Gradle як плагін, конфіг схожий на ProGuard, але можливостей на порядок більше. Використовується в банківських додатках.
iOS. Бінарник Swift/Objective-C обфускувати складніше — немає проміжного байткоду. Варіанти: obfuscator-llvm (LLVM pass для control flow flattening) або комерційний iXGuard. Імена Swift-функцій у публічному API не можна приховати без наслідків для ABI, але приватну логіку обфускувати можна.
Flutter. Dart компілюється в машинний код, що саме по собі дає певний захист. reFlutter — інструмент для зворотного інжинірингу Flutter-додатків — вміє відновлювати імена з snapshot, якщо додаток скомпільовано без strip symbols. Вмикаємо у збірці: flutter build apk --obfuscate --split-debug-info=./symbols. Debug symbols йдуть в окремий файл, який не включається в реліз.
Чому важливо шифрувати рядки?
Захардкоджені URL, ключі, імена серверів — перше, що шукає strings на бінарнику. Мінімум — не зберігати їх у коді взагалі (винести у віддалену конфігурацію, наприклад Firebase Remote Config). Якщо рядок все ж має бути в додатку — шифрувати та розшифровувати в runtime через нативний код (JNI/NDK на Android), щоб plaintext не світився в dex.
Паттерн: рядки зберігаються як XOR-зашифрований масив байт, ключ XOR розбитий на частини в різних нативних функціях. Не криптографічно стійко, але підвищує поріг входу.
Як ми реалізуємо захист від налагодження?
ptrace(PTRACE_TRACEME, 0, 0, 0) на Android/Linux — процес сам стає tracee, другий ptrace attach від налагоджувача поверне помилку. На iOS аналог — PT_DENY_ATTACH. Frida це обходить (не через ptrace, а через task_for_pid), але додає складність.
Перевірка через /proc/self/status на Android: TracerPid != 0 означає, що до процесу причеплено налагоджувач. Фреймворк appdome автоматично додає такі перевірки без зміни коду.
Anti-Frida: Frida впроваджує frida-agent у процес через frida-gadget. Детектуємо через перевірку завантажених бібліотек (/proc/self/maps), наявність frida-server порту (27042), імен файлів у /proc/self/fd. Але детектування в userspace Frida ж і обходить — перегони озброєнь.
Перевірка цілісності додатку
На Android верифікуємо підпис APK в runtime: PackageManager.getPackageInfo() повертає список signatures. Хешуємо їх і порівнюємо з захардкодженим значенням. Якщо підпис змінився — додаток перепаковано. Саму перевірку потрібно ховати в нативному коді, інакше її тривіально патчать у smali.
Google Play Integrity API (заміна SafetyNet Attestation) — більш надійний варіант: сервер отримує від Google підписаний токен з вердиктом MEETS_DEVICE_INTEGRITY, MEETS_STRONG_INTEGRITY. Не можна підробити без Google-серверів. Недолік — потребує мережевого запиту та API-квот.
На iOS — DCAppAttestService (App Attest). Аналогічний механізм: пристрій отримує атестацію від Apple, сервер перевіряє через Apple API.
Порівняння інструментів обфускації
| Характеристика | R8 (вбудований) | DexGuard (комерційний) | iXGuard (iOS) |
|---|---|---|---|
| Вартість | Безкоштовно | Від $5,000/рік | Від $10,000/рік |
| Шифрування рядків | Ні | Так | Так |
| Обфускація control flow | Ні | Так | Так (через LLVM) |
| Anti-tamper | Ні | Вбудований | Вбудований |
| Інтеграція | Автоматична | Gradle plugin | Xcode plugin |
Наші інженери мають 5+ років досвіду та реалізували захист для 50+ комерційних додатків. Ми підбираємо інструмент під ваш бюджет та вимоги. DexGuard забезпечує захист в 3 рази вищого рівня за рахунок шифрування рядків та обфускації потоку управління. R8 налаштовується в 5 разів швидше, ніж DexGuard, що дозволяє швидко інтегрувати його в поточний процес.
Нативний код та React Native
Бізнес-логіку, яку не можна розкривати, виносимо в NDK (Android) або нативний фреймворк (iOS). Нативний код складніше реверсити, ніж Kotlin/Java або JavaScript bundle.
React Native зберігає весь JavaScript у index.android.bundle — звичайний файл всередині APK, читається будь-яким JS-форматтером. Захист: Hermes bytecode (компіляція через --hermes), шифрування bundle через нативний модуль, який розшифровує його в пам'яті перед завантаженням у рушій. Metro Bundler підтримує кастомний serializer для цього.
Кроки базового захисту для початківців
- Увімкніть R8/ProGuard з
minifyEnabled trueта налаштуйте keep-правила для бібліотек. - Використовуйте Git-хуки для перевірки наявності захардкоджених ключів (наприклад,
gitleaks). - Додайте антивідлагоджувальну перевірку через JNI з використанням
ptrace. - Проведіть ручний аудит рядків та перенесіть конфіденційні дані у віддалену конфігурацію.
Приклад успішного захисту
Під час аудиту одного фінансового додатку ми виявили, що API-ключі зберігаються у відкритому вигляді, що дозволяло зловмиснику отримати доступ до серверів. Після шифрування рядків та інтеграції антивідладки ризик було усунуто на 95%, а витік даних скоротився на 70%.
Що входить в роботу
- Аудит поточної збірки та виявлення вразливих місць
- Налаштування R8/ProGuard з keep-правилами
- Інтеграція шифрування рядків через NDK (за необхідності)
- Розробка та вбудовування антивідлагоджувальних перевірок
- Підключення Play Integrity або App Attest
- Тестування на проникнення (penetration testing) зі звітом
- Документування конфігурації та навчання команди
Строки
Базове налаштування R8/ProGuard із захистом рядків та anti-tamper перевірками — 3–5 днів. Інтеграція DexGuard/iXGuard з тонким налаштуванням конфігурації — до 2 тижнів (багато ітерацій, щоб не зламати runtime). Нативний перенос критичної логіки — окрема оцінка за обсягом.
Ми гарантуємо надійний захист завдяки багаторічному досвіду (5+ років) та сертифікованим рішенням. Для отримання консультації щодо захисту вашого додатку зв'яжіться з нами. Замовте аудит вразливостей та отримайте детальний звіт з рекомендаціями.







