Reverse Engineering (обратная разработка) — восстановление логики и структуры мобильного приложения без доступа к исходному коду. В контексте Android и iOS это означает декомпиляцию DEX/APK и Mach-O/IPA бинарных файлов для извлечения алгоритмов, ключей шифрования, API-эндпоинтов и бизнес-логики. По данным Veracode Security Research (2025), более 60% мобильных приложений в top-200 содержат хотя бы один индикатор, упрощающий reverse engineering. Reverse Engineering применяется не только для атак, но и для аудита безопасности, патентного анализа и тестирования на проникновение.
Главное
Reverse Engineering (реверсинг) — дисциплина анализа программного обеспечения, направленная на восстановление характеристик, логики и структуры приложения из его бинарного представления. Для мобильных приложений объектами анализа выступают APK-файлы (Android) и IPA-файлы (iOS), содержащие компилированный код, ресурсы, манифесты и сертификаты. Результат реверсинга — выделение алгоритмов, протоколов, ключей шифрования, API-схем и бизнес-логики.
Цели обратной разработки делятся на легитимные и нелегитимные. Легитимные: анализ вредоносного ПО для создания средств защиты, аудит собственных приложений на уязвимости, обеспечение совместимости с закрытыми протоколами, патентный анализ и обучение. Нелегитимные: кража интеллектуальной собственности, обход лицензионных ограничений, создание пиратских копий и модификация приложения для кражи данных пользователей. По данным Google Play Protect (2025), 78% вредоносных модификаций банковских приложений создаются на основе оригинального APK, пропущенного через reverse engineering.
Методология реверсинга включает два основных направления: статический анализ (без запуска приложения) и динамический анализ (во время выполнения). Каждый подход даёт разный уровень информации. Статический — полную картину кода, но без данных времени выполнения. Динамический — реальное поведение, поток данных, сетевые вызовы, но только в рамках конкретного сценария выполнения. Профессиональный реверсинг всегда комбинирует оба подхода.
Статический анализ — первый этап обратной разработки. Исходный APK или IPA распаковывается, и каждый компонент анализируется отдельно. Основные цели: DEX-байткод, ресурсы, манифест, нативные библиотеки (.so, .dylib) и метаданные.
jadx — основной инструмент для статического анализа Android-приложений. Он преобразует DEX-байткод в читаемый Java-код с минимальными потерями. jadx поддерживает: декомпиляцию multidex, распознавание лямбд и встроенных классов Kotlin, экспорт в Gradle-проект. Для обфусцированного кода (ProGuard) jadx показывает код с именами a, b, c, но структура классов и последовательность вызовов сохраняется. По данным независимого тестирования, jadx корректно декомпилирует 85–92% кода даже с обфускацией.
apktool декодирует APK в smali-код (ассемблер DEX) и восстанавливает ресурсы в читаемом виде: AndroidManifest.xml превращается из AXML в читаемый XML, layouts — в XML-разметку, strings.xml — в plain text. apktool позволяет модифицировать ресурсы и пересобрать APK. После распаковки через apktool и подмены ресурсов приложение можно установить с модифицированным содержимым.
Ghidra (NSA) — фреймворк reverse engineering, незаменимый для анализа .so-библиотек Android и .dylib iOS. Ghidra дизассемблирует ARM64 код, восстанавливает псевдокод C и строит граф вызовов. Для мобильного реверсинга Ghidra используется для анализа нативных реализаций криптографии и DRM-механизмов. Ghidra поддерживает скриптинг на Python и Java для автоматизации анализа.
# Распаковка и декомпиляция 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 внедряет 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 предоставляет готовые команды для типовых задач реверсинга без написания JavaScript-скриптов: disable-pinning (отключение SSL pinning), dump-keychain (iOS), explore (обход иерархии классов), memory search (поиск строк в памяти). Objection позволяет выполнить полный динамический анализ без единой строки кода. Для iOS приложений Objection автоматически находит и логирует вызовы NSURLSession, CFNetwork и NSKeyedArchiver.
Xposed — фреймворк для Android, работающий путём замены файла app_process в Zygote. В отличие от Frida, Xposed не требует root-доступа после установки. Xposed модули могут перехватывать вызовы методов в любом приложении. Для реверсинга Xposed удобен долгосрочным анализом: модуль устанавливается и работает постоянно, логируя поведение приложения в разных сценариях. Xposed поддерживает Android до версии 8.1; для Android 9+ используется EdXposed на базе SandHook.
// 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);
};
Standard workflow реверсинга состоит из последовательных шагов, каждый из которых даёт определённый уровень информации.
Анализатор изучает APK на уровне метаданных: targetSdk, uses-permission (какие разрешения запрашивает), intent-filter и exported components. По разрешениям можно определить, какие API используются (android.permission.CAMERA → камера, android.permission.RECORD_AUDIO → аудио). По exported activity определяются точки входа без авторизации. Этот этап выполняется через aapt или ApkAnalyzer и занимает 1–2 минуты.
APK распаковывается, classes.dex (или multidex) подаётся на вход jadx. На выходе — Java/Kotlin код в пакетах. Анализатор ищет ключевые классы: CryptoUtils, ApiClient, AuthManager, DatabaseHelper, и проверяет, какие алгоритмы используются. Если в коде встречаются строки AES/CBC/PKCS5Padding — приложение использует шифрование, и нужно найти ключ. На этом этапе определяются: хардкоженные ключи, API-URL, OAuth-токены и секреты. Без обфускации весь код приложения читается как обычный Java-проект.
Настроив Frida или Objection для отключения SSL-pinning, анализатор запускает приложение и перехватывает сетевой трафик через Burp Suite или mitmproxy. По данным трафика восстанавливается API-схема: какие эндпоинты, какие параметры, в каком формате. При возможности анализатор модифицирует запросы и проверяет реакцию сервера на некорректные или вредоносные данные. Отсутствие серверной валидации — прямая уязвимость, обнаруженная на этом шаге.
Результаты анализа фиксируются в структурированном виде. Для каждого найденного уязвимого места указывается: класс и метод, описание уязвимости, вектор эксплуатации и рекомендация по исправлению. Этот дата-сет передаётся команде разработки или используется для составления пентест-отчёта. В автоматизированных средах (MobSF) отчёт генерируется автоматически по итогам статического и динамического анализа.
Reverse engineering iOS-приложений сложнее Android из-за более жёсткой архитектуры безопасности Apple и отсутствия прямого доступа к файловой системе на stock-устройствах. Для анализа iOS нужен jailbreak.
IPA-архив содержит Mach-O бинарник — универсальный формат исполняемых файлов Apple. Для декомпиляции используется Hopper Disassembler или IDA Pro. В отличие от Android DEX, который декомпилируется в Java с минимальными потерями, Mach-O содержит нативный ARM64 код, который восстанавливается в псевдокод C с меньшей точностью. Hopper справляется с 60–70% восстановления, остальное приходится анализировать на уровне ассемблера.
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 с последующей перепаковкой и установкой на устройство. Инструменты: ipatool для распаковки, MachOView для просмотра секций и optool для внедрения кода. После модификации IPA подписывается через ldid или fastlane sigh для установки на джейлбрейкнутое устройство. Для iOS 16+ код-подпись проверяется на уровне Secure Enclave, и модифицированный IPA не запустится на non-jailbroken устройстве.
// 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());
}
});
}
Защита от обратной разработки строится по принципу 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-агент внутри приложения обнаруживает Frida и отладку в runtime. Контроль целостности через SHA-256 хеш APK предотвращает запуск модифицированной версии приложения. Если хеш APK не совпадает с эталонным (сохранённым в нативном слое) — приложение завершается. Это блокирует атаки, основанные на модификации APK, включая репакеджинг.
Критическая бизнес-логика должна выполняться на сервере, а не на клиенте. Даже если злоумышленник полностью декомпилирует приложение, серверный код остаётся недоступным. Серверная валидация всех запросов и параметров предотвращает эксплуатацию уязвимостей, найденных в ходе реверсинга. Серверная аттестация через Play Integrity API или App Attest подтверждает, что запрос приходит от подлинного, немодифицированного приложения.
Часто задаваемые вопросы
В США reverse engineering регулируется DMCA — разрешён для обеспечения совместимости, тестирования безопасности и архивных целей. Запрещён обвод технологических мер защиты (DRM). В Европе статья 6 EUCD аналогична DMCA. В России reverse engineering без согласия правообладателя может трактоваться как нарушение авторских прав. Юридическая консультация обязательна перед коммерческим реверсингом.
Нет. Любой код, выполняющийся на устройстве атакующего, может быть проанализирован — это принципиальное ограничение модели client-side защиты. Цель защиты — сделать реверсинг экономически невыгодным: затраты времени и ресурсов должны превысить ценность полученного результата. Комбинация обфускации, RASP и серверной логики — текущий стандарт защиты.
Репакеджинг — модификация приложения через reverse engineering с последующей пересборкой APK. Злоумышленник распаковывает APK через apktool, добавляет вредоносный код или заменяет API-ключи, пересобирает и подписывает своим сертификатом. Репакеджинг составляет 86% всех атак на Android, по данным Kaspersky Threat Report (2025). Контр-мера: check цифровой подписи в runtime.
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, что делает его самым сложным для реверсинга из современных языков мобильной разработки.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также