Reverse Engineering в мобільній розробці: що це таке, інструменти та методи аналізу

Автор: IT Sectr Опубліковано: 2026-04-04 Час читання: 10 хв

Reverse Engineering (зворотна розробка) — відновлення логіки та структури мобільного додатку без доступу до вихідного коду. В контексті Android та iOS це означає декомпіляцію DEX/APK та Mach-O/IPA бінарних файлів для вилучення алгоритмів, ключів шифрування, API-ендпоінтів та бізнес-логіки. За даними Veracode Security Research (2025), понад 60% мобільних додатків у top-200 містять хоча б один індикатор, що спрощує reverse engineering. Reverse Engineering застосовується не лише для атак, але й для аудиту безпеки, патентного аналізу та тестування на проникнення.

Головне

  • Reverse Engineering — процес аналізу бінарного коду додатку для відновлення його логіки, даних та алгоритмів без доступу до вихідників
  • Статичний аналіз включає декомпіляцію DEX/APK через jadx, байткод iOS через Ghidra та читання ресурсів через apktool
  • Динамічний аналіз виконується через Frida, Objection та Xposed для перехоплення викликів у runtime без зупинки додатку
  • Захист від реверсу будується на обфускації (ProGuard, DexGuard), шифруванні рядків, RASP-агентах та контролі цілісності APK
  • Правовий статус reverse engineering варіюється: DMCA дозволяє для сумісності та безпеки, але забороняє обхід ліцензій та DRM

Що таке Reverse Engineering?

Reverse Engineering (зворотна розробка) — дисципліна аналізу програмного забезпечення, спрямована на відновлення характеристик, логіки та структури додатку з його бінарного представлення. Для мобільних додатків об’єктами аналізу виступають APK-файли (Android) та IPA-файли (iOS), що містять скомпільований код, ресурси, маніфести та сертифікати. Результат реверсу — виокремлення алгоритмів, протоколів, ключів шифрування, API-схем та бізнес-логіки.

Цілі зворотної розробки поділяються на легітимні та нелегітимні. Легітимні: аналіз шкідливого ПЗ для створення засобів захисту, аудит власних додатків на вразливості, забезпечення сумісності з закритими протоколами, патентний аналіз та навчання. Нелегітимні: крадіжка інтелектуальної власності, обхід ліцензійних обмежень, створення піратських копій та модифікація додатку для крадіжки даних користувачів. За даними Google Play Protect (2025), 78% шкідливих модифікацій банківських додатків створюються на основі оригінального APK, пропущеного через reverse engineering.

Методологія реверсу включає два основні напрями: статичний аналіз (без запуску додатку) та динамічний аналіз (під час виконання). Кожен підхід дає різний рівень інформації. Статичний — повну картину коду, але без даних часу виконання. Динамічний — реальну поведінку, потік даних, мережеві виклики, але лише в рамках конкретного сценарію виконання. Професійний реверсінг завжди комбінує обидва підходи.

Інструменти статичного аналізу

Статичний аналіз — перший етап зворотної розробки. Вихідний APK або IPA розпаковується, і кожен компонент аналізується окремо. Основні цілі: DEX-байткод, ресурси, маніфест, нативні бібліотеки (.so, .dylib) та метадані.

jadx — декомпілятор DEX в Java

jadx — основний інструмент для статичного аналізу Android-додатків. Він перетворює DEX-байткод на читабельний Java-код з мінімальними втратами. jadx підтримує: декомпіляцію multidex, розпізнавання лямбд та вбудованих класів Kotlin, експорт у Gradle-проект. Для обфускованого коду (ProGuard) jadx показує код з іменами a, b, c, але структура класів та послідовність викликів зберігається. За даними незалежного тестування, jadx коректно декомпілює 85–92% коду навіть з обфускацією.

apktool — розпаковка ресурсів

apktool декодує APK в smali-код (асемблер DEX) та відновлює ресурси в читабельному вигляді: AndroidManifest.xml перетворюється з AXML у читабельний XML, layouts — у XML-розмітку, strings.xml — у plain text. apktool дозволяє модифікувати ресурси та перезібрати APK. Після розпаковки через apktool та підміни ресурсів додаток можна встановити з модифікованим вмістом.

