
🔬 Uno strumento di ricerca Android avanzato per la cattura audio VoIP in tempo reale (Uplink/Downlink) mediante hook dinamici su libaudioflinger.so. Testato e realizzato su WhatsApp, Signal e Telegram su Android 14.
Obiettivo: Dimostrare la cattura di flussi VoIP effettuando l'hook dell'audioserver di Android (in particolare libaudioflinger.so) e registrando i buffer PCM in uplink (microfono) e downlink (altoparlante) quando il sistema è in modalità comunicazione.
App di Controllo (Android)
Interfaccia con 9 pulsanti per gestire la configurazione delle policy SELinux, l'iniezione del payload, lo spostamento dei dati e la riproduzione.
Payload (libaudiohook.so)
Libreria condivisa C++ (compilata come parte del progetto dell'app) che aggancia i metodi interni di AudioFlinger usando Dobby e scrive i buffer PCM grezzi in una directory di sessione.
Post-Elaborazione
Strumento aggiuntivo, tools/audioparser.py, converte i file grezzi .ac(Downlink)/.bc(Uplink) in WAV. Il file manager dell'app può anche convertire e riprodurre in-app.
Utility di Ricerca
Script Frida per il tracciamento iniziale delle funzioni e la scoperta degli offset; file di analisi per simboli/offset e altri frammenti.
Questa applicazione Android fornisce un'interfaccia grafica per gestire la registrazione VoIP tramite l'audioserver. Si integra con un payload nativo che si aggancia allo stack audio di Android per catturare l'audio del microfono e dell'altoparlante dalle applicazioni VoIP.
L'app funge da centro di controllo, consentendo di iniettare le policy SELinux richieste, avviare/fermare il monitoraggio, gestire i dati registrati e riprodurre i file audio VoIP catturati.
L'attività principale contiene 9 pulsanti di controllo:
Inietta Policy
Inietta le policy SELinux necessarie affinché audioserver e questa app funzionino insieme.
Avvia Monitoraggio
Inietta il payload della libreria condivisa in audioserver, abilitando la cattura dell'audio VoIP tramite hook di RecordTrack e PlaybackTrack. Usa AndKittyInjector per l'iniezione di processo.
Ferma Monitoraggio
Riavvia il processo audioserver, fermando il monitoraggio e rimuovendo gli hook iniettati.
Copia Dati
Copia l'audio PCM grezzo catturato dalla directory temporanea /data/local/tmp/voip a /sdcard/voip.
Visualizza Log
Mostra i log relativi all'iniezione, all'hook e allo stato della registrazione.
Abilita SELinux
Ripristina la modalità enforcing di SELinux.
Disabilita SELinux
Imposta SELinux in modalità permissive. Usalo quando le policy iniettate falliscono.
Riproduci Audio
Apre il File Manager VoIP personalizzato (/sdcard/voip/):
Elimina Dati
Elimina tutti i dati audio sia da /data/local/tmp/voip che da /sdcard/voip.
NOTA: Dopo l'eliminazione dei dati, è necessario re-iniettare il payload in audioserver per la creazione della directory e il salvataggio dei dati.
+----------------------+
| |
| App MainActivity |
| |
| |
|(9 Control Buttons UI)|
| |
| |
+----------+-----------+
|
|
|
+----------v-----------+
| |
| JNI Layer |
| |
| Selinux, Process Inje|
| ction, |
| |
| |
+----------------------+
Questa libreria condivisa viene iniettata in audioserver per rilevare AUDIO_MODE_IN_COMMUNICATION e catturare i flussi audio VoIP direttamente dallo stack audio di Android per un set predefinito di nomi pacchetto.
Usa il framework di hooking inline Dobby per intercettare metodi critici all'interno di libaudioflinger.so.
Entrambi i flussi audio uplink (microfono) e downlink (altoparlante) vengono catturati e scritti in file di sessione per l'elaborazione successiva.
La libreria installa hook sulle seguenti funzioni all'interno di AudioFlinger e classi correlate:
| Funzione | Scopo |
|---|---|
AudioFlinger::setMode | Tiene traccia delle transizioni dentro/fuori dalla modalità IN_COMMUNICATION (VoIP attivo). |
RecordTrack::getNextBuffer | Cattura i frame audio del microfono (uplink). |
PlaybackThread::Track::getNextBuffer | Cattura i frame audio dell'altoparlante (downlink). |
Track::stop | Chiude e finalizza il file downlink. |
RecordTrack::stop | Chiude e finalizza il file uplink. |
La libreria filtra i flussi in base al mapping UID → Pacchetto.
App attualmente monitorate:
com.whatsappcom.whatsapp.w4b (WhatsApp Business)org.thoughtcrime.securesms (Signal)org.telegram.messengerorg.telegram.messenger.webPuoi aggiungere altre applicazioni anche all'interno di audioserver_hook.cpp:
static const char* kTargetPackages[] = {
"com.whatsapp",
"com.whatsapp.w4b",
"org.thoughtcrime.securesms",
"org.telegram.messenger",
"org.telegram.messenger.web"
};
Una directory di sessione viene creata all'iniezione in audioserver in:
/data/local/tmp/voip/audioserver_session_<timestamp>/
I file vengono prima creati con estensione .tmp, poi rinominati all'arresto della traccia:
<packageName>_<sampleRate>_<timestamp>.bc<packageName>_<sampleRate>_<timestamp>.acEsempio di sessione:
/data/local/tmp/voip/audioserver_session_1725389200/
├── com.whatsapp_48000_1725389201_123456.ac
├── com.whatsapp_48000_1725389201_123789.bc
Poiché la libreria target è strippata e i metodi non sono esportati in libaudioflinger.so, abbiamo bisogno di offset esatti dei metodi e di altri componenti correlati per un hooking efficace.
Possiamo estrarre questi offset tramite analisi statica con IDA-PRO o analisi dinamica con Frida.
Una volta noti gli offset, possiamo sostituirli all'interno del file header offsets.h.