嵌入式家用智能设备刷机与逆向指南
适用:路由器、电视盒子、移动 Wi-Fi、智能音箱、摄像头及 Linux/Android/RTOS 嵌入式设备。
1. 情报收集与同源追溯
- 建档:商品名、厂商、FCC ID/认证号、铭牌SN(私密保存)、PCB Revision、照片、固件版本、购买批次;相同商品名可能换SoC、RAM或Flash。
- 硬件盘点:SoC完整丝印、RAM型号/位宽/容量、Flash型号和介质、PMIC、Wi-Fi/BT/蜂窝模组、PHY/交换机、USB Hub、晶振、电源轨、关键测试点。
- OEM溯源:官方固件/开源声明/GPL源码包 → FCC公开资料或当地认证材料 → DTS的
compatible、model、board_name→ 上游Linux/OpenWrt提交与论坛 → 公版BSP/同板设备。认证照片不一定揭示屏蔽罩内部结构,亦不保证有完整原理图。 - 收集固件:OTA链接、系统升级缓存、官方恢复包、GPL提供的内核源码、SDK、设备树、出厂日志。记录来源、版本、哈希;不要凭猜测拼接升级URL或将未知镜像直接刷入。
- 硬件差异表:同SoC不等于同板;至少核对DDR类型、存储介质/页布局、PHY/接口模式、GPIO、PMIC、射频前端、校准布局、启动介质与安全启动状态。
产出:hardware.md、电路板照片、sources.md、芯片列表、可疑同源设备对照表。
2. PCB、电气与调试端口
- 先断电测量:GND通断、电源输入、测试点参考地;明确UART IO是1.8V、3.3V还是其他电平,不能根据附近VCC推断串口电平。常见
115200 8N1,也可能是57600/38400/921600。 - UART接线:设备TX→适配器RX、设备RX→适配器TX、GND共地。通常不接USB-TTL适配器VCC;严禁将5V TTL接至低压IO。排查上电乱码需区分错误波特率、启动阶段切换波特率、供电/地问题和DDR初始化失败。
- 供电:可调稳压电源限流;记录额定电压、启动峰值、待机电流。注意锂电、电源反灌、共地、ESD、热风焊盘脱落风险;市电设备必须隔离高压侧。
- JTAG/SWD:识别TCK/TMS/TDI/TDO/TRST或SWDIO/SWCLK;工具OpenOCD、CMSIS-DAP、J-Link、FT2232H。焊盘存在不等于调试口可用,量产安全配置可能禁用访问。
- 总线抓取:逻辑分析仪用于UART/SPI/I²C波形及上电时序;高速总线(eMMC/UFS/USB3/PCIe)需相应专业设备,廉价分析仪不能替代。
- 在线SPI夹子:可能被主控争用、通过IO反向供电;不稳定时必须断电/隔离/拆焊并复读校验。CH341A硬件版本与实际IO电压务必确认。
产出:测试点图、电平表、供电/复位时序、完整原厂启动串口日志。
3. 启动链、可信执行环境与签名
典型ARM64设备可能是:
BootROM/PBL → SPL/Preloader/BL2 → (TF-A BL31、OP-TEE BL32等)
→ U-Boot/BL33 或厂商加载器 → Kernel+DTB+Initramfs → RootFS/Init
不同MTK、Rockchip、Amlogic、Qualcomm、Broadcom及Android设备使用不同加载器/封装;一些阶段不存在或集成在一起。先从串口、固件头、分区、启动日志和公开BSP还原实际启动链。
逐项审查:Secure Boot公钥哈希与eFuse/OTP;FIT签名;Android AVB/dm-verity;anti-rollback版本;TEE/TrustZone;RPMB与设备绑定密钥;A/B boot control。Flash用户区完整备份不包含所有eFuse、RPMB或设备私钥状态,可能不能实现跨硬件恢复或完全回滚。优先使用厂商认可的开发/恢复机制,签名校验失败不要盲写。
产出:boot-chain.md,每个阶段的来源、版本、加载地址、签名/回滚依赖和恢复通道。
4. 原厂固件获取与全量备份
4.1 获取途径(由低到高侵入)
- 官方OTA、工厂恢复包、源码包和升级缓存。
- 系统内只读导出,例如MTD分区、eMMC用户区和引导分区。
- 厂商维护协议、BootROM下载/恢复模式的实际可用读取功能。
- 断电ISP或拆焊后用专用编程器离线读取。
平台区分:MT798x mtk_uartboot属于特定SoC的串口引导/恢复生态,不等于通用MTK手机BROM/SP Flash Tool;Rockchip可用rkdeveloptool/RKDevTool但需确认Loader/Maskrom支持;Amlogic的USB Burning工具依赖具体SoC/板卡;Qualcomm EDL往往需要兼容且获授权的Firehose加载器。进入底层模式不等于一定允许读回、解密或写入。
4.2 按存储介质选择备份
| 介质 | 必需信息 | 备份与恢复要点 |
|---|---|---|
| SPI NOR | JEDEC ID、SFDP、容量、地址模式、写保护 | 全片读取、复读SHA-256、明确擦写扇区 |
| SPI/Parallel NAND | 页/块大小、OOB、ECC方案、坏块表 | 区分逻辑数据、原始页+OOB、UBI卷;不可把普通dd等同物理全片快照 |
| eMMC | User Area、boot0、boot1、EXT_CSD、启动分区配置 | 分区域备份;保留分区布局与配置;RPMB通常不可常规复制 |
| UFS | LUN/Boot LUN、设备描述符、访问限制 | 专用工具、按LUN备份、注意安全区域 |
| SD/USB盘 | 分区表、引导扇区、文件系统 | 原始镜像+关键分区哈希 |
Linux设备的只读勘察(按实际存在的命令运行):
uname -a
cat /proc/cmdline
cat /proc/mtd 2>/dev/null
cat /proc/partitions
lsblk -o NAME,SIZE,RO,TYPE,FSTYPE,PARTLABEL 2>/dev/null
find /sys/block -maxdepth 2 -name size 2>/dev/null
cat /proc/device-tree/model 2>/dev/null
cat /sys/firmware/devicetree/base/compatible 2>/dev/null | tr '\0' '\n'
dmesg | grep -Ei 'mtd|nand|spi|mmc|ufs|ubi|bad block|ecc|boot'示例:MTD只读导出(分区名和设备号必须先核对):
cat /proc/mtd
# 某些系统提供 nanddump;具体选项依工具版本、介质及ECC/OOB策略确定
nanddump --help 2>/dev/null
# NOR常可通过对应只读MTD字符设备导出,仍须按实际驱动与布局验证
# dd if=/dev/mtdX of=/mnt/usb/mtdX.bin bs=64k status=progress
sha256sum /mnt/usb/*.bin绝不把示例中的mtdX直接代入未知设备;NAND使用nanddump时明确选择是否含OOB、是否跳坏块、是否做ECC处理,并保存读取参数/坏块表。
备份验收:读出所有可读取区域;独立重复读取并比较;记录异常/ECC/坏块;哈希存档;随机检查结构与分区边界;至少两份异地副本;保护设备唯一敏感信息。无恢复写入工具、无有效Loader或无救援供电条件时,不可宣称“已具备救砖保障”。
5. 分区地图与不可替换的设备专属资产
交叉核对:/proc/mtd、内核命令行mtdparts、DTfixed-partitions、U-Boot环境、GPT/MBR、/dev/disk/by-partlabel、官方升级脚本、运行态UBI卷。
重点保护(实际名称因厂商而异):
factory/ART/EEPROM/caldata:Wi-Fi/射频校准数据。nvram/NVRAM/NVDATA/NVCFG、蜂窝modemst1/2、fsg、persist:设备配置、射频NV或基带相关数据。u-boot-env、config、product_info:可能含MAC、SN、校验值、启动条件;不应默认擦除。key、keystore、provision、frp及安全区域:可能包含密钥/绑定状态;敏感数据仅离线加密备份。boot0/boot1、SPL/BL2/FIP、原厂恢复分区、A/B元数据:启动关键区域。
校准数据一般与单块硬件绑定,不得把另一台设备的ART/factory/NV直接复制作为修复方案。设备唯一数据即使能读取,也不应上传公开仓库。
产出:partition-map.csv:介质,区域,起始地址,大小,用途,是否唯一,是否允许写入,备份文件,SHA256。
6. 固件拆解与静态分析
file firmware.bin
sha256sum firmware.bin
binwalk firmware.bin
binwalk -Me firmware.bin # 仅对可信样本在隔离环境运行提取工具
dtc -I dtb -O dts -o board.dts board.dtb常用:binwalk、unsquashfs、sasquatch(特定魔改格式)、ubireader、dumpimage、mkimage、extract-dtb、dtc、fdtdump、extract-ikconfig、readelf、objdump、strings、Ghidra、rizin。
- 不存在统一的sysupgrade二进制布局。它可能是FIT、uImage+rootfs、tar、UBI相关格式或设备特定封装;factory镜像还可能存在厂商头、校验和/签名。
binwalk扫描偏移是候选线索;先确认DTB魔数、totalsize、解包校验和内核/文件系统边界,再执行dd提取;示例固定偏移不可通用。- DTB可能独立分区、内嵌于FIT或附在内核中;运行时DT可能由Bootloader修改或应用overlay。DTS是硬件的软件描述,不等于真实原理图。
- 分析根文件系统:
/etc/init.d、/etc/rc*、systemd服务、/lib/modules/、/etc/board.d、升级脚本、NVRAM访问、闭源库及网络服务。 - 使用
Ghidra时按CPU架构、endianness、镜像格式、加载/链接/重定位地址建立工程;不能对所有U-Boot裸文件统一以0地址加载,也没有通用的“第二个IVT项”规则。
产出:镜像结构图、文件系统清单、引导参数、DTB/DTS、固件头/签名算法记录、启动脚本调用链。
7. 动态逆向与协议定位
路径:隔离网络观察 → 采集启动进程/日志 → 定位监听端口、IPC和升级守护进程 → 静态匹配ELF/脚本 → 在授权实验环境动态验证。
- 系统观察:
ps、ss -lntup、ip a、mount、dmesg、logread、strace。 - 二进制:
gdbserver/GDB、Frida(适用平台)、ltrace(兼容时);分析init、CGI、daemon、HAL/Binder、配置读写链。 - 网络:
tcpdump、Wireshark;关注HTTP(S)、MQTT、CoAP、TR-069、UPnP、私有RPC、OTA清单及设备配网。 - 模拟:QEMU用户态+
binfmt_misc可帮助跑部分用户空间程序;FirmAE/Firmadyne适用于部分Linux固件。模拟ELF成功不代表SoC、NVRAM、专用ioctl或驱动已被模拟。
对账户凭据、云服务和他人设备,仅进行授权范围内测试;不要暴露生产密钥、隐私数据或未授权服务。
8. DTS、驱动与BSP板级适配
- 找同SoC且供电/存储/PHY近似的上游设备;阅读Linux
Documentation/devicetree/bindings、OpenWrt target与既有提交。 - 对照原厂DTB、运行态
/sys/firmware/devicetree/base与板级硬件,逐项整理compatible、memory、reserved-memory、pinctrl、clocks、resets、regulators、GPIO、DMA、中断、存储分区。 - 重点检查Ethernet MAC/PHY/MDIO/DSA、RGMII时延、SGMII/RMII、Wi-Fi校准路径、PCIe PERST#、USB PHY/VBUS/role-switch/Hub上电、LED/按键、RTC、看门狗、热管理。
- 接口不能按网口标称速率猜测:百兆PHY也可能以RGMII连接MAC;必须由原理图/PHY数据手册/运行态寄存器证据决定。
dtc通过仅表示语法/引用层面合理;还需适用内核的make dtbs_check、dmesg、regulator/clock/debugfs、外设实际测试。- 内核升级时核对驱动API、DMA cache一致性、IOMMU、clock/reset和热插拔逻辑;旧版闭源
.ko通常不能靠改vermagic安全跨内核运行。
闭源驱动策略:优先找开源驱动或厂商源码;若必须保留原厂内核+rootfs,验证用户态ABI、libc、内核接口及安全维护风险;同内核版本也未必保证模块ABI兼容。
产出:可审查的DTS补丁、驱动依赖矩阵、逐外设验证记录。
9. U-Boot / SPL / TF-A移植与环境
- 从设备原厂启动链确认SPL、DDR训练固件、BL31/BL32、proper的打包关系及偏移;不同SoC可能使用FIT、FIP、厂商封装、多副本槽位。
- 复用同SoC defconfig只是起点,仍须验证存储、DDR参数、DRAM布局、固件接口、设备树、链接地址与可信启动约束。
- 优先保持原厂BL2/SPL和能用的恢复加载器不变;仅替换U-Boot proper也不是天然安全,须确认ABI/布局/签名及回滚依赖。
CONFIG_DEFAULT_ENV_FILE可定义构建期默认环境(依具体U-Boot版本/配置),但不等于能覆盖现有持久化env。- 禁止将
mtd erase u-boot-env当成刷完必做动作。先printenv与备份原始env,核对MAC/SN/bootcmd/boot_targets等;只有验证无设备独有关键项且有明确恢复方案时才考虑重置。 - 启动链升级要依据厂商双槽/原子更新机制和工具支持制定。
原则:除非研究目标明确要求、恢复链已实际验证,否则不写SPL/BL2/TF-A/U-Boot。
10. 镜像构建与升级机制
OpenWrt设备移植主要核对:target/linux/<target>/下对应DTS/补丁、image/*.mk设备配方、base-files的板级网络/LED/升级脚本;常见字段包括DEVICE_DTS、DEVICE_PACKAGES、IMAGE_SIZE、KERNEL、IMAGE/sysupgrade.bin、IMAGE/factory.bin、SUPPORTED_DEVICES,字段是否适用依target/版本而定。
构建前验证:
- 精确硬件修订、内核ABI、模块依赖及镜像签名要求;
- 每个分区的真实可用空间、擦除块/页对齐、UBI布局、坏块余量;
- DTB、kernel、rootfs、initramfs、FIT配置和加载地址无覆盖;
- A/B槽位、升级元数据、恢复分区和持久化配置策略;
- 出厂factory与已安装系统sysupgrade镜像是否可互换——通常不可默认互换;
binwalk/dumpimage二次解析构建产物、比较产物布局与设备预期。
所有刷写脚本要求显式目标分区白名单,对bootloader、校准、密钥、设备配置分区默认拒绝操作;不要根据固定分区序号或猜测的偏移刷写。
11. RAM试启动与逐级验证
先确认设备允许临时启动、内存地址安全、不与运行中的loader/FDT/initrd覆盖;加载的内核/initramfs必须可信。
常见U-Boot启动方式:
| 镜像 | 常见命令 | 前提 |
|---|---|---|
| FIT/legacy uImage | bootm |
U-Boot支持相应格式/配置 |
| ARM32 zImage | bootz |
编译启用命令,正确DTB和内存地址 |
| ARM64 Image | booti |
命令可用,地址/压缩支持符合版本 |
示例仅展示流程,地址需从该设备U-Boot环境及内存映射获取:
printenv
bdinfo
# tftpboot <kernel_addr> <verified-image>
# tftpboot <fdt_addr> <verified-board.dtb>
# 按镜像格式使用 bootm / bootz / booti
RAM试启动只能验证一部分硬件与内核启动行为,不能证明Flash驱动、UBI挂载、升级、签名校验、冷启动或坏块处理可靠。
验证先后:串口稳定 → CPU/DDR → pinctrl/clock/regulator → 存储只读 → Ethernet → USB/PCIe → Wi-Fi/蜂窝 → GPIO/LED/按键 → 电源/温度 → 存储写入测试(仅专用测试区域)。
12. 分级刷写与救砖策略
首选不改启动链的官方支持升级方式;次选可还原的rootfs/kernel槽位或专用测试分区。不以“该SoC通用”作为跨板刷Bootloader依据。
刷写前再次确认:供电稳定、目标分区唯一确定、目标容量满足、备份已异机保存、恢复路径可实际执行。刷后在允许的情况下读回验证;对NAND要按逻辑映射和坏块规则比较,不能机械要求物理字节位置完全一致。
恢复能力分层:
- 系统层:failsafe、recovery、A/B rollback、固件回滚。
- Bootloader层:TFTP、Web recovery、USB升级、SD启动。
- SoC ROM层:串口引导、Maskrom、BROM/EDL等,须有兼容Loader/认证权限。
- 硬件层:SPI/NAND/eMMC离线编程,仍需兼容镜像、存储配置和设备唯一资产。
平台注意:MT798x串口引导所需DDR初始化BL2/FIP须精确匹配SoC/板型;Rockchip特定机型流传的0xCCCCCCCC Loader参数不是通用地址或推荐操作;Amlogic短接点位与USB模式随板而异;eMMC换片不仅是恢复User Area,还要核对boot分区配置、EXT_CSD、复位/引导配置及不可迁移安全状态。
故障停止条件:首次出现未知擦写偏移、ECC急剧恶化、电源异常、校准数据缺失、签名/回滚异常或目标分区与文档不符,立即终止进一步写入、留存日志并回到备份分析。
13. 设备专项适配
| 设备 | 高价值专项检查 |
|---|---|
| 路由器 | MAC/PHY/MDIO/DSA、VLAN、Wi-Fi EEPROM、RF前端/校准、NSS/HNAT、PPPoE、交换机复位 |
| 电视盒子 | Android A/B/AVB、HDMI/CEC、DRM/KMS、GPU/VPU、Widevine依赖、遥控IR、USB Hub/电源、音频 |
| 移动Wi-Fi | AP与Modem可能是独立子系统;QMI/MBIM/AT、SIM、USB复合接口、基带固件、EFS/NV、射频校准 |
| 智能音箱 | I²S/TDM、Codec/DSP、功放使能、麦克风阵列、AEC/唤醒、Wi-Fi/BT配对信息 |
| 摄像头 | MIPI CSI、传感器时钟/供电、ISP/编码器、镜头控制、夜视IR、RTSP/ONVIF |
| RTOS IoT设备 | Flash布局、链接脚本、中断向量表、SWD、OTA槽位、加密启动、外部PSRAM |
移动Wi-Fi额外原则:Linux rootfs的修改不等于基带固件可刷;蜂窝NV、IMEI与射频校准数据不得跨设备移植或任意改写。
14. 回归测试与验收
| 类别 | 验收点 |
|---|---|
| 启动 | 冷启动、热重启、多次断电恢复、Watchdog、恢复模式仍可进入 |
| 存储 | NAND ECC/坏块趋势、UBI/文件系统完整性、剩余空间、配置持久化 |
| 网络 | 所有网口/交换机、MTU、VLAN、吞吐、丢包、持续连接、IPv4/IPv6 |
| 无线/蜂窝 | 校准加载、频段/国家码合规、重连、热点/STA、Modem拨号与SIM |
| 外设 | USB热插拔、Hub、PCIe、按键、LED、GPIO、音频、HDMI、传感器 |
| 稳定性 | 温度/降频、内存泄漏、长期负载、异常掉电与恢复 |
| 升级 | 同版本重刷、升级/回滚、A/B切换、原厂恢复通道、配置迁移 |
| 安全 | 服务最小暴露、更新源与签名、密码/密钥保护、调试口部署策略 |
每个验收项记录:设备/PCB修订、固件哈希、测试命令、结果、日志路径、失败重现条件。未测项显式标记“未验证”,不能写“兼容”。
15. 工具链速查
| 场景 | 工具 |
|---|---|
| 信息与固件 | file、sha256sum、binwalk、strings、hexdump/xxd |
| 文件系统/UBI | unsquashfs、sasquatch、ubireader、mtd-utils |
| 设备树/内核 | dtc、fdtdump、extract-dtb、extract-ikconfig、dtbs_check |
| U-Boot/FIT | dumpimage、mkimage、UART日志、U-Boot源码/GDB |
| 静态逆向 | Ghidra、readelf、objdump、rizin/radare2 |
| 动态逆向 | strace、gdbserver、Frida、QEMU、FirmAE(适用时) |
| 总线/PCB | 万用表、稳压电源、逻辑分析仪、示波器、USB-TTL、J-Link/OpenOCD |
| SPI/NAND | flashrom、CH341A(需确认电压)、RT809H/专业编程器 |
| eMMC/UFS | mmc-utils、支持boot0/boot1的eMMC编程工具、专用UFS设备 |
| MTK特定平台 | mtk_uartboot、相应平台BROM/下载工具;需匹配SoC |
| Rockchip | rkdeveloptool、RKDevTool、适配Loader |
| Amlogic | USB Burning Tool及对应板卡恢复机制 |
| Qualcomm | EDL/Firehose生 |
16. 工程交付
交付前检查:镜像可重现构建;所有文件SHA-256明确;bootloader/校准数据不在公开镜像中;不同硬件修订兼容矩阵齐全;写入命令与目标地址经双人/二次校验;至少一次真实恢复演练(应使用测试机及可接受风险的恢复路径);不包含设备私钥、账号令牌、IMEI、SN等敏感数据。
17. 官方参考资料
- OpenWrt 添加设备支持:https://openwrt.org/docs/guide-developer/adding_new_device
- U-Boot文档:https://docs.u-boot.org/en/latest/
- U-Boot
bootm:https://docs.u-boot.org/en/latest/usage/cmd/bootm.html - U-Boot
bootz:https://docs.u-boot.org/en/stable/usage/cmd/bootz.html - Linux内核设备树绑定:https://www.kernel.org/doc/html/latest/devicetree/bindings/index.html
- Linux MTD/NAND文档:https://www.kernel.org/doc/html/latest/driver-api/mtdnand.html
- Android Verified Boot:https://source.android.com/docs/security/features/verifiedboot
- OpenOCD:https://openocd.org/