Как проанализировать .apk-файл с помощью jadx и проверить, обфусцирован ли код

Как проанализировать .apk-файл с помощью jadx и проверить, обфусцирован ли код

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

Вот где приходит jadx — бесплатный, открытый и мощный инструмент, который превращает скомпилированный Android-код обратно в читаемый Java-подобный код. Но просто открыть его — ещё не значит понять. Нужно знать, что смотреть и как отличить нормальный код от обфусцированного.

Что такое обфускация и зачем она нужна

Обфускация — это намеренное искажение исходного кода, чтобы его было сложно читать и анализировать. Она не шифрует код, а просто делает его «мусорным»: меняет имена переменных на a, b, c, удаляет комментарии, вставляет бесполезные блоки кода, переставляет логику.

Зачем это делают?

  • Защита от копирования — чтобы никто не скопировал твой алгоритм.
  • Против реверс-инжиниринга — чтобы сложнее было найти уязвимости.
  • Сокрытие вредоносного поведения — чтобы аналитики не сразу увидели, что приложение шлёт данные на сторонний сервер.

Важно: обфускация — это не вредоносность. Многие легальные приложения (например, банковские или платёжные) её используют. Но если ты анализируешь подозрительное приложение — обфускация становится красным флагом. Чем сильнее обфускация, тем больше вероятность, что в нём что-то скрывают.

Шаг 1: Установи jadx

Загружать jadx нужно с официального репозитория: github.com/skylot/jadx. Там есть готовые сборки для Windows, macOS и Linux — скачай подходящую версию.

Не используй «улучшенные» версии из подозрительных сайтов. Ты ведь анализируешь вредоносные приложения — не добавляй себе рисков.

После скачивания распакуй архив. Внутри будет папка bin. Там лежит файл jadx-gui.bat (Windows) или jadx-gui (macOS/Linux). Запусти его — откроется графический интерфейс.

Шаг 2: Открой .apk-файл

В jadx нажми File → Open file и выбери свой .apk. Не нужно распаковывать его вручную — jadx сделает это сам.

После загрузки ты увидишь дерево пакетов слева. Оно выглядит как структура Java-проекта: com.example.app, android.support, com.google и т.д.

Здесь важно: если ты видишь десятки пакетов с именами вроде a.b.c, d.e.f, com.x12345 — это первый признак обфускации. Настоящие приложения обычно используют понятные имена: com.mybank.ui, com.myapp.network.

Шаг 3: Как понять, что код обфусцирован

Открой любой класс. В нормальном коде ты увидишь:

  • Читаемые имена методов: loginUser(), sendPayment(), getAccessToken().
  • Комментарии (иногда).
  • Логичную структуру: один класс — одна задача.
  • Использование осмысленных переменных: userId, apiKey, responseBody.

В обфусцированном коде всё выглядит иначе:

  • Имена методов: a(), b(), c(), d().
  • Переменные: String str, int i, boolean z.
  • Нет комментариев.
  • Код размазан: один метод на 200 строк с кучей if и switch без логики.
  • Пакеты: com.google.a.b.c, com.android.d.e.f.

Пример реального обфусцированного фрагмента:

public void a(String str) {
    if (str == null) {
        return;
    }
    String str2 = "a1b2c3";
    String str3 = "d4e5f6";
    String str4 = str2 + str3;
    if (str.contains(str4)) {
        b();
    }
}

Ты не знаешь, что делает этот метод. Он может быть и просто проверкой ключа, а может — отправкой данных на сервер. Имя a() не помогает. Это и есть обфускация.

Шаг 4: Как проверить обфускацию системно

Не смотри только на один класс. Ищи паттерны. Вот как сделать это системно:

  1. Посчитай, сколько пакетов с короткими именами. Если больше 70% пакетов называются как a.b.c — это сильная обфускация.
  2. Открой пакет com или android — там должны быть только системные библиотеки. Если там десятки своих классов с именами вроде g, h, i — это подозрительно.
  3. Найди методы, которые работают с сетью или файлами. Ищи: HttpURLConnection, FileOutputStream, SharedPreferences. Если ты нашёл их, но не можешь понять, как они вызываются — это признак обфускации.
  4. Ищи строки, связанные с URL, API-ключами, токенами. В jadx есть функция «Find in project» (Ctrl+F). Вбей http, https, token, key, api. Если ты видишь строки вроде "https://a1b2c3.com/api/v1/send" — это важно. Но если ты не можешь найти, где эта строка используется — код обфусцирован.
  5. Проверь разрешения в AndroidManifest.xml. Открой его в jadx — он всегда там есть. Если приложение запрашивает INTERNET, READ_PHONE_STATE, SEND_SMS — и при этом код обфусцирован — это красный флаг.

Обфускация vs. Необфусцированный код: сравнение

Признак Обфусцированный код Необфусцированный код
Имена классов a, b, c, d, com.x12345 MainActivity, NetworkManager, PaymentProcessor
Имена методов a(), b(), c(), d() loginUser(), sendRequest(), decryptData()
Имена переменных str, i, z, obj userId, apiKey, responseCode
Комментарии Отсутствуют Присутствуют (иногда)
Структура кода Размазанная, много вложенных if/else Чёткая, по принципу одного класса — одна задача
Пакеты Много вложенных коротких имён Один-два понятных пакета, остальное — системные
Скорость анализа Часы — нужно искать паттерны вручную Минуты — сразу понятно, что делает приложение

