
Investigación de ingeniería inversa y firmware personalizado para cámaras IoT basadas en Allwinner V3, incluidos analizadores de firmware, un cliente AVIOCTRL y una prueba de concepto de CVE-2026-52656 para reemplazo de firmware OTA no autenticado.

Trocar para Português (Brasil)
Notas de ingeniería inversa, herramientas de firmware, código de prueba de concepto y una interfaz de firmware personalizada para la versión Allwinner V3 de la SJCAM SJ4000 Air.
Artículo de investigación
Este repositorio contiene el código y los artefactos producidos durante la investigación. El artículo completo explica la investigación desde el primer volcado de firmware hasta el firmware personalizado Lelouch.
Lea el artículo de investigación completo en inglés) o en portugués.
Este trabajo comenzó con una pregunta simple: ¿cuánto control podría obtener sobre una cámara de acción económica sin documentación, código fuente ni soporte del fabricante?
La cámara resultó usar un SoC Allwinner V3 y un sistema Android 4.4 muy modificado. Su aplicación principal, sdv, se comunica con servicios de cámara y visualización propietarios a través de Binder, renderiza la interfaz con MiniGUI, expone un servidor HTTP para actualizaciones de firmware y se comunica con la aplicación SJCAM Zone mediante un protocolo propietario.
El repositorio documenta el camino desde la extracción del firmware hasta un reemplazo funcional para sdv. Incluye herramientas para los formatos de firmware encontrados durante la investigación, bases de datos IDA para los binarios invertidos, un cliente AVIOCTRL, el código fuente del firmware personalizado Lelouch y la prueba de concepto asociada a CVE-2026-52656.
El código está dirigido a la placa Allwinner V3 investigada con un controlador de pantalla ST7789V y un sensor de imagen GC4653. Las unidades SJ4000 más antiguas basadas en Novatek NT9665X se incluyen solo como parte de la investigación anterior y utilizan un formato de firmware diferente. Los nombres de productos por sí solos no son suficientes para establecer compatibilidad.
Lelouch es una interfaz de reemplazo para el ejecutable original sdv de la cámara. Está construida sobre las bibliotecas propietarias recuperadas del firmware y utiliza las mismas interfaces internas que la aplicación original.
La implementación actual incluye:
HerbCamera y CedarDisplaywpa_supplicantLelouch no es una distribución completa ni un firmware genérico para cada producto vendido como SJ4000. Depende de las bibliotecas, kernel, servicios, diseño de particiones, controlador de pantalla, sensor de imagen y configuración de placa utilizados por la unidad Allwinner V3 investigada.
| Ruta | Contenido |
|---|---|
Lelouch/ | Interfaz de firmware personalizado, entorno de compilación, encabezados recuperados, bibliotecas compartidas propietarias y código fuente modificado de wpa_supplicant |
Reversing Scripts/ | Analizadores y reempaquetadores para IMAGEWTY de Allwinner, eGON de Allwinner y BCL1 de Novatek |
AVIOCTRL Script/ウタ.py | Cliente interactivo para el protocolo TCP propietario usado por SJCAM Zone |
Bin Files/ | Bases de datos IDA para los ejecutables principales y bibliotecas compartidas analizadas durante la investigación |
Firmwares Files/ | Muestras de firmware de Allwinner y Novatek utilizadas durante el desarrollo |
POC/ | Prueba de concepto para CVE-2026-52656, imagen eGON manipulada y el payload de demostración de framebuffer/audio |
Algunos directorios contienen material de terceros o propietario recuperado del dispositivo. Su presencia es para fines de interoperabilidad e investigación de seguridad y no convierte esos componentes en código abierto.
La compilación se probó en Linux x86-64. Necesita Python 3, GNU Make, Git, un entorno de compilación C/C++ y acceso a la red para la descarga inicial del conjunto de herramientas.
git clone https://github.com/keowu/sjcam.git
cd sjcam/Lelouch
python3 prepare_build.py
prepare_build.py descarga un sysroot fijado de Android API nivel 14 y el compilador cruzado ARM arm-linux-androideabi-4.6 en Lelouch/android_compilers/. Luego compila el wpa_supplicant estático modificado y ejecuta make. Los archivos del compilador descargados y los binarios generados son ignorados por Git.
Los archivos resultantes son:
Lelouch/Lelouch
Lelouch/wpa_supplicant
Para recompilar después de cambiar las fuentes en C++:
cd Lelouch
make clean
make
El binario Lelouch generado está destinado a reemplazar /bin/sdv en el sistema de archivos raíz extraído. El modo estación Wi-Fi también espera el wpa_supplicant compilado en /mnt/extsd/sta/wpa_supplicant en la tarjeta SD de la cámara.
El código experimental de detección de rostros busca el archivo de cascada generado en:
/mnt/extsd/frontalface.casc
El repositorio incluye una cascada pregenerada y el convertidor utilizado para crearla:
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
El procedimiento completo de extracción, reemplazo del sistema de archivos raíz, reempaquetado y flasheo con LiveSuit está documentado en el artículo de investigación enlazado al inicio de esta página.
Todos los puntos de entrada de los analizadores son scripts de Python 3 con salida --help incorporada y sin dependencias de terceros de Python.
Lee la imagen de firmware externa de LiveSuit, extrae sus archivos y reconstruye una imagen a partir de un directorio extraído.
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
Inspecciona, extrae y reempaqueta el contenedor full_img.fex que se encuentra dentro de la imagen 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
El empaquetador usa el archivo original como plantilla para que el diseño y los metadatos originales se puedan conservar mientras se reemplazan las particiones.