Ghidra — аналіз нативних бібліотек

Ghidra (NSA) — фреймворк reverse engineering, незамінний для аналізу .so-бібліотек Android та .dylib iOS. Ghidra дизасемблює ARM64 код, відновлює псевдокод C та будує граф викликів. Для мобільного реверсінгу Ghidra використовується для аналізу нативних реалізацій криптографії та DRM-механізмів. Ghidra підтримує скриптинг на Python та Java для автоматизації аналізу.

bash
# Розпаковка та декомпіляція APK
$ jadx -d output_dir app.apk

# Розпаковка ресурсів через apktool
$ apktool d app.apk -o app_unpacked

# Аналіз нативної бібліотеки через Ghidra
$ ghidra app.apk/lib/arm64-v8a/libnative.so

# Пошук рядкових констант в DEX
$ strings classes.dex | grep -i api_key

Інструменти динамічного аналізу

Динамічний аналіз виконується на запущеному додатку. Аналізатор підключається до процесу та перехоплює виклики функцій, аргументи та значення, що повертаються, в реальному часі.

Frida — універсальний інструмент інструментації

Frida — провідний інструмент динамічного аналізу мобільних додатків. Frida впроваджує JavaScript-движок у процес додатку (Android ART або iOS app) та дозволяє перехоплювати виклики як Java/Objective-C, так і C/C++ функцій. За допомогою Frida реверс-інженери можуть: логувати всі виклики методу AES.decrypt() з параметрами, підміняти return value на довільний, знімати SSL-pinning через Universal Android SSL Unpin, трасувати нативні виклики через Stalker. Frida працює без модифікації APK/IPA, що робить її незамінною для тестування на проникнення.

Objection — надбудова над Frida

Objection надає готові команди для типових задач реверсінгу без написання JavaScript-скриптів: disable-pinning (відключення SSL pinning), dump-keychain (iOS), explore (обхід ієрархії класів), memory search (пошук рядків у пам’яті). Objection дозволяє виконати повний динамічний аналіз без єдиного рядка коду. Для iOS додатків Objection автоматично знаходить та логує виклики NSURLSession, CFNetwork та NSKeyedArchiver.

Xposed Framework

Xposed — фреймворк для Android, що працює шляхом заміни файлу app_process в Zygote. На відміну від Frida, Xposed не вимагає root-доступу після встановлення. Xposed модулі можуть перехоплювати виклики методів у будь-якому додатку. Для реверсінгу Xposed зручний довгостроковим аналізом: модуль встановлюється та працює постійно, логуючи поведінку додатку в різних сценаріях. Xposed підтримує Android до версії 8.1; для Android 9+ використовується EdXposed на базі SandHook.

js
// Frida: перехоплення методу decrypt() в додатку
let aesClass = Java.use("javax.crypto.Cipher");

aesClass.doFinal.overload(
    "[B", "int", "int"
).implementation = function(
    input, offset, len
) {
    console("[AES] decrypt called, len=" + len);
    return this.doFinal(input, offset, len);
};

Процес зворотної розробки Android-додатку

Standard workflow реверсінгу складається з послідовних кроків, кожен з яких дає певний рівень інформації.

Крок 1: Збір розвідданих

Аналізатор вивчає APK на рівні метаданих: targetSdk, uses-permission (які дозволи запитує), intent-filter та exported components. За дозволами можна визначити, які API використовуються (android.permission.CAMERA → камера, android.permission.RECORD_AUDIO → аудіо). За exported activity визначаються точки входу без авторизації. Цей етап виконується через aapt або ApkAnalyzer та займає 1–2 хвилини.

Крок 2: Декомпіляція DEX

APK розпаковується, classes.dex (або multidex) подається на вхід jadx. На виході — Java/Kotlin код в пакетах. Аналізатор шукає ключові класи: CryptoUtils, ApiClient, AuthManager, DatabaseHelper, та перевіряє, які алгоритми використовуються. Якщо в коді зустрічаються рядки AES/CBC/PKCS5Padding — додаток використовує шифрування, і потрібно знайти ключ. На цьому етапі визначаються: хардкоджені ключі, API-URL, OAuth-токени та секрети. Без обфускації весь код додатку читається як звичайний Java-проект.

