Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
AudioServer-Voip-Recorder — 🔬 Продвинутый исследовательский инструмент для Android для захвата VoIP-аудио в реальном времени (Uplink/Downlink) путём динамического хука libaudioflinger.so. Протестирован и собран на WhatsApp, Signal и Telegram на Android 14. | Kitploit
Инструменты/GitHubGitHub/nighthawkk/audioserver-voip-recorder
Безопасность AndroidОбратная инженерияМобильная безопасность
GitHubnighthawkk/audioserver-voip-recorder

AudioServer-Voip-Recorder

🔬 Продвинутый исследовательский инструмент для Android для захвата VoIP-аудио в реальном времени (Uplink/Downlink) путём динамического хука libaudioflinger.so. Протестирован и собран на WhatsApp, Signal и Telegram на Android 14.

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
9 ч 28 мин назадЕщё не проверено

Цель: Продемонстрировать захват 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 кнопок управления:

  1. Инъекция политик
    Внедряет необходимые политики SELinux для совместной работы audioserver и этого приложения.

  2. Запуск мониторинга
    Внедряет payload (общую библиотеку) в audioserver, включая захват VoIP-аудио через перехват RecordTrack и PlaybackTrack. Для инъекции в процесс используется AndKittyInjector.

  3. Остановка мониторинга
    Перезапускает процесс audioserver, останавливая мониторинг и удаляя внедренные хуки.

  4. Копирование данных
    Копирует захваченный сырой PCM-аудио из временной директории /data/local/tmp/voip в /sdcard/voip.

    • После этого очищает временную директорию.
  5. Просмотр журналов
    Отображает журналы, связанные с инъекцией, перехватом и статусом записи.

  6. Включить SELinux
    Восстанавливает enforcing-режим SELinux.

  7. Отключить SELinux
    Переводит SELinux в permissive-режим. Используйте, если внедренные политики не срабатывают.

  8. Воспроизведение аудио
    Открывает собственный VoIP-файловый менеджер (/sdcard/voip/):

root@kitploit:~
+----------------------+    
|                      |    
|   App MainActivity   |    
|                      |    
|                      |    
|(9 Control Buttons UI)|    
|                      |    
|                      |    
+----------+-----------+    
           |                
           |                
           |                
+----------v-----------+    
|                      |    
|       JNI Layer      |    
|                      |    
| Selinux, Process Inje|    
| ction,               |    
|                      |    
|                      |    
+----------------------+    

Перехватывающий Payload

Эта общая библиотека внедряется в audioserver для обнаружения AUDIO_MODE_IN_COMMUNICATION и захвата VoIP-аудиопотоков напрямую из аудиостека Android для заданного набора имен пакетов.

Для перехвата критических методов внутри libaudioflinger.so используется фреймворк inline-хукинга Dobby.
Аудиопотоки восходящего канала (микрофон) и нисходящего канала (динамик) захватываются и записываются в файлы сессии для последующей обработки.

Точки перехвата

Библиотека устанавливает хуки на следующие функции внутри AudioFlinger и связанных классов:

Целевые приложения

Библиотека фильтрует потоки на основе маппинга UID → пакет.

Текущие отслеживаемые приложения:

  • com.whatsapp
  • com.whatsapp.w4b (WhatsApp Business)
  • org.thoughtcrime.securesms (Signal)
  • org.telegram.messenger
  • org.telegram.messenger.web

Вы также можете добавлять другие приложения внутри audioserver_hook.cpp:

root@kitploit:~
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, затем переименовываются при остановке трека:

    • Uplink (микрофон) → <packageName>_<sampleRate>_<timestamp>.bc
    • Downlink (динамик) → <packageName>_<sampleRate>_<timestamp>.ac
  • Пример сессии:

root@kitploit:~
	/data/local/tmp/voip/audioserver_session_1725389200/
	├── com.whatsapp_48000_1725389201_123456.ac
	├── com.whatsapp_48000_1725389201_123789.bc
	

Смещения (Offsets)

Поскольку целевая библиотека лишена символов (stripped), и методы не экспортируются в libaudioflinger.so, для успешного перехвата нам нужны точные смещения методов и других связанных компонентов.