Если ты видишь 4+ признака из левого столбца — код обфусцирован. Если 1–2 — возможно, просто плохо написан. Если ни одного — это либо легальное приложение, либо очень старое (и не защищённое).

Частые ошибки при анализе

Даже опытные люди допускают ошибки. Вот самые распространённые:

  • Путают обфускацию с плохим кодом. Некоторые приложения просто написаны плохо — много дублирующегося кода, кривые имена. Но это не обфускация. Обфускация — это намеренное затруднение анализа. Смотри на масштаб: если всё в проекте выглядит как мусор — это обфускация.
  • Игнорируют AndroidManifest.xml. Многие смотрят только на код. А там, в манифесте, могут быть ключевые разрешения — например, READ_CALL_LOG или ACCESS_FINE_LOCATION. Без этого анализ неполный.
  • Думают, что jadx может декомпилировать всё. Нет. Если код написан на Kotlin и обфусцирован ProGuard — jadx может показать битый код. Он не идеален. Иногда нужно смотреть и в Smali (другой инструмент), но это уже сложнее.
  • Считают, что обфускация = вирус. Нет. Многие легальные приложения (например, от крупных банков) используют ProGuard или R8. Это нормально. Обфускация — это инструмент, а не признак вредоносности. Важно — что скрывают, а не что скрыто.
  • Не проверяют сетевые запросы. Самое важное — куда идёт данные. Если ты не нашёл, куда отправляются данные — значит, не нашёл главную угрозу.

Что выбрать в зависимости от ситуации

Ты не всегда хочешь глубоко копаться. Вот как действовать в разных сценариях:

  • Случай 1: Ты скачал приложение с неизвестного сайта, и оно запрашивает доступ к контактам и SMS
    → Сразу открывай jadx. Проверяй AndroidManifest.xml на разрешения. Ищи строки с http и https. Если код обфусцирован — не запускай это на основном устройстве. Запусти в виртуальной машине или вообще не запускай.
  • Случай 2: Ты анализируешь приложение конкурента, чтобы понять, как оно работает
    → Обфускация — это норма. Тебе нужно найти ключевые методы: авторизация, оплата, синхронизация. Ищи по названиям API, которые ты знаешь. Используй поиск по строкам. Не пытайся понять весь код — найди только то, что тебе нужно.
  • Случай 3: Ты разработчик и хочешь проверить, как хорошо работает твоя обфускация
    → Скомпилируй свою сборку с ProGuard/R8, открой в jadx. Проверь, остались ли понятные имена в критических местах. Если ты видишь com.yourcompany.api.ApiClient — обфускация не сработала. Нужно усилить правила в proguard-rules.pro.
  • Случай 4: Ты проверяешь приложение из Google Play
    → Обфускация — норма. Но если ты видишь, что приложение отправляет данные на домен вроде analytics12345.com, которого нет в публичных отчётах — это повод для тревоги. Проверь, есть ли у этого домена репутация в VirusTotal или AbuseIPDB.

Как лучше анализировать: практические советы

  • Используй поиск по строкам. Нажми Ctrl+F в jadx и ищи: http, https, token, key, api, secret, password. Это быстрее, чем листать код.
  • Смотри на размер файла. Обфусцированный APK часто больше, чем необфусцированный — из-за добавленного мусора. Если APK 20 МБ, а приложение простое — это подозрительно.
  • Сравни с оригиналом. Если ты знаешь, как выглядит легальное приложение (например, из Google Play), открой его в jadx и сравни структуру. Разница будет очевидна.
  • Сохраняй результаты. jadx позволяет экспортировать код в ZIP. Сохраняй его — потом можно будет сравнить с новой версией приложения.
  • Не забывай про ресурсы. В jadx есть вкладка Resources. Там могут быть скрытые URL в XML-файлах, строки, которые не видны в коде. Иногда именно там прячут ключи.

Что делать дальше

Если ты проанализировал .apk и обнаружил:

  • Обфускация + подозрительные разрешения + неизвестные URL — не запускай приложение. Запусти его в песочнице (например, в Android Studio эмуляторе) и посмотри, какие сетевые запросы уходят через Wireshark или Charles Proxy.
  • Обфускация, но всё в порядке — разрешения стандартные, URL известные — это нормально. Скорее всего, это легальное приложение с защитой от копирования.
  • Нет обфускации — но код кривой — это признак низкого качества разработки. Может быть уязвимо, но не обязательно вредоносно.

Если ты не уверен — не рискуй. Загрузи APK в VirusTotal — там проверят его на 70+ антивирусах. Если хотя бы 5 из них ругаются — это повод отказаться от установки.

Помни: jadx — это инструмент, а не волшебная палочка. Он не скажет тебе «это вирус». Он покажет код. Твоя задача — понять, что он означает. И если ты не знаешь — не делай выводы. Лучше проконсультироваться с экспертом.

Информация в этой статье носит ознакомительный характер. Анализ .apk-файлов может быть связан с юридическими и этическими рисками. Не анализируй приложения без разрешения владельца. Всегда соблюдай законы своей страны и правила использования ПО.

Оцените статью
PEFile — Безопасность и технологии простым языком