Крок 3: Аналіз трафіку

Налаштувавши Frida або Objection для відключення SSL-pinning, аналізатор запускає додаток та перехоплює мережевий трафік через Burp Suite або mitmproxy. За даними трафіку відновлюється API-схема: які ендпоінти, які параметри, в якому форматі. При можливості аналізатор модифікує запити та перевіряє реакцію сервера на некоректні або шкідливі дані. Відсутність серверної валідації — пряма вразливість, виявлена на цьому кроці.

Крок 4: Запис у data.json

Результати аналізу фіксуються в структурованому вигляді. Для кожного знайденого вразливого місця вказується: клас та метод, опис вразливості, вектор експлуатації та рекомендація щодо виправлення. Цей дата-сет передається команді розробки або використовується для складання пентест-звіту. В автоматизованих середовищах (MobSF) звіт генерується автоматично за підсумками статичного та динамічного аналізу.

Особливості reverse engineering iOS-додатків

Reverse engineering iOS-додатків складніший за Android через більш жорстку архітектуру безпеки Apple та відсутність прямого доступу до файлової системи на stock-пристроях. Для аналізу iOS потрібен jailbreak.

Статичний аналіз Mach-O

IPA-архів містить Mach-O бінарник — універсальний формат виконуваних файлів Apple. Для декомпіляції використовується Hopper Disassembler або IDA Pro. На відміну від Android DEX, який декомпілюється в Java з мінімальними втратами, Mach-O містить нативний ARM64 код, який відновлюється в псевдокод C з меншою точністю. Hopper справляється з 60–70% відновлення, решту доводиться аналізувати на рівні асемблера.

Динамічний аналіз з Frida для iOS

Frida на iOS вимагає jailbreak та встановлення frida-server. Після підключення Frida перехоплює Objective-C методи через API message routing. Для iOS-додатків типовий сценарій: перехоплення методів NSURLSession.dataTaskWithRequest для логування HTTP-запитів, перехоплення NSKeyedUnarchiver для аналізу серіалізованих даних та трасування CoreData запитів через frida-trace. Frida стала доступна для iOS 15–17 з виходом джейлбрейка Dopamine.

IPA-модифікація

Реверсінг може включати модифікацію IPA з подальшою перепаковкою та встановленням на пристрій. Інструменти: ipatool для розпаковки, MachOView для перегляду секцій та optool для впровадження коду. Після модифікації IPA підписується через ldid або fastlane sigh для встановлення на джейлбрейкнутий пристрій. Для iOS 16+ код-підпис перевіряється на рівні Secure Enclave, і модифікований IPA не запуститься на non-jailbroken пристрої.

js
// Frida: перехоплення HTTP-запитів в iOS додатку
if (ObjC.available) {
    let NSURLSession = ObjC.classes.NSURLSession;
    let dataTaskWithRequest = ObjC.protocol("NSURLSessionDelegate")
        .method("- URLSession:dataTask:didReceiveData:");
    Interceptor.attach(dataTaskWithRequest.implementation, {
        onEnter(args) {
            let data = ObjC.Object(args[3]);
            console("[HTTP Response]", data.toString());
        }
    });
}

Методи захисту від reverse engineering

Захист від зворотної розробки будується за принципом layered security: жоден метод не забезпечує 100% захисту, але комбінація робить реверсінг економічно недоцільним.

Обфускація коду

Базовий рівень — ProGuard для Android, який замінює імена класів та методів на односимвольні. Для посилення використовується DexGuard, що додає overload induction (кілька методів з різними сигнатурами та одним іменем) та шифрування рядків AES-256. Обфускація збільшує час аналізу коду з 5 хвилин до 5–20 годин залежно від рівня. DexGuard додатково заплутує flow управління, роблячи код нечитабельним для jadx.

Шифрування констант

Всі рядкові константи — URL, ключі, токени, SQL-запити — шифруються на етапі збірки та розшифровуються в runtime. Це захищає від статичного аналізу strings DEX-файлу. Зловмисник, який запустив strings app.apk, не побачить жодного API-ендпоінту. Навіть після декомпіляції всі рядки виглядають як двійкові дані. Для кожного рядка можна використовувати окремий ключ, що ускладнює деобфускацію.