Эти смещения можно получить из статического анализа с помощью IDA-PRO или из динамического анализа с помощью Frida. Когда смещения известны, их можно заменить в заголовочном файле offsets.h.

Требуемые смещения:
Методы:
  1. AUDIOFLINGER_SETMODE_OFFSET
    • Метод: android::AudioFlinger::setMode(audio_mode_t)
    • Манглированное имя: _ZN7android12AudioFlinger7setModeE11audio_mode_t
  2. RECORDTRACK_GETNEXTBUFFER_OFFSET
    • Метод: android::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer *)
    • Манглированное имя: _ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferE
  3. TRACK_GETNEXTBUFFER_OFFSET
    • Метод: android::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer *)
    • Манглированное имя: _ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferE
  4. TRACK_STOP_OFFSET
    • Метод: android::AudioFlinger::PlaybackThread::Track::stop(void)
    • Манглированное имя: _ZN7android12AudioFlinger14PlaybackThread5Track4stopEv
Другие смещения:
  1. SAMPLERATE_OFFSET
  2. UID_OFFSET
  3. ISOUT_OFFSET
  4. FORMAT_OFFSET
  5. CHANNELMASK_OFFSET
  6. ATTR_OFFSET

Их можно получить с помощью статического анализа.

  • Библиотека - libaudioflinger.so
  • Метод - android::AudioFlinger::ThreadBase::TrackBase::TrackBase
root@kitploit:~
TrackBase::TrackBase(
        IAfThreadBase *thread,
            const sp<Client>& client,
            const audio_attributes_t& attr,
            uint32_t sampleRate,
            audio_format_t format,
            audio_channel_mask_t channelMask,
            size_t frameCount,
            void *buffer,
            size_t bufferSize,
            audio_session_t sessionId,
            pid_t creatorPid,
            uid_t clientUid,
            bool isOut,
            const alloc_type alloc,
            track_type type,
            audio_port_handle_t portId,
            std::string metricsId)

Примечания

  • Записывается только режим IN_COMMUNICATION. Обычное аудио (музыка, рингтон и т.д.) игнорируется.
  • Специальная обработка для Telegram и Signal обеспечивает корректную частоту дискретизации (Telegram: 48000 Гц, Signal: 8000 Гц), чтобы игнорировать другие ненужные звуки, например, гудки звонка и сигналы завершения вызова.
  • PCM хранится в сыром виде; позже приложение-контроллер преобразует PCM → WAV для воспроизведения.
root@kitploit:~
 ┌─────────────────────────────┐
 │        VoIP Apps            │
 │  (WhatsApp / Signal / TG)   │
 └───────────────┬─────────────┘
                 │ Audio in/out
                 ▼
 ┌─────────────────────────────┐
 │       audioserver           │
 │  (libaudioflinger.so)       │
 └───────┬─────────┬───────────┘
         │         │
   uplink│         │downlink
 (mic)   │         │(speaker)
         ▼         ▼
 ┌───────────-──┐   ┌────────────-─┐
 │ RecordTrack  │   │  Track       │
 │ getNextBuffer│   │ getNextBuffer│
 └───────┬────-─┘   └───────┬────-─┘
         │                 │
   ┌─────▼─────┐     ┌─────▼─────┐
   │ hook_...  │     │ hook_...  │
   │ (uplink)  │     │ (downlink)│
   └─────┬─────┘     └─────┬─────┘
         │                 │
         └──────┬───┬──────┘
                │   │
                ▼   ▼
     ┌───────────────────────────┐
     │  /data/local/tmp/voip/    │
     │  audioserver_session_*    │
     │   - *.bc  (uplink)        │
     │   - *.ac  (downlink)      │
     └───────────────────────────┘

Идентификация целевых функций

