Инструментирование мобильных приложений
Frida-скрипты для снятия SSL-пиннинга и трассировки сигнатур на Android.
Traffic Jam управляет подключённым Android-устройством из представления Mobile: приложение запускает целевое приложение под Frida (или подключается к уже запущенному процессу) со скриптом снятия SSL-пиннинга либо трассировки сигнатур, направляет трафик приложения через локальный TLS-прокси mitmproxy и захватывает расшифрованные пакеты с помощью tshark на loopback-интерфейсе. При остановке сессии захват импортируется в рабочее пространство как обычный pcapng-файл. Используйте это только в отношении приложений и систем, тестирование которых вам разрешено.
Как устроена сессия
Запуск захвата поднимает три управляемых процесса и перенастраивает устройство:
- tshark ведёт захват на loopback-интерфейсе (
lo0/lo) с BPF-фильтром и пишет файл.pcapng. - mitmdump слушает на
127.0.0.1:8081и пишет TLS-сессионные ключи в файл.sslkeylog(SSLKEYLOGFILE/MITMPROXY_SSLKEYLOGFILE). Если настроен клиентский сертификат, он передаётся через--set client_certs=. - frida внедряет выбранный скрипт в целевое приложение.
- adb указывает настройке
global http_proxyустройства на прокси и настраиваетadb reverse; при остановке сессии исходное значение прокси восстанавливается.
Бэкенду требуются adb, frida, mitmdump и tshark в PATH; перед стартом он проверяет наличие каждого и сообщает обо всех недостающих.
Предварительные требования
Вкладка Capture показывает полосу готовности с индикатором по каждому требованию (ready / checking / missing):
| Требование | Что проверяет приложение |
|---|---|
adb | Android device bridge в PATH, с версией |
frida | Frida CLI в PATH |
mitmdump | TLS-перехватывающий прокси в PATH |
tshark | Инструмент захвата пакетов в PATH |
| Loopback | Хотя бы один loopback-интерфейс для захвата |
| Android | Хотя бы одно устройство онлайн через adb devices |
На устройстве должен быть запущен frida-server; приложение опрашивает его версию через adb shell с su, что предполагает рутованное устройство. Если мажорная версия frida-server не совпадает с мажорной версией frida на хосте, приложение показывает предупреждение — версии должны совпадать, поэтому обновите или перезапустите frida-server на устройстве и обновите статус.
Запуск захвата
Откройте представление Mobile → вкладку Capture, затем:
- Выберите Device (
Auto USBиспользуетfrida -U; конкретное устройство —-D <id>). - Укажите цель Package or process (например,
com.example.app). Список Android apps заполняется изfrida-ps; щёлкните строку, чтобы подставить цель в режиме spawn, либо используйте Scan для обновления и поле поиска для фильтрации. - Выберите Frida script (см. ниже).
- Нажмите Start capture.
В разделе Advanced доступно остальное: имя захвата, Mode (Spawn package → frida -f <pkg> --no-pause, или Attach process → frida -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-скриптов
Бэкенд поставляется с четырьмя встроенными скриптами, выбираемыми по профилю:
| Скрипт | Профиль | Назначение |
|---|---|---|
| Generic | generic | Широкие хуки OkHttp, TrustManager и проверки hostname для большинства приложений |
| Aggressive | aggressive | Более широкая поверхность хуков: дополнительные SSL-стеки и мосты к нативным верификаторам |
| Goldapple | goldapple | Обфусцированный пиннинг OkHttp плюс поддержка клиентских сертификатов mTLS |
| Signature trace | signature-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 обходят транспортные защиты приложения. Запускайте эти рабочие процессы только в отношении приложений и бэкендов, которыми вы владеете или тестирование которых вам явно разрешено.