Инструментирование мобильных приложений

Frida-скрипты для снятия SSL-пиннинга и трассировки сигнатур на Android.

Traffic Jam управляет подключённым Android-устройством из представления Mobile: приложение запускает целевое приложение под Frida (или подключается к уже запущенному процессу) со скриптом снятия SSL-пиннинга либо трассировки сигнатур, направляет трафик приложения через локальный TLS-прокси mitmproxy и захватывает расшифрованные пакеты с помощью tshark на loopback-интерфейсе. При остановке сессии захват импортируется в рабочее пространство как обычный pcapng-файл. Используйте это только в отношении приложений и систем, тестирование которых вам разрешено.

Как устроена сессия

Запуск захвата поднимает три управляемых процесса и перенастраивает устройство:

  1. tshark ведёт захват на loopback-интерфейсе (lo0/lo) с BPF-фильтром и пишет файл .pcapng.
  2. mitmdump слушает на 127.0.0.1:8081 и пишет TLS-сессионные ключи в файл .sslkeylog (SSLKEYLOGFILE / MITMPROXY_SSLKEYLOGFILE). Если настроен клиентский сертификат, он передаётся через --set client_certs=.
  3. frida внедряет выбранный скрипт в целевое приложение.
  4. adb указывает настройке global http_proxy устройства на прокси и настраивает adb reverse; при остановке сессии исходное значение прокси восстанавливается.

Бэкенду требуются adb, frida, mitmdump и tshark в PATH; перед стартом он проверяет наличие каждого и сообщает обо всех недостающих.

Предварительные требования

Вкладка Capture показывает полосу готовности с индикатором по каждому требованию (ready / checking / missing):

ТребованиеЧто проверяет приложение
adbAndroid device bridge в PATH, с версией
fridaFrida CLI в PATH
mitmdumpTLS-перехватывающий прокси в PATH
tsharkИнструмент захвата пакетов в PATH
LoopbackХотя бы один loopback-интерфейс для захвата
AndroidХотя бы одно устройство онлайн через adb devices

На устройстве должен быть запущен frida-server; приложение опрашивает его версию через adb shell с su, что предполагает рутованное устройство. Если мажорная версия frida-server не совпадает с мажорной версией frida на хосте, приложение показывает предупреждение — версии должны совпадать, поэтому обновите или перезапустите frida-server на устройстве и обновите статус.

Запуск захвата

Откройте представление Mobile → вкладку Capture, затем:

  1. Выберите Device (Auto USB использует frida -U; конкретное устройство — -D <id>).
  2. Укажите цель Package or process (например, com.example.app). Список Android apps заполняется из frida-ps; щёлкните строку, чтобы подставить цель в режиме spawn, либо используйте Scan для обновления и поле поиска для фильтрации.
  3. Выберите Frida script (см. ниже).
  4. Нажмите Start capture.

В разделе Advanced доступно остальное: имя захвата, Mode (Spawn packagefrida -f <pkg> --no-pause, или Attach processfrida -n <name>), интерфейс захвата, Proxy port (по умолчанию 8081), Save to collection (по умолчанию Mobile captures), BPF filter (по умолчанию tcp port 8081, синхронизируется с портом) и флажок SSL unpinning, который полностью включает или отключает внедрение скрипта.

Во время работы правая колонка показывает живые метрики (прошедшее время, состояние Frida/прокси, размеры PCAP и keylog, состояние mTLS и Android-прокси), а также панель Process output с последними ~12 КиБ вывода инструментов и фильтром строк. Нажмите Stop and import, чтобы всё остановить и импортировать захват; всплывающее уведомление сообщает, сколько запросов было распознано.

Каталог Frida-скриптов

Бэкенд поставляется с четырьмя встроенными скриптами, выбираемыми по профилю:

СкриптПрофильНазначение
GenericgenericШирокие хуки OkHttp, TrustManager и проверки hostname для большинства приложений
AggressiveaggressiveБолее широкая поверхность хуков: дополнительные SSL-стеки и мосты к нативным верификаторам
GoldapplegoldappleОбфусцированный пиннинг OkHttp плюс поддержка клиентских сертификатов mTLS
Signature tracesignature-traceТрассирует javax.crypto.Mac, MessageDigest и SecretKeySpec для реверса схем подписи запросов

Выбранный скрипт записывается в рабочее пространство сессии и загружается через frida -l. Профиль Goldapple дополнительно требует клиентский сертификат: приложение извлекает P12 из записи APK res/raw/prod_keystore_p12.p12 (перебирая варианты паролей из APK и его нативных библиотек) либо принимает загруженный сертификат с паролем, а затем конвертирует его в PEM для mitmproxy.

Управление скриптами в библиотеке

Вкладка Frida scripts (переключение вкладок клавишами 1/2) — это библиотека скриптов. Встроенные скрипты открываются только для чтения вместе со встроенным исходником; используйте панель инструментов, чтобы создавать, дублировать, сохранять (Cmd/Ctrl+S) и удалять пользовательские скрипты. Пользовательские скрипты хранятся в localStorage браузера и появляются в выпадающем списке скриптов на вкладке Capture с суффиксом (custom); при выборе такого скрипта его исходник отправляется на бэкенд как профиль custom и записывается в frida-custom.js.

Рабочий процесс трассировки сигнатур

Скрипт Signature trace хукает криптографические примитивы Java, которые приложения используют для построения подписей запросов, и логирует все входы и выходы с префиксом [traffic-jam]:

  • javax.crypto.Mac.doFinal / .update (HMAC)
  • java.security.MessageDigest.digest / .update (хэши)
  • javax.crypto.spec.SecretKeySpec (ключи, utf8 + hex)
  • okhttp3.Request$Builder.addHeader для заголовков, содержащих sign, sig, token или nonce

Каждая строка лога включает вход (utf8 и hex), выход в hex и короткий стек вызывающего кода. Выполните в приложении действие, порождающее подписанный запрос, затем прочитайте отфильтрованную панель Process output: когда залогированный выход совпадает с наблюдаемым значением сигнатуры, соответствующая входная строка и есть канонизация.

Офлайн-анализ работает в обратном направлении. В рабочем пространстве API откройте вкладку Signature (см. /docs/ru/api-re/): она сканирует заголовки, параметры запроса и cookie на предмет полей, похожих на сигнатуры, перебирает классические канонизации и сопоставляет входные данные деривации между захватами. Для любого кандидата кнопка Copy Frida hook template генерирует поскрипт для конкретного поля — с внедрёнными эндпоинтом, полем, наблюдаемыми значениями и ожидаемой длиной в байтах, логирующий строки [sig-trace], — который подключается командой:

frida -U -f <package> -l this-script.js

Извлечение APK

В списке Android apps нажмите APK на нужной строке. Бэкенд разрешает пакет через pm path, вытягивает каждый split через adb pull и возвращает архив <name>.apks.zip для скачивания.

Куда попадают артефакты

Каждая сессия получает каталог в рабочем пространстве захватов (mobile/<session-id>/), содержащий .pcapng, .sslkeylog и внедрённый скрипт. При остановке захват и keylog импортируются и расшифровываются как любой другой захват — см. /docs/ru/capture/. Предварительные требования к инструментам описаны в /docs/ru/getting-started/installation/.

[!WARNING] Внедрение Frida, снятие SSL-пиннинга и перехват mTLS обходят транспортные защиты приложения. Запускайте эти рабочие процессы только в отношении приложений и бэкендов, которыми вы владеете или тестирование которых вам явно разрешено.

Документация Traffic Jam. Собрано с помощью Hugo.