
Trocar para Português (Brasil)
针对 SJCAM SJ4000 Air 的 Allwinner V3 版本的逆向工程笔记、固件工具、概念验证代码以及自定义固件界面。
研究文章
本仓库包含研究过程中产生的代码和成果。完整文章阐述了从首次固件转储到 Lelouch 自定义固件的整个调查过程。
这项工作始于一个简单的问题:在没有文档、源代码或供应商支持的情况下,我能对一台廉价运动相机获得多少控制权?
结果发现该相机使用了 Allwinner V3 SoC 和一个经过深度修改的 Android 4.4 系统。其主应用程序 sdv 通过 Binder 与专有的相机和显示服务通信,使用 MiniGUI 渲染界面,提供用于固件更新的 HTTP 服务器,并通过专有协议与 SJCAM Zone 应用程序通信。
本仓库记录了从固件提取到 sdv 替代方案的全过程。它包括研究过程中遇到的固件格式的工具、逆向二进制文件的 IDA 数据库、一个 AVIOCTRL 客户端、Lelouch 自定义固件源码,以及与 CVE-2026-52656 相关的概念验证。
代码针对所研究的 Allwinner V3 主板,配备 ST7789V 显示控制器和 GC4653 图像传感器。基于 Novatek NT9665X 的旧款 SJ4000 单元仅作为早期研究的一部分包含在内,并使用不同的固件格式。仅凭产品名称不足以确定兼容性。
Lelouch 是相机原始 sdv 可执行文件的替代界面。它基于从固件中恢复的专有库构建,并使用与原始应用程序相同的内部接口。
当前实现包括:
HerbCamera 和 CedarDisplay 接口实现相机预览wpa_supplicant 实现 Wi-Fi 站模式Lelouch 不是一个完整的发行版,也不是适用于所有以 SJ4000 名义销售的产品通用固件。它依赖于所研究的 Allwinner V3 单元所使用的库、内核、服务、分区布局、显示控制器、图像传感器和主板配置。
某些目录包含从设备恢复的第三方或专有材料。它们的提供是为了互操作性和安全研究目的,并不表示这些组件是开源的。
构建已在 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 将固定版本的 Android API 14 sysroot 和 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 位于相机 SD 卡的 /mnt/extsd/sta/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 包。
读取外层的 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
检查、提取并重新打包在 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 的 SJ4000 固件使用的 BCL1 容器,并可扫描结果以查找嵌入的资源和固件段。
python3 "Reversing Scripts/Novatek もな BCL1 - Firmware Parser/main.py" \
"Firmwares Files/OLD_SJCAM_Novatek_NT9665X/SJCAM001.bin" \
-o firmCode.bin \
--extract
ウタ.py 实现了移动应用程序用于控制相机的专有 TCP 协议(端口 6666)。它仅使用 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 设置以及恢复出厂设置会修改相机。请仅对属于您自己的硬件和数据使用这些命令。
被研究的固件在相机热点激活时暴露了一个未经验证的 HTTP 端点。它接受任意文件上传,并直接将其写入 SD 卡,而无需验证客户端或上传内容。这使得完全固件替换成为可能,因为攻击者可以上传一个名为 full_img.fex 的自定义 eGON 镜像;相机会将该文件名识别为 OTA 包,并通过其正常的更新流程安装攻击者控制的固件,如同官方更新一样。
成功利用后,上传的固件将完全控制设备上运行的软件。随附的概念验证通过演示说明了这一点:在恶意 OTA 镜像安装后,它将原始应用程序替换为一个自定义的 MiniGUI/AudioTrack 负载,该负载使用原始 RGB565 帧和 PCM 音频播放 Bad Apple!! 视频。
POC/ 目录包含:
run_exploit.sh,用于将攻击者控制的 full_img.fex 上传到相机full_img.fex,精心构造的 eGON 固件镜像,可被相机的 OTA 更新机制接受バイバイ/,用于演示更新后任意代码执行的 MiniGUI 和 AudioTrack Bad Apple!! 负载extract_rgb_pcm_from_mp4/,用于将演示视频转换为原始 RGB565 和 PCM 数据的辅助工具媒体转换辅助工具需要 ffmpeg。生成的 video.rgb 和 audio.pcm 文件期望位于相机 SD 卡的根目录,以供演示负载使用。
该概念验证本质上是破坏性的。格式错误或不兼容的镜像可能永久性地损坏相机。请勿在您不拥有的设备上运行,或没有完整恢复路径的情况下运行。
该项目旨在为逆向工程、互操作性、教育以及安全研究而创建,基于作者合法获取的硬件。SJCAM、Allwinner、Novatek、Android 及其组件的名称属于其各自所有者。
本仓库包含原始源代码,以及来自第三方产品的固件样本、逆向工程数据库、头文件和共享库。对于第三方材料不授予任何许可。在研究环境之外重新分发或使用这些文件前,请审查其来源和适用法律。
目前没有仓库范围内的开源许可。wpa_supplicant 源码保留了其自身的上游许可,位于 Lelouch/modified_lelouch_wpa_supplicant_source/COPYING。
| 路径 | 内容 |
|---|
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 镜像以及帧缓冲/音频演示负载 |