keowu/sjcam
GitHub: keowu/sjcam
针对 Allwinner V3 版 SJCAM SJ4000 Air 运动相机的逆向工程项目,提供固件解析工具、专有协议客户端、自定义固件及漏洞概念验证。
Stars: 8 | Forks: 1
# Lelouch:SJCAM SJ4000 固件研究与自定义固件
[](https://github.com/keowu/sjcam/actions/workflows/ci.yml)

[切换至葡萄牙语(巴西)](README-pt-br.md)
逆向工程笔记、固件工具、概念验证代码,以及针对采用 Allwinner V3 版本的 SJCAM SJ4000 Air 的自定义固件接口。
## 关于本项目
该相机最终被证实使用了 Allwinner V3 SoC 和经过深度定制的 Android 4.4 系统。其主应用程序 `sdv` 通过 Binder 与专有的相机和显示服务进行通信,使用 MiniGUI 渲染界面,暴露 HTTP 服务器以进行固件更新,并通过专有协议与 SJCAM Zone 应用程序进行通信。
本仓库记录了从提取固件到开发可运行的 `sdv` 替代方案的整个过程。它包含研究中遇到的固件格式工具、逆向工程二进制文件的 IDA 数据库、AVIOCTRL 客户端、Lelouch 自定义固件源码,以及与 CVE-2026-52656 相关的概念验证代码。
本代码专门针对研究中使用的、配备 ST7789V 显示控制器和 GC4653 图像传感器的 Allwinner V3 主板。基于 Novatek NT9665X 的旧款 SJ4000 设备仅作为早期研究的一部分被包含在内,且使用不同的固件格式。仅凭产品名称不足以确定兼容性。
## Lelouch
Lelouch 是相机原始 `sdv` 可执行文件的替代接口。它基于从固件中提取的专有库构建,并使用与原始应用程序相同的内部接口。
当前的实现包括:
- 通过逆向工程的 `HerbCamera` 和 `CedarDisplay` 接口进行相机预览
- 为相机 320x240 显示屏和物理按键设计的 MiniGUI 接口
- 通过 Allwinner 硬件抽象层进行 Wi-Fi 热点控制
- 使用定制的 ARMv7 版本 `wpa_supplicant` 实现的 Wi-Fi station 模式
- 带有设备端键盘的小型文本浏览器
- 预览帧上的运动检测和实验性的 Haar 级联人脸检测代码
- 电池、时间、相机、网络和调试状态视图
- Binder 初始化以及与固件中已有服务的通信
Lelouch 并不是一个完整的发行版,也不是适用于所有标为“SJ4000”产品的通用固件。它依赖于所研究的 Allwinner V3 设备所使用的库、内核、服务、分区布局、显示控制器、图像传感器和主板配置。
## 仓库结构
| 路径 | 内容 |
| --- | --- |
| `Lelouch/` | 自定义固件接口、构建环境、恢复的头文件、专有共享库,以及修改后的 `wpa_supplicant` 源码 |
| `Reversing Scripts/` | 用于 Allwinner IMAGEWTY、Allwinner eGON 和 Novatek BCL1 固件的解析器和重打包工具 |
| `AVIOCTRL Script/ウタ.py` | SJCAM Zone 使用的专有 TCP 协议的交互式客户端 |
| `Bin Files/` | 研究过程中分析的主要可执行文件和共享库的 IDA 数据库 |
| `Firmwares Files/` | 开发期间使用的 Allwinner 和 Novatek 固件样本 |
| `POC/` | CVE-2026-52656 概念验证、构造的 eGON 镜像,以及 framebuffer/音频演示 payload |
部分目录包含从设备中恢复的第三方或专有资料。它们的存在是为了实现互操作性和进行安全研究,并不意味着这些组件已开源。
## 构建 Lelouch
构建过程已在 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
```
生成的文件为:
```
Lelouch/Lelouch
Lelouch/wpa_supplicant
```
更改 C++ 源码后如需重新构建:
```
cd Lelouch
make clean
make
```
生成的 `Lelouch` 二进制文件旨在替换提取出的根文件系统中的 `/bin/sdv`。Wi-Fi station 模式还预期在相机的 SD 卡上的 `/mnt/extsd/sta/wpa_supplicant` 路径下找到构建好的 `wpa_supplicant`。
实验性的人脸检测代码会在以下位置查找生成的级联文件:
```
/mnt/extsd/frontalface.casc
```
本仓库包含一个预先生成的级联文件以及用于创建它的转换器:
```
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
```
完整的提取、根文件系统替换、重新打包以及 LiveSuit 刷机流程已记录在本页面顶部链接的研究文章中。
## 固件工具
所有解析器的入口点均为 Python 3 脚本,内置 `--help` 输出,且无第三方 Python 依赖。
### Allwinner IMAGEWTY
```
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
```
### Allwinner eGON
检查、提取并重新打包在 IMAGEWTY 镜像中发现的 `full_img.fex` 容器。
```
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
```
打包工具使用原始文件作为模板,以便在替换分区的同时保留原始布局和元数据。
### Novatek BCL1
解压旧版基于 Novatek 的 SJ4000 固件使用的 BCL1 容器,并可扫描结果以寻找内嵌的资源和固件块。
```
python3 "Reversing Scripts/Novatek もな BCL1 - Firmware Parser/main.py" \
"Firmwares Files/OLD_SJCAM_Novatek_NT9665X/SJCAM001.bin" \
-o firmCode.bin \
--extract
```
## AVIOCTRL 客户端
`ウタ.py` 实现了移动应用程序用于在端口 `6666` 上控制相机的专有 TCP 协议。它仅使用 Python 标准库处理相机的登录序列、保活消息、IOCTRL 帧、文件传输以及视频流请求。
将你的计算机连接到相机的 Wi-Fi 网络,然后运行:
```
python3 "AVIOCTRL Script/ウタ.py"
```
默认目标地址为 `192.168.100.1:6666`。必要时可以提供不同的地址:
```
python3 "AVIOCTRL Script/ウタ.py" --host 192.168.100.1 --port 6666 --debug
```
该交互式客户端可以读取电池和配置信息、检查 SD 卡、拍照、开始或停止录像、列出、上传、下载或删除文件、请求缩略图、配置 Wi-Fi、请求视频流,以及发送手动 IOCTRL 命令。
格式化 SD 卡、删除文件、更改 Wi-Fi 设置以及恢复出厂设置都会对相机进行修改。请仅在你拥有的硬件和数据上使用这些命令。
## CVE-2026-52656
成功利用此漏洞可使上传的固件完全控制设备上运行的软件。包含的概念验证通过使用自定义的 MiniGUI/AudioTrack payload 替换原始应用程序来演示这一点,该 payload 会在安装恶意 OTA 镜像后,使用原始 RGB565 帧和 PCM 音频播放 *Bad Apple!!* 视频。
`POC/` 目录包含:
媒体转换助手需要 `ffmpeg`。演示 payload 预期在相机 SD 卡的根目录下找到生成的 `video.rgb` 和 `audio.pcm` 文件。
概念验证本质上具有破坏性。格式错误或不兼容的镜像可能会使相机永久变砖。请勿在没有完整恢复途径的情况下,或针对你不拥有的设备运行它。
## 研究范围
本项目旨在对作者合法获取的硬件进行逆向工程、互操作性、教育和安全研究。SJCAM、Allwinner、Novatek、Android 及其组件名称的版权归各自所有者所有。
本仓库包含原始源代码,以及源自第三方产品的固件样本、逆向工程数据库、头文件和共享库。不对第三方材料授予任何许可。在研究环境之外重新分发或使用这些文件之前,请审查其来源和适用法律。
目前没有适用于整个仓库的开源许可证。`wpa_supplicant` 源码在 `Lelouch/modified_lelouch_wpa_supplicant_source/COPYING` 中保留了其自身的上游许可证。
标签:云资产清单, 固件研究, 客户端加密, 漏洞 PoC, 物联网设备, 硬件接口, 自定义固件, 逆向工程