keowu/sjcam

GitHub: keowu/sjcam

针对 Allwinner V3 版 SJCAM SJ4000 Air 运动相机的逆向工程项目,提供固件解析工具、专有协议客户端、自定义固件及漏洞概念验证。

Stars: 8 | Forks: 1

# Lelouch:SJCAM SJ4000 固件研究与自定义固件 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/keowu/sjcam/actions/workflows/ci.yml) ![Lelouch 项目横幅](https://static.pigsec.cn/wp-content/uploads/repos/cas/3a/3a4f785bc0e84ba07602af34fc008dfc38d98ddd271c98f9c9ed49b1e9ccc958.png) [切换至葡萄牙语(巴西)](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, 物联网设备, 硬件接口, 自定义固件, 逆向工程