
Ricerca di reverse engineering e firmware personalizzato per telecamere IoT basate su Allwinner V3, inclusi parser di firmware, un client AVIOCTRL e un proof of concept per CVE-2026-52656 per la sostituzione non autenticata del firmware via OTA.

Trocar para Português (Brasil)
Note di reverse engineering, strumenti per il firmware, codice proof-of-concept e un'interfaccia firmware personalizzata per la versione Allwinner V3 della SJCAM SJ4000 Air.
Articolo di ricerca
Questo repository contiene il codice e gli artefatti prodotti durante la ricerca. L'articolo completo spiega l'indagine dal primo dump del firmware al firmware personalizzato Lelouch.
Leggi l'articolo di ricerca completo in inglese) o Portoghese.
Questo lavoro è iniziato con una semplice domanda: quanto controllo potrei ottenere su una action camera economica senza documentazione, codice sorgente o supporto del produttore?
La fotocamera si è rivelata utilizzare un SoC Allwinner V3 e un sistema Android 4.4 pesantemente modificato. La sua applicazione principale, sdv, comunica con servizi proprietari della fotocamera e del display tramite Binder, renderizza l'interfaccia con MiniGUI, espone un server HTTP per gli aggiornamenti del firmware e comunica con l'applicazione SJCAM Zone tramite un protocollo proprietario.
Il repository documenta il percorso dall'estrazione del firmware a una sostituta funzionante per sdv. Include strumenti per i formati di firmware incontrati durante la ricerca, database IDA per i binari reversati, un client AVIOCTRL, il codice sorgente del firmware personalizzato Lelouch e il proof of concept associato a CVE-2026-52656.
Il codice è destinato alla scheda Allwinner V3 studiata con un controller display ST7789V e un sensore immagine GC4653. Le unità SJ4000 più vecchie basate su Novatek NT9665X sono incluse solo come parte della ricerca precedente e utilizzano un formato firmware diverso. I soli nomi dei prodotti non sono sufficienti per stabilire la compatibilità.
Lelouch è un'interfaccia sostitutiva per l'eseguibile sdv originale della fotocamera. È costruita utilizzando le librerie proprietarie recuperate dal firmware e utilizza le stesse interfacce interne dell'applicazione originale.
L'implementazione attuale include:
HerbCamera e CedarDisplaywpa_supplicantLelouch non è una distribuzione completa o un firmware generico per ogni prodotto venduto come SJ4000. Dipende dalle librerie, kernel, servizi, layout delle partizioni, controller display, sensore immagine e configurazione della scheda utilizzati dall'unità Allwinner V3 studiata.
| Percorso | Contenuto |
|---|---|
Lelouch/ | Interfaccia firmware personalizzata, ambiente di build, header recuperati, librerie condivise proprietarie e sorgente modificato di wpa_supplicant |
Reversing Scripts/ | Parser e reimpacchettatori per firmware Allwinner IMAGEWTY, Allwinner eGON e Novatek BCL1 |
AVIOCTRL Script/ウタ.py | Client interattivo per il protocollo TCP proprietario utilizzato da SJCAM Zone |
Bin Files/ | Database IDA per gli eseguibili principali e le librerie condivise analizzati durante la ricerca |
Firmwares Files/ | Campioni di firmware Allwinner e Novatek utilizzati durante lo sviluppo |
POC/ | Proof of concept per CVE-2026-52656, immagine eGON creata e payload dimostrativo per framebuffer/audio |
Alcune directory contengono materiale di terze parti o proprietario recuperato dal dispositivo. La loro presenza è a scopo di interoperabilità e ricerca sulla sicurezza e non rende tali componenti open source.
La compilazione è stata testata su Linux x86-64. Sono necessari Python 3, GNU Make, Git, un ambiente di build C/C++ e accesso alla rete per il download iniziale della toolchain.
git clone https://github.com/keowu/sjcam.git
cd sjcam/Lelouch
python3 prepare_build.py
prepare_build.py scarica un sysroot Android API level 14 bloccato e il cross-compilatore ARM arm-linux-androideabi-4.6 in Lelouch/android_compilers/. Successivamente compila il wpa_supplicant statico modificato ed esegue make. I file della toolchain scaricati e i binari generati vengono ignorati da Git.
I file risultanti sono:
Lelouch/Lelouch
Lelouch/wpa_supplicant
Per ricompilare dopo aver modificato i sorgenti C++:
cd Lelouch
make clean
make
Il binario Lelouch generato è destinato a sostituire /bin/sdv nel filesystem root estratto. La modalità stazione Wi-Fi prevede anche che il wpa_supplicant compilato si trovi in /mnt/extsd/sta/wpa_supplicant sulla scheda SD della fotocamera.
Il codice sperimentale di rilevamento facciale cerca il file della cascata generato in:
/mnt/extsd/frontalface.casc
Il repository include una cascata pre-generata e il convertitore utilizzato per crearla:
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
La procedura completa di estrazione, sostituzione del filesystem root, reimpacchettamento e flashing con LiveSuit è documentata nell'articolo di ricerca collegato all'inizio di questa pagina.
Tutti i punti di ingresso dei parser sono script Python 3 con output --help integrato e nessuna dipendenza Python di terze parti.
Legge l'immagine firmware LiveSuit esterna, estrae i suoi file e ricostruisce un'immagine da una directory estratta.
python3 "Reversing Scripts/AllWinner IMAGEWTY - ROM Parser/main.py" info firmware.img
python3 "Reversing Scripts/AllWinner IMAGEWTY - ROM Parser/main.py" extract firmware.img -o image_dump
python3 "Reversing Scripts/AllWinner IMAGEWTY - ROM Parser/main.py" repack image_dump rebuilt.img
Ispeziona, estrae e reimpacchetta il contenitore full_img.fex trovato all'interno dell'immagine IMAGEWTY.
python3 "Reversing Scripts/AllWinner EGON - Firmware Parser/main.py" info full_img.fex
python3 "Reversing Scripts/AllWinner EGON - Firmware Parser/main.py" extract full_img.fex -o egon_dump
python3 "Reversing Scripts/AllWinner EGON - Firmware Parser/main.py" pack egon_dump \
--original full_img.fex \
-o rebuilt_full_img.fex
Il packer utilizza il file originale come modello in modo che il layout originale e i metadati possano essere preservati mentre le partizioni vengono sostituite.
Decomprime il contenitore BCL1 utilizzato dal firmware SJ4000 più vecchio basato su Novatek e può scansionare il risultato per risorse e sezioni firmware incorporate.
python3 "Reversing Scripts/Novatek もな BCL1 - Firmware Parser/main.py" \
"Firmwares Files/OLD_SJCAM_Novatek_NT9665X/SJCAM001.bin" \
-o firmCode.bin \
--extract