
🔬 Продвинутый исследовательский инструмент для Android для захвата VoIP-аудио в реальном времени (Uplink/Downlink) путём динамического хука libaudioflinger.so. Протестирован и собран на WhatsApp, Signal и Telegram на Android 14.
Цель: Продемонстрировать захват VoIP-потока путем перехвата audioserver в Android (конкретно libaudioflinger.so) и записи PCM-буферов восходящего (микрофон) и нисходящего (динамик) каналов, когда система находится в коммуникационном режиме.
Приложение-контроллер (Android)
Интерфейс с 9 кнопками для управления настройкой политики SELinux, инъекцией payload, перемещением данных и воспроизведением.
Payload (libaudiohook.so)
C++-библиотека (собирается как часть проекта приложения), которая перехватывает внутренние методы AudioFlinger с помощью Dobby и записывает сырые PCM-буферы в директорию сессии.
Постобработка
Дополнительный инструмент tools/audioparser.py преобразует сырые файлы .ac (Downlink)/.bc (Uplink) в WAV. Файловый менеджер приложения также может конвертировать и воспроизводить их прямо в приложении.
Исследовательские утилиты
Frida-скрипты для первоначального трассирования функций и поиска смещений; файлы анализа для символов/смещений и другие фрагменты.
Это Android-приложение предоставляет графический интерфейс для управления записью VoIP через audioserver. Оно интегрируется с нативным payload, который перехватывает аудиостек Android для захвата звука с микрофона и динамика от VoIP-приложений.
Приложение служит центром управления: позволяет внедрять необходимые политики SELinux, запускать/останавливать мониторинг, управлять записанными данными и воспроизводить захваченные VoIP-аудиофайлы.
Главная активность содержит 9 кнопок управления:
Инъекция политик
Внедряет необходимые политики SELinux для совместной работы audioserver и этого приложения.
Запуск мониторинга
Внедряет payload (общую библиотеку) в audioserver, включая захват VoIP-аудио через перехват RecordTrack и PlaybackTrack. Для инъекции в процесс используется AndKittyInjector.
Остановка мониторинга
Перезапускает процесс audioserver, останавливая мониторинг и удаляя внедренные хуки.
Копирование данных
Копирует захваченный сырой PCM-аудио из временной директории /data/local/tmp/voip в /sdcard/voip.
Просмотр журналов
Отображает журналы, связанные с инъекцией, перехватом и статусом записи.
Включить SELinux
Восстанавливает enforcing-режим SELinux.
Отключить SELinux
Переводит SELinux в permissive-режим. Используйте, если внедренные политики не срабатывают.
Воспроизведение аудио
Открывает собственный VoIP-файловый менеджер (/sdcard/voip/):
Удаление данных
Удаляет все аудиоданные из /data/local/tmp/voip и /sdcard/voip.
ПРИМЕЧАНИЕ: После удаления данных необходимо повторно выполнить инъекцию в audioserver, чтобы создать директорию для сохранения данных.
+----------------------+
| |
| App MainActivity |
| |
| |
|(9 Control Buttons UI)|
| |
| |
+----------+-----------+
|
|
|
+----------v-----------+
| |
| JNI Layer |
| |
| Selinux, Process Inje|
| ction, |
| |
| |
+----------------------+
Эта общая библиотека внедряется в audioserver для обнаружения AUDIO_MODE_IN_COMMUNICATION и захвата VoIP-аудиопотоков напрямую из аудиостека Android для заданного набора имен пакетов.
Для перехвата критических методов внутри libaudioflinger.so используется фреймворк inline-хукинга Dobby.
Аудиопотоки восходящего канала (микрофон) и нисходящего канала (динамик) захватываются и записываются в файлы сессии для последующей обработки.
Библиотека устанавливает хуки на следующие функции внутри AudioFlinger и связанных классов:
| Функция | Назначение |
|---|---|
AudioFlinger::setMode | Отслеживает переходы в/из режима IN_COMMUNICATION (VoIP активен). |
RecordTrack::getNextBuffer | Захватывает кадры аудио с микрофона (восходящий канал). |
PlaybackThread::Track::getNextBuffer | Захватывает кадры аудио с динамика (нисходящий канал). |
Track::stop | Закрывает и финализирует файл нисходящего канала. |
RecordTrack::stop | Закрывает и финализирует файл восходящего канала. |
Библиотека фильтрует потоки на основе маппинга UID → пакет.
Текущие отслеживаемые приложения:
com.whatsappcom.whatsapp.w4b (WhatsApp Business)org.thoughtcrime.securesms (Signal)org.telegram.messengerorg.telegram.messenger.webВы также можете добавлять другие приложения внутри audioserver_hook.cpp:
static const char* kTargetPackages[] = {
"com.whatsapp",
"com.whatsapp.w4b",
"org.thoughtcrime.securesms",
"org.telegram.messenger",
"org.telegram.messenger.web"
};
При инъекции в audioserver создается директория сессии по пути:
/data/local/tmp/voip/audioserver_session_<timestamp>/
Файлы сначала создаются с расширением .tmp, затем переименовываются при остановке трека:
<packageName>_<sampleRate>_<timestamp>.bc<packageName>_<sampleRate>_<timestamp>.acПример сессии:
/data/local/tmp/voip/audioserver_session_1725389200/
├── com.whatsapp_48000_1725389201_123456.ac
├── com.whatsapp_48000_1725389201_123789.bc
Поскольку целевая библиотека лишена символов (stripped), и методы не экспортируются в libaudioflinger.so, для успешного перехвата нам нужны точные смещения методов и других связанных компонентов.
Эти смещения можно получить из статического анализа с помощью IDA-PRO или из динамического анализа с помощью Frida.
Когда смещения известны, их можно заменить в заголовочном файле offsets.h.
android::AudioFlinger::setMode(audio_mode_t)_ZN7android12AudioFlinger7setModeE11audio_mode_tandroid::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer *)_ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferEandroid::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer *)_ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferEandroid::AudioFlinger::PlaybackThread::Track::stop(void)_ZN7android12AudioFlinger14PlaybackThread5Track4stopEvandroid::AudioFlinger::RecordThread::RecordTrack::stop(void)_ZN7android12AudioFlinger12RecordThread11RecordTrack4stopEv