In Progress — Reverse Engineering

SSC Audio Port.
Samsung Seamless Codec — Galaxy Buds 3 Pro

Obiettivo del Progetto

Estrarre il file binario del Samsung Seamless Codec dal firmware del mio Tab S9 per modificarlo, farne il porting su qualsiasi dispositivo Android e illudere i sistemi proprietari, in modo da forzare sempre la codifica audio al massimo bitrate sulle mie Buds 3 Pro.

C / C++ Ghidra ARM64 Assembly LD_PRELOAD Hooking Android APEX EROFS WSL / Linux

Cosa ho fatto, in breve.

L'obiettivo del progetto era estrarre il Samsung Seamless Codec dal firmware del mio Tab S9 per portarlo su altri Android e forzare il bitrate massimo delle mie Buds 3 Pro. All'inizio ho esplorato l'immagine di sistema EROFS tramite WSL, ma il codec era nascosto nei nuovi moduli APEX di Android. Ho scompattato il pacchetto com.android.bt.apex con unzip e, visto che WSL non riusciva a montare il disco virtuale ext2 interno, l'ho estratto a forza bruta con 7-Zip.


Lì ho trovato il file libScalable_Encoder.so, ma pesava solo 1 KB: era un semplice collegamento (symlink) che rimandava alla partizione principale. Tornando alla cartella di partenza e cercando con più attenzione, ho finalmente recuperato il vero binario da 99,2 KB. Ora non mi resta che aprirlo su Ghidra per fare reverse engineering in C++ e Assembly, patchare i blocchi di Samsung e creare un wrapper universale.

Percorso completo, passo dopo passo

Passaggio 01

Il file system EROFS e Project Mainline

Sono partito dall'immagine di sistema originale del tablet, formattata in EROFS. L'ho montata su Windows usando WSL con Ubuntu e sono andato a cercare dentro system/lib64. Cercavo file come libssc.so, ma non c'era nulla. Samsung non tiene più il codec lì in modo esplicito, ma usa i moduli APEX (introdotti da Google con Project Mainline) per blindare lo stack Bluetooth.

Passaggio 02

L'estrazione dell'APEX

Mi sono spostato in system/apex/ e ho preso il file com.android.bt.apex. Dato che gli APEX funzionano come dei normali archivi, l'ho copiato su Ubuntu per decomprimerlo. Non avendo il tool base su WSL, ho lanciato:

sudo apt install unzip
unzip com.android.bt.apex

L'estrazione mi ha dato il file principale del modulo: apex_payload.img.

Passaggio 03

Il falso EROFS e l'header ext2

Davo per scontato che il payload fosse un'altra immagine EROFS. Ho lanciato il comando di estrazione:

sudo fsck.erofs --extract=payload_estratto apex_payload.img

Il terminale mi ha restituito errore: <E> erofs: cannot find valid erofs superblock. Per capire cosa avessi davanti ho letto l'header del file con il comando file apex_payload.img, scoprendo che in realtà era formattato in normale ext2.

Passaggio 04

I problemi con il kernel WSL e 7-Zip

A quel punto ho provato a montare l'immagine come loop device in sola lettura:

sudo mount -t ext2 -o loop,ro apex_payload.img payload_estratto

Altro errore: wrong fs type, bad option, bad superblock on /dev/loop0. Il kernel leggero di WSL ha spesso problemi a montare direttamente questo tipo di periferiche virtuali. Invece di perdere tempo col kernel, ho installato 7-Zip per Linux (p7zip-full) e ho forzato l'estrazione statica del file system ext2:

7z x apex_payload.img -oestrazione_finale
Passaggio 05

Il finto file (Symlink)

Dentro la cartella lib64 estratta c'era finalmente il file libScalable_Encoder.so (il nome tecnico dell'SSC). C'era un problema: pesava solo 1 KB.

Su Windows non si apriva e dando il comando cat da terminale Linux mi restituiva No such file or directory. Controllando con ls -l ho visto questo:

Era un symlink. Il modulo APEX non conteneva il codec per via delle licenze, ma aveva solo un collegamento che puntava alla partizione originale.

Passaggio 06

Il binario reale

Sono tornato alla cartella system/lib64 dell'immagine EROFS di partenza. All'inizio non lo trovavo perché nella ricerca di Windows avevo digitato libsams, che mi filtrava i risultati. Cercando "Scalable", è spuntato fuori: un binario ELF a 64-bit da 99,2 KB. Era lì dall'inizio, in mezzo alle altre librerie di sistema.

Prossimi Step

Ora che ho il binario puro, si passa all'Assembly e al codice C/C++. Il prossimo passo è caricare il file .so su Ghidra o IDA per fare reverse engineering, mappare la logica delle funzioni esportate e iniziare a patchare i controlli proprietari di Samsung per poter usare il codec ovunque.

Segui il progetto.

Tutto il codice che scrivo è open source su GitHub. I file proprietari Samsung non vengono mai distribuiti.