Используемый процесс:

  1. Динамическое трассирование - Frida:
    • Использовалась Frida для трассировки всех вызовов функций во время VoIP-звонка.
    • Отфильтрованы все функции, отвечающие за обработку аудиобуферов.
    • Затем созданы Frida-скрипты для захвата и обработки аудиобуферов.
  2. Анализ AOSP и сопоставление классов
    • AudioFlinger управляет воспроизведением/захватом через PlaybackThread и RecordThread.
    • Аудио для каждого клиента представлено как PlaybackThread::Track (нисходящий канал) и RecordThread::RecordTrack (восходящий канал).
  3. Фильтрация потоков конкретных приложений
    • Использован маппинг UID→пакет для ограничения целевыми приложениями.
  4. Стабильность и смещения
    • Финальный нативный payload вычисляет адреса через базовый адрес + жестко заданные смещения (хранятся в app/src/main/cpp/include/offsets.h), что позволяет работать со stripped-символами.

Обнаружение MODE_IN_COMMUNICATION

Мы перехватываем AudioFlinger::setMode(int mode) и поддерживаем глобальное состояние:

  • При каждом вызове мы логируем смену режима и обновляем g_currentAudioMode.
  • Хуки (в хуках микрофона и динамика) проверяют g_currentAudioMode == AUDIO_MODE_IN_COMMUNICATION.
  • Это гарантирует, что мы сохраняем буферы только во время активной VoIP-сессии, избегая музыки/рингтонов/воспроизведения с устройства/записей с микрофона и т.д.

Сборка и запуск PoC

Структура проекта

root@kitploit:~
.
├── Android_App/ 
|   ├── app/                           # Android Studio project (App + Payload)
|	│   ├── src/
|	│   │   ├── main/
|	│   │   │   ├── java/              # Controller App Java/Kotlin sources
|	│   │   │   ├── cpp/               # Payload source (built with the app)
|	│   │   │   │   └── include/
|	│   │   │   │       └── offsets.h  # Function offsets for tested builds
├── tools/
│   ├── audioparser.py             # Converts .ac/.bc raw files → WAV
│   ├── frida/                     # Frida scripts for initial hook discovery
│   │   ├── host_audioserver.py
│   │   ├── agent_audioserver.js
├── app-release.apk                 # Signed release apk
└── README.md                       # Root README (design, build, run instructions)

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

  • Android Studio + NDK
  • Эмулятор с root-правами (например, rootAVD) или тестовое устройство в вашем владении (например, Magisk)
  • Установленные тестовые VoIP-приложения (те же, которыми вы владеете/администрируете)
  • Python для audioparser.py

Сборка приложения (которая также собирает payload)

  1. Откройте app/ в Android Studio.
  2. Убедитесь, что NDK установлен (SDK Manager → SDK Tools → NDK).
  3. Соберите Debug-вариант. Конфигурация Gradle/CMake скомпилирует нативный payload (libaudiohook.so) как часть проекта.

Установка на тестовое устройство

adb install -r app/build/outputs/apk/debug/app-debug.apk или установите предоставленный app-release.apk: adb install -r app-release.apk

Если вы разделяете артефакты, вы также можете отправить общую библиотеку для тестирования: adb push app/src/main/jniLibs/arm64-v8a/libaudiohook.so /data/local/tmp/

Запуск PoC (эмулятор/собственное устройство)

  1. Запустите приложение-контроллер -> предоставьте root-доступ по запросу.
  2. Нажмите «Inject Policies»
    Подготавливает правила SELinux, необходимые для взаимодействия приложения и audioserver в вашем тестовом окружении.
  3. Нажмите «Start Monitoring»
    Приложение использует AndKittyInjector для инъекции payload в audioserver.
  4. Совершите тестовый VoIP-звонок (например, через ваш собственный аккаунт WhatsApp/Signal/Telegram).
  5. Нажмите «Stop Monitoring»
    Перезапускает audioserver.
  6. Нажмите «Copy Data»
    Перемещает файлы сессии из /data/local/tmp/voip/… -> /sdcard/voip/ (и очищает временную директорию).
  7. Воспроизведение
    • В приложении: «Play Audios» преобразует PCM -> WAV и воспроизводит.
    • Или офлайн:
      root@kitploit:~
       adb pull /sdcard/voip/
      python3 tools/audioparser.py voip/
      

Дополнительные кнопки:

  • «View Logs»: просмотр статуса инъекции/хуков.
  • «Enable SELinux» / «Disable SELinux»: переключение enforcing/permissive в вашей лабораторной среде, если политики слишком строгие.
  • «Delete Data»: очистка /data/local/tmp/voip/ и /sdcard/voip/.

