
🔬 Ein fortschrittliches Android-Forschungstool für die Echtzeit-Erfassung von VoIP-Audio (Uplink/Downlink) durch dynamisches Hooking von libaudioflinger.so. Getestet und entwickelt auf WhatsApp, Signal und Telegram unter Android 14.
Ziel: Demonstrieren der VoIP-Stream-Erfassung durch Hooking des Android-audioserver (insbesondere libaudioflinger.so) und Aufzeichnen der Uplink- (Mikrofon) und Downlink- (Lautsprecher) PCM-Puffer, wenn sich das System im Kommunikationsmodus befindet.
Controller App (Android)
UI mit 9 Schaltflächen zur Verwaltung der SELINUX-Richtlinieneinrichtung, Payload-Injektion, Datenübertragung und Wiedergabe.
Payload (libaudiohook.so)
C++-Shared-Library (als Teil des App-Projekts erstellt), die interne AudioFlinger-Methoden mit Dobby hookt und rohe PCM-Puffer in ein Sitzungsverzeichnis schreibt.
Post-Processing
Zusätzliches Tool, tools/audioparser.py konvertiert rohe .ac(Downlink)/.bc(Uplink)-Dateien in WAV. Der Dateimanager der App kann ebenfalls konvertieren und in der App abspielen.
Research Utilities
Frida-Skripte für anfängliches Funktionstracing & Offset-Ermittlung; Analysedateien für Symbol/Offset und andere Snippets.
Diese Android-Anwendung bietet eine grafische Oberfläche zur Verwaltung der VoIP-Aufzeichnung über den audioserver. Sie integriert einen nativen Payload, der in den Android-Audiostack eingreift, um Mikrofon- und Lautsprecheraudio von VoIP-Anwendungen zu erfassen.
Die App dient als Kontrollzentrum, mit dem Sie erforderliche SELinux-Richtlinien injizieren, die Überwachung starten/stoppen, aufgezeichnete Daten verwalten und erfasste VoIP-Audiodateien abspielen können.
Die Hauptaktivität enthält 9 Steuerschaltflächen:
Inject Policies
Injiziert die erforderlichen SELinux-Richtlinien, damit audioserver und diese App zusammenarbeiten können.
Start Monitoring
Injiziert den Shared-Library-Payload in audioserver und ermöglicht so die VoIP-Audioerfassung durch Hooking von RecordTrack und PlaybackTrack. Verwendet AndKittyInjector für die Prozessinjektion.
Stop Monitoring
Startet den audioserver-Prozess neu, stoppt die Überwachung und entfernt injizierte Hooks.
Copy Data
Kopiert erfasstes rohes PCM-Audio aus dem temporären Verzeichnis /data/local/tmp/voip nach /sdcard/voip.
View Logs
Zeigt Protokolle zu Injektion, Hooking und Aufzeichnungsstatus an.
Enable SELinux
Stellt den SELinux-Enforcing-Modus wieder her.
Disable SELinux
Setzt SELinux in den permissiven Modus. Verwenden, wenn injizierte Richtlinien fehlschlagen.
Play Audios
Öffnet den benutzerdefinierten VoIP-Dateimanager (/sdcard/voip/):
Delete Data
Löscht alle Audiodaten aus /data/local/tmp/voip und /sdcard/voip.
HINWEIS: Nach dem Löschen der Daten müssen wir erneut in audioserver injizieren, damit das Verzeichnis zum Speichern von Daten erstellt wird.
+----------------------+
| |
| App MainActivity |
| |
| |
|(9 Control Buttons UI)|
| |
| |
+----------+-----------+
|
|
|
+----------v-----------+
| |
| JNI Layer |
| |
| Selinux, Process Inje|
| ction, |
| |
| |
+----------------------+
Diese Shared Library wird in audioserver injiziert, um AUDIO_MODE_IN_COMMUNICATION zu erkennen und VoIP-Audiostreams direkt aus dem Android-Audiostack für eine vordefinierte Menge von Paketnamen zu erfassen.
Sie verwendet das Dobby Inline-Hooking-Framework, um kritische Methoden in libaudioflinger.so abzufangen.
Sowohl Uplink- (Mikrofon) als auch Downlink- (Lautsprecher) Audiostreams werden erfasst und zur späteren Verarbeitung in Sitzungsdateien geschrieben.
Die Bibliothek installiert Hooks auf den folgenden Funktionen in AudioFlinger und zugehörigen Klassen:
| Function | Purpose |
|---|---|
AudioFlinger::setMode | Verfolgt Übergänge in den/aus dem IN_COMMUNICATION-Modus (VoIP aktiv). |
RecordTrack::getNextBuffer | Erfasst Mikrofon- (Uplink-) Audioframes. |
PlaybackThread::Track::getNextBuffer | Erfasst Lautsprecher- (Downlink-) Audioframes. |
Track::stop | Schließt und finalisiert die Downlink-Datei. |
RecordTrack::stop | Schließt und finalisiert die Uplink-Datei. |
Die Bibliothek filtert Streams basierend auf der UID → Paket-Zuordnung.
Derzeit überwachte Apps:
com.whatsappcom.whatsapp.w4b (WhatsApp Business)org.thoughtcrime.securesms (Signal)org.telegram.messengerorg.telegram.messenger.webSie können andere Anwendungen auch in audioserver_hook.cpp hinzufügen:
static const char* kTargetPackages[] = {
"com.whatsapp",
"com.whatsapp.w4b",
"org.thoughtcrime.securesms",
"org.telegram.messenger",
"org.telegram.messenger.web"
};
Ein Sitzungsverzeichnis wird bei der Injektion in audioserver unter folgendem Pfad erstellt:
/data/local/tmp/voip/audioserver_session_<timestamp>/
Dateien werden zunächst mit einer .tmp-Erweiterung erstellt und beim Stoppen des Tracks umbenannt:
<packageName>_<sampleRate>_<timestamp>.bc<packageName>_<sampleRate>_<timestamp>.acBeispielsitzung:
/data/local/tmp/voip/audioserver_session_1725389200/
├── com.whatsapp_48000_1725389201_123456.ac
├── com.whatsapp_48000_1725389201_123789.bc
Da die Ziellibrary gestrippt ist und Methoden in libaudioflinger.so nicht exportiert werden, benötigen wir exakte Offsets der Methoden und anderer zugehöriger Komponenten für erfolgreiches Hooking.
Wir können diese Offsets aus der statischen Analyse mit IDA-PRO oder aus der dynamischen Analyse mit Frida extrahieren.
Sobald die Offsets bekannt sind, können wir sie in der Headerdatei offsets.h ersetzen.