Gia90/X5-mini-camera_augentix-HC1703_reverse
GitHub: Gia90/X5-mini-camera_augentix-HC1703_reverse
针对搭载 Augentix HC1703 SoC 的 X5 迷你 Wi-Fi 摄像头进行硬件拆解与固件逆向分析的技术文档,揭示了 U-Boot 固件升级协议、文件头格式及 NOR Flash 分区布局等内部实现细节。
Stars: 4 | Forks: 0
# X5 迷你摄像头拆解与逆向
通过对中国产 X5 迷你 Wi-Fi 摄像头的硬件和固件进行检查和逆向工程,获取的相关技术信息
## 硬件
SoC: Augentix HC1703
...
## 软件
Bootloader: U-Boot 2016.03 (Aug 17 2023 - 18:00:58 +0800)
...
## 固件
出厂的 U-Boot Bootloader 会尝试从 SD 卡读取名为 `xyx.upgrade.bin` 的固件升级文件和 `xyx.config` 配置文件来升级固件。
### 固件升级文件头
固件升级文件必须包含有效的文件头,才能被 Bootloader 接受并进行刷写。
文件头大小为 64 字节。
这是文件头的布局:

$\large{\color{olive}{\textsf{Magic}}}$: `27 05 19 56` (4 字节)。
$\large{\color{RoyalPurple}{\textsf{Header Checksum}}}$: 将该 Checksum 本身(0x04 至 0x07)置零后计算得出的文件头 CRC32 值 (4 字节)。
$\large{\color{teal}{\textsf{Version Time 1}}}$: Epoch 时间戳,表示固件版本时间,例如 Bootloader 会使用它来检查当前版本是否为最新。这可以避免在升级后重启时再次从 SD 卡重新刷写固件 (4 字节)。
$\large{\color{BrickRed}{\textsf{Total Size}}}$: 整个文件去除文件头后(从 "#BOOT" 到结尾)的总字节数,以十六进制值表示 (4 字节)。
$\large{\color{Plum}{\textsf{Packet ID}}}$: Bootloader 在升级过程中用于比较固件版本的 ID(与固件版本 1 结合使用) (8 字节)。
$\large{\color{green}{\textsf{Firmware Checksum}}}$: 整个文件去除文件头后的 CRC32 值 (4 字节)。
$\large{\color{blue}{\textsf{Version Time 2}}}$: Epoch 时间戳,可能用作辅助的固件版本时间,暂未查明其具体用途 (4 字节)。
### 固件升级配置
"xyx.config" 可用于控制升级过程中 Bootloader 的行为。
通过如下配置,它可用于在升级期间跳过版本控制检查:
```
force_update=1
```
### 固件布局
固件(不包含文件头)就是被写入内部 NOR Flash 的内容。
这是它的布局(Flash 分区):
```
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000050000 : "bootenv"
0x000000050000-0x000000210000 : "linux"
0x000000210000-0x0000006d0000 : "rootfs"
0x0000006d0000-0x0000007d0000 : "usrdata"
0x0000007d0000-0x0000007e0000 : "config"
0x0000007e0000-0x0000007f0000 : "database"
0x0000007f0000-0x000000800000 : "factory"
```
"bootenv" 分区以一个 Checksum 开始。
它是 "bootenv" 分区本身去除 Checksum 部分(前 4 字节)后的 CRC32 值,并按字节倒序排列。
## 硬件
SoC: Augentix HC1703
...
## 软件
Bootloader: U-Boot 2016.03 (Aug 17 2023 - 18:00:58 +0800)
...
## 固件
出厂的 U-Boot Bootloader 会尝试从 SD 卡读取名为 `xyx.upgrade.bin` 的固件升级文件和 `xyx.config` 配置文件来升级固件。
### 固件升级文件头
固件升级文件必须包含有效的文件头,才能被 Bootloader 接受并进行刷写。
文件头大小为 64 字节。
这是文件头的布局:

$\large{\color{olive}{\textsf{Magic}}}$: `27 05 19 56` (4 字节)。
$\large{\color{RoyalPurple}{\textsf{Header Checksum}}}$: 将该 Checksum 本身(0x04 至 0x07)置零后计算得出的文件头 CRC32 值 (4 字节)。
$\large{\color{teal}{\textsf{Version Time 1}}}$: Epoch 时间戳,表示固件版本时间,例如 Bootloader 会使用它来检查当前版本是否为最新。这可以避免在升级后重启时再次从 SD 卡重新刷写固件 (4 字节)。
$\large{\color{BrickRed}{\textsf{Total Size}}}$: 整个文件去除文件头后(从 "#BOOT" 到结尾)的总字节数,以十六进制值表示 (4 字节)。
$\large{\color{Plum}{\textsf{Packet ID}}}$: Bootloader 在升级过程中用于比较固件版本的 ID(与固件版本 1 结合使用) (8 字节)。
$\large{\color{green}{\textsf{Firmware Checksum}}}$: 整个文件去除文件头后的 CRC32 值 (4 字节)。
$\large{\color{blue}{\textsf{Version Time 2}}}$: Epoch 时间戳,可能用作辅助的固件版本时间,暂未查明其具体用途 (4 字节)。
### 固件升级配置
"xyx.config" 可用于控制升级过程中 Bootloader 的行为。
通过如下配置,它可用于在升级期间跳过版本控制检查:
```
force_update=1
```
### 固件布局
固件(不包含文件头)就是被写入内部 NOR Flash 的内容。
这是它的布局(Flash 分区):
```
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000050000 : "bootenv"
0x000000050000-0x000000210000 : "linux"
0x000000210000-0x0000006d0000 : "rootfs"
0x0000006d0000-0x0000007d0000 : "usrdata"
0x0000007d0000-0x0000007e0000 : "config"
0x0000007e0000-0x0000007f0000 : "database"
0x0000007f0000-0x000000800000 : "factory"
```
"bootenv" 分区以一个 Checksum 开始。
它是 "bootenv" 分区本身去除 Checksum 部分(前 4 字节)后的 CRC32 值,并按字节倒序排列。标签:Augentix, CRC32校验, HC1703, IoT hacking, SoC, U-Boot, 中国智造, 固件升级机制, 固件提取, 固件逆向, 嵌入式安全, 开放策略代理, 情报收集, 拆机分析, 智能家居, 漏洞研究, 物联网安全, 物联网设备, 硬件 hacking, 硬件逆向, 网络安全, 网络摄像头, 隐私保护