Мобильный реверс (APK) — обзор

Как устроен реверс приложений Android — обзорно и легально.

APK — формат установочного пакета Android: по сути ZIP-архив с кодом, ресурсами и манифестом.

Чем мобильный реверс отличается

Большинство Android-приложений написаны на Java/Kotlin и компилируются не в машинный код, а в байткод для виртуальной машины Android (Dalvik/ART). Байткод гораздо ближе к исходнику, чем нативный ассемблер, поэтому декомпиляция в Java часто получается на удивление читаемой.

Что внутри APK

ЧастьЧто это
classes.dexскомпилированный байткод приложения
AndroidManifest.xmlразрешения, компоненты, точки входа
res/, assets/ресурсы: картинки, строки, файлы
lib/нативные библиотеки (.so) — уже машинный код ARM

Инструменты (обзорно)

  • apktool — распаковывает APK, переводит .dex в smali (человекочитаемое представление байткода).
  • jadx — декомпилирует .dex прямо в читаемый Java-код.
  • Для нативных .so — те же Ghidra/IDA, ведь это ARM-машинный код.

Зачем это легально

Разработчики реверсят свои приложения (отладка, проверка, что попало в релиз), исследователи безопасности — с разрешения (анализ на уязвимости), аналитики — мобильную малварь. Манифест и разрешения — первое, что смотрят: приложение, просящее доступ к SMS и контактам без причины, подозрительно.

Как работает под капотом

Java-исходник → байткод Dalvik (.dex) → исполнение на ART (Android Runtime). Поскольку байткод сохраняет имена классов и методов (если не применён обфускатор вроде R8/ProGuard), декомпиляция близка к исходнику. Обфускация в мобайле как раз поэтому распространена.

Этическая рамка

Реверсить можно своё приложение, малварь в исследовательских целях, чужое — только с разрешения. Не для кражи кода или обхода платных функций чужих приложений.

Частые ошибки

  • Думать, что APK — это нативный код. Чаще это байткод (кроме lib/*.so).
  • Игнорировать манифест — там разрешения и точки входа.
  • Забывать про обфускацию (R8/ProGuard), которая прячет имена.

Итог

  • APK — ZIP с байткодом (classes.dex), манифестом, ресурсами и нативными .so.
  • Байткод декомпилируется в почти-Java (jadx) или smali (apktool).
  • Легально: своё приложение, разрешённое исследование, мобильная малварь.
Проверьте себя
1. Что представляет собой APK по структуре?
AМашинный код ARM целиком
BZIP-архив с байткодом (classes.dex), манифестом, ресурсами и иногда нативными .so
CИсходный код на Java
DОбраз диска
2. Почему декомпиляция Android-приложений часто читаемее, чем нативного бинаря?
AПотому что APK не сжат
BПотому что приложение — это байткод, сохраняющий имена классов/методов (если нет обфускации)
CПотому что Android не использует процессор
DПотому что Java нельзя обфусцировать