
Реверс-инжиниринг и кастомная прошивка для IoT-камер на базе Allwinner V3, включая парсеры прошивок, клиент AVIOCTRL и доказательство концепции CVE-2026-52656 для неавторизованной замены прошивки по OTA.

Trocar para Português (Brasil)
Заметки по обратному инжинирингу, инструменты для работы с прошивкой, proof-of-concept код и интерфейс кастомной прошивки для версии SJCAM SJ4000 Air на SoC Allwinner V3.
Исследовательская статья
Этот репозиторий содержит код и артефакты, созданные в ходе исследования. Полная статья объясняет процесс от первого дампа прошивки до кастомной прошивки Lelouch.
Прочитать полную исследовательскую статью на английском) или на португальском.
Эта работа началась с простого вопроса: насколько полный контроль я могу получить над дешёвой экшн-камерой без документации, исходного кода или поддержки вендора?
Камера оказалась построена на SoC Allwinner V3 и сильно модифицированной системе Android 4.4. Её основное приложение sdv общается с проприетарными сервисами камеры и дисплея через Binder, отрисовывает интерфейс с помощью MiniGUI, предоставляет HTTP-сервер для обновлений прошивки и связывается с приложением SJCAM Zone по проприетарному протоколу.
Репозиторий документирует путь от извлечения прошивки до работающей замены для sdv. Он включает инструменты для форматов прошивки, встреченных в ходе исследования, базы IDA для обратно спроектированных бинарников, клиент AVIOCTRL, исходный код кастомной прошивки Lelouch и proof of concept, связанный с CVE-2026-52656.
Код предназначен для исследованной платы на Allwinner V3 с контроллером дисплея ST7789V и сенсором изображения GC4653. Более старые блоки SJ4000 на базе Novatek NT9665X включены только как часть раннего исследования и используют другой формат прошивки. Одних названий продуктов недостаточно для определения совместимости.
Lelouch — это интерфейс, заменяющий оригинальный исполняемый файл sdv камеры. Он собран с использованием проприетарных библиотек, извлечённых из прошивки, и использует те же внутренние интерфейсы, что и оригинальное приложение.
Текущая реализация включает:
HerbCamera и CedarDisplaywpa_supplicant для ARMv7Lelouch не является полноценной дистрибуцией или универсальной прошивкой для любого продукта, продаваемого как SJ4000. Он зависит от библиотек, ядра, сервисов, разметки разделов, контроллера дисплея, сенсора изображения и конфигурации платы, используемых в исследованном устройстве на Allwinner V3.
| Путь | Содержимое |
|---|---|
Lelouch/ | Интерфейс кастомной прошивки, сборочное окружение, восстановленные заголовки, проприетарные динамические библиотеки и модифицированный исходный код wpa_supplicant |
Reversing Scripts/ | Парсеры и упоковщики для прошивок Allwinner IMAGEWTY, Allwinner eGON и Novatek BCL1 |
AVIOCTRL Script/ウタ.py | Интерактивный клиент для проприетарного протокола TCP, используемого SJCAM Zone |
Bin Files/ | Базы IDA для основных исполняемых файлов и динамических библиотек, проанализированных в ходе исследования |
Firmwares Files/ | Образцы прошивок Allwinner и Novatek, использованные при разработке |
POC/ | Proof of concept для CVE-2026-52656, сфабрикованный образ eGON и демонстрационная полезная нагрузка с фреймбуфером/аудио |
Некоторые каталоги содержат материалы третьих сторон или проприетарные материалы, извлечённые с устройства. Их присутствие предназначено для обеспечения совместимости и исследований в области безопасности и не означает открытие исходного кода этих компонентов.
Сборка протестирована на x86-64 Linux. Вам понадобятся Python 3, GNU Make, Git, среда C/C++ и доступ в сеть для первоначальной загрузки инструментария.
git clone https://github.com/keowu/sjcam.git
cd sjcam/Lelouch
python3 prepare_build.py
prepare_build.py загружает фиксированный sysroot Android API level 14 и кросс-компилятор ARM arm-linux-androideabi-4.6 в Lelouch/android_compilers/. Затем он собирает модифицированный статический wpa_supplicant и запускает make. Загруженные файлы компилятора и сгенерированные бинарники игнорируются Git.
Полученные файлы:
Lelouch/Lelouch
Lelouch/wpa_supplicant
Для пересборки после изменения C++ исходников:
cd Lelouch
make clean
make
Сгенерированный бинарник Lelouch предназначен для замены /bin/sdv в извлечённой корневой файловой системе. Режим станции Wi-Fi также ожидает собранный wpa_supplicant по пути /mnt/extsd/sta/wpa_supplicant на SD-карте камеры.
Экспериментальный код обнаружения лиц ищет сгенерированный файл каскада по пути:
/mnt/extsd/frontalface.casc
Репозиторий включает предварительно сгенерированный каскад и конвертер, использованный для его создания:
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
Полная процедура извлечения, замены корневой файловой системы, переупаковки и прошивки с помощью LiveSuit описана в исследовательской статье, ссылка на которую находится вверху этой страницы.
Все точки входа парсеров — это скрипты Python 3 со встроенным выводом --help и без сторонних зависимостей Python.
Читает внешний образ прошивки LiveSuit, извлекает его файлы и пересобирает образ из извлечённого каталога.
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
Просматривает, извлекает и переупаковывает контейнер full_img.fex, найденный внутри образа 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
Упаковщик использует оригинальный файл как шаблон, чтобы сохранить исходную структуру и метаданные, заменяя разделы.
Распаковывает контейнер BCL1, используемый в более старых прошивках SJ4000 на базе Novatek, и может сканировать результат на наличие встроенных ресурсов и секций прошивки.
python3 "Reversing Scripts/Novatek もな BCL1 - Firmware Parser/main.py" \
"Firmwares Files/OLD_SJCAM_Novatek_NT9665X/SJCAM001.bin" \
-o firmCode.bin \
--extract