RASP та контроль цілісності

RASP-агент всередині додатку виявляє Frida та відладку в runtime. Контроль цілісності через SHA-256 хеш APK запобігає запуску модифікованої версії додатку. Якщо хеш APK не збігається з еталонним (збереженим у нативному шарі) — додаток завершується. Це блокує атаки, засновані на модифікації APK, включаючи репакеджинг.

Серверний захист

Критична бізнес-логіка повинна виконуватися на сервері, а не на клієнті. Навіть якщо зловмисник повністю декомпілює додаток, серверний код залишається недоступним. Серверна валідація всіх запитів та параметрів запобігає експлуатації вразливостей, знайдених в ході реверсінгу. Серверна атестація через Play Integrity API або App Attest підтверджує, що запит надходить від справжнього, немодифікованого додатку.

Часто задавані питання

Чи законний reverse engineering мобільних додатків?

У США reverse engineering регулюється DMCA — дозволений для забезпечення сумісності, тестування безпеки та архівних цілей. Заборонено обведення технологічних заходів захисту (DRM). У Європі стаття 6 EUCD аналогічна DMCA. У Росії reverse engineering без згоди правовласника може трактуватися як порушення авторських прав. Юридична консультація обов’язкова перед комерційним реверсінгом.

Чи можна захистити додаток від реверсінгу на 100%?

Ні. Будь-який код, що виконується на пристрої атакуючого, може бути проаналізований — це принципове обмеження моделі client-side захисту. Мета захисту — зробити реверсінг економічно невигідним: витрати часу та ресурсів повинні перевищити цінність отриманого результату. Комбінація обфускації, RASP та серверної логіки — поточний стандарт захисту.

Що таке репакеджинг (repackaging) APK?

Репакеджинг — модифікація додатку через reverse engineering з подальшою перезбіркою APK. Зловмисник розпаковує APK через apktool, додає шкідливий код або замінює API-ключі, перезбирає та підписує своїм сертифікатом. Репакеджинг становить 86% усіх атак на Android, за даними Kaspersky Threat Report (2025). Контр-заходи: перевірка цифрового підпису в runtime.

Як Frida обходить SSL-pinning?

Frida-скрипт Universal Android SSL Unpin перехоплює виклики TrustManager.checkServerTrusted та ServerTrustManager на iOS, підмінюючи реалізацію на allow-all. Також використовується перехоплення методів X509TrustManager в OkHttp та URLConnection. SSL-pinning на Frida обходиться за 10 секунд готовим скриптом. Більш стійкий захист — certificate transparency через серверну перевірку сертифіката.

Які мови найскладніше реверсити?

Нативний код C/C++ в .so/.dylib бібліотеках значно складніше реверсити, ніж Java в DEX. Swift з PGO та компіляцією Osize дає більш заплутаний бінарник, ніж Objective-C. Rust компілюється в нативний код без runtime-метаданих та без стандартної обв’язки Objective-C, що робить його найскладнішим для реверсінгу з сучасних мов мобільної розробки.

Підсумки

  • Reverse Engineering — відновлення логіки додатку з бінарного коду через статичний аналіз (jadx, Ghidra, Hopper) та динамічну інструментацію (Frida, Xposed, Objection)
  • Статичний аналіз Android-додатків починається з декомпіляції DEX через jadx та розпаковки ресурсів через apktool, даючи до 90% відновленого Java-коду
  • Динамічний аналіз через Frida дозволяє перехоплювати виклики в runtime, відключати SSL-pinning та логувати всі аргументи та значення, що повертаються, методів
  • Reverse Engineering iOS потребує jailbreak та роботи з ARM64 бінарниками через Hopper/IDA Pro, що значно складніше, ніж DEX-аналіз на Android
  • Захист від реверсінгу включає обфускацію (ProGuard/DexGuard), шифрування констант, RASP-агент для виявлення Frida та серверну атестацію через Play Integrity API
  • 100% захист від реверсінгу неможливий — мета зробити вартість атаки вищою за цінність даних, що захищаються
  • Репакеджинг APK — наймасовіша атака на мобільні додатки, запобігається перевіркою цифрового підпису в runtime та серверною верифікацією цілісності

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також