Протестированные версии и устройства

  • Эмулятор: AVD API 34 (x86_64) - Android 14 - с root-правами (rootAVD)
  • Устройство: Samsung Galaxy S22 (ARM64) - Android 14 - сборка S901EXXSCEYB1 - с root-правами (Magisk)

Протестированные приложения

  • Whatsapp
  • Whatsapp Business
  • Signal
  • Telegram

Основные проблемы и решения

  1. Stripped-символы

    • Проблема: Символы невозможно найти напрямую через dlsym.
    • Решение: Использовать смещения из статического анализа.
  2. Разные символы/смещения в разных сборках

    • Проблема: Stripped-символы различаются в зависимости от сборки; прямой dlsym может завершиться ошибкой.
    • Решение: Использовать базовый адрес + жестко заданные смещения для протестированных сборок (offsets.h), проверенные с помощью Frida-дампов символов и IDA-PRO.
  3. Точность определения режима

    • Проблема: Запись вне VoIP-сессий дает зашумленные данные.
    • Решение: Хуки перехватывают AudioFlinger::setMode(IN_COMMUNICATION); логируют переходы; сохраняют глобальный флаг режима.
  4. SELinux

    • Проблема: Запись во временные директории и IPC с audioserver могут быть заблокированы.
    • Решение: Добавлен шаг Inject Policies для внесения необходимых правил; доступны переключатели Enable/Disable SELinux для отладки в тестовых средах.
  5. Жизненный цикл файлов и переименование

    • Проблема: Необходимо избегать частичных/поврежденных выходных файлов при остановке потока.
    • Решение: Сначала записывать в .tmp; при переименовывать в (нисходящий канал) или (восходящий канал).

Ссылки (Open-Source и документация)

  • Dobby (Фреймворк inline-хукинга) - https://www.github.com/jmpews/Dobby
  • AndKittyInjector (Android-инжектор процессов) - https://github.com/MJx0/AndKittyInjector
  • AOSP
    • frameworks/av/services/audioflinger (AudioFlinger, PlaybackThread, RecordThread)
    • system/media/audio (аудиоформаты, атрибуты, маски каналов)
Скачать инструмент
  • Преобразует сырые PCM-файлы в формат WAV в памяти.
  • Воспроизводит преобразованное аудио прямо в приложении.
  • Удаление данных
    Удаляет все аудиоданные из /data/local/tmp/voip и /sdcard/voip. ПРИМЕЧАНИЕ: После удаления данных необходимо повторно выполнить инъекцию в audioserver, чтобы создать директорию для сохранения данных.

  • ФункцияНазначение
    AudioFlinger::setModeОтслеживает переходы в/из режима IN_COMMUNICATION (VoIP активен).
    RecordTrack::getNextBufferЗахватывает кадры аудио с микрофона (восходящий канал).
    PlaybackThread::Track::getNextBufferЗахватывает кадры аудио с динамика (нисходящий канал).
    Track::stopЗакрывает и финализирует файл нисходящего канала.
    RecordTrack::stopЗакрывает и финализирует файл восходящего канала.
  • RECORDTRACK_STOP_OFFSET
    • Метод: android::AudioFlinger::RecordThread::RecordTrack::stop(void)
    • Манглированное имя: _ZN7android12AudioFlinger12RecordThread11RecordTrack4stopEv
  • stop()
    .ac
    .bc
  • Отсутствие PLT-хуков в libaudioflinger.so

    • Проблема: Целевые функции (RecordTrack::getNextBuffer, Track::getNextBuffer и т.д.) не экспортируются, и в libaudioflinger.so нет записей PLT/GOT для них.
      • Мы не могли использовать стандартный dlsym() или механизмы хукинга на основе PLT.
    • Решение: Мы использовали Dobby для inline-перехвата функций.
      • Хуки устанавливаются во время выполнения по формуле:
        root@kitploit:~
        target_addr = base_addr(libaudioflinger) + offset
        DobbyHook(target_addr, hook_fn, &orig_fn)