2、固件提取基础:硬件接口识别(UART、JTAG、SPI)、Flash芯片读取技术、使用逻辑分析仪抓取启动日志
做固件逆向,第一步不是反汇编,也不是跑脚本。
第一步是——把固件拿到手。
你想想看,没有固件文件,后面所有分析都是空中楼阁。而固件藏在哪?藏在芯片里,藏在板子上,藏在各种接口后面。这一章,我就带你把这些「藏身之处」一个个揪出来。
2.1 硬件接口识别:UART、JTAG、SPI
拿到一块陌生的智能家居板子,我习惯先看接口。不是看原理图——很多时候根本没有原理图。而是用万用表和逻辑分析仪,直接测。
2.1.1 UART(串口)——最友好的调试后门
UART 是嵌入式设备最常见的调试接口。说白了,就是一根发送线(TX)、一根接收线(RX)、一根地线(GND)。很多设备出厂时,UART 口是直接焊在板子上的,甚至留了排针。
怎么找 UART 口?
- 看板子上有没有 3 或 4 个一排的过孔,旁边可能标了 TX、RX、GND
- 用万用表测电压:空闲时 TX 脚通常是 3.3V 或 1.8V,RX 脚可能是高阻态
- 用逻辑分析仪抓波形:UART 的起始位是一个低电平,后面跟着 8 位数据
2.1.2 JTAG——调试器的终极武器
JTAG 比 UART 强大得多。它不仅能输出日志,还能直接读写内存、设置断点、单步执行代码。JTAG 接口通常有 4 根信号线:TMS、TCK、TDI、TDO,外加 Vref 和 GND。
识别 JTAG 的技巧:
- JTAG 的 TCK 脚在启动时会有固定频率的时钟信号
- TMS 脚在复位后会有一段特定的状态机序列
- 用 JTAGulator 或类似工具可以自动扫描
2.1.3 SPI——Flash 芯片的通信协议
SPI 是 Flash 芯片和主控之间的桥梁。如果你能直接访问 SPI 总线,就能在系统运行时抓取固件数据。SPI 有四根线:CS(片选)、SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)。
什么时候用 SPI 抓取?
- 当 UART 和 JTAG 都不可用时
- 当你想绕过系统保护,直接读取原始 Flash 内容时
- 当设备已经变砖,但 Flash 芯片本身没坏时
2.2 Flash 芯片读取技术
Flash 芯片是固件的最终载体。读取 Flash 的方法有很多,我按难度从低到高给你排个序。
2.2.1 热拔插法(不推荐,但应急可用)
这个方法听起来很粗暴:在设备运行时,把 Flash 芯片拔下来,插到编程器上读取。嗯,我年轻时干过这事,结果烧了两块板子。
为什么风险大?
- 热拔插可能造成引脚短路
- Flash 芯片在写入过程中断电会损坏数据
- 有些 Flash 有写保护,需要先解除
2.2.2 编程器读取(最常用)
把 Flash 芯片焊下来,或者用夹子夹住,接到编程器上。常用的编程器有 CH341A、TL866、RT809 等。
操作步骤:
- 确认 Flash 芯片型号(看丝印,比如 W25Q64、MX25L128)
- 在编程器软件中选择对应型号
- 连接引脚:CS、SCLK、MOSI、MISO、VCC、GND
- 读取全片数据,保存为 .bin 文件
- 校验读取结果(读两次,对比 MD5)
2.2.3 在线读取(不拆芯片)
如果芯片是 BGA 封装或者焊死在板子上,可以用 SPI 探针或者飞线的方式在线读取。这种方法不需要拆芯片,但需要找到 SPI 总线的测试点。
# 使用 flashrom 工具在线读取
flashrom -p linux_spi:dev=/dev/spidev0.0 -r firmware.bin
# 读取完成后校验
flashrom -p linux_spi:dev=/dev/spidev0.0 -v firmware.bin
2.3 使用逻辑分析仪抓取启动日志
逻辑分析仪是嵌入式逆向的「听诊器」。它能帮你看到芯片在启动时说了什么——哪怕 UART 口没被引出,只要 TX 脚有信号,就能抓到。
2.3.1 准备工作
- 逻辑分析仪:我用的是 Saleae Logic 8,便宜点的用 DSLogic 也行
- 探针:最好用钩子探针,方便夹住芯片引脚
- 软件:Saleae Logic 软件或 PulseView
2.3.2 抓取步骤
- 找到板子上的 UART TX 脚(用万用表测电压,启动时跳变的那个)
- 将逻辑分析仪的通道 0 接到 TX 脚,GND 接到板子地
- 设置采样率:至少 4 倍于波特率(比如 115200 波特率,采样率设 1MHz 以上)
- 触发方式:设成下降沿触发(UART 起始位是低电平)
- 给设备上电,等待触发
- 抓取完成后,用协议解析功能解码 UART 数据
2.3.3 分析启动日志
抓到的日志里,你会看到 uboot 启动信息、内核解压过程、文件系统挂载情况。这些信息能告诉你:
- CPU 型号和架构
- 内存大小和布局
- Flash 分区信息
- 内核启动参数
- 文件系统类型(squashfs、jffs2、ubifs)
举个例子,我在分析一款智能摄像头时,从启动日志里看到了这样一行:
U-Boot 2016.01 (Jan 12 2021 - 15:30:22)
DRAM: 64 MiB
NAND: 128 MiB
Partition: kernel@0x80000, rootfs@0x280000
这一行信息直接告诉我:内核在偏移 0x80000 处,文件系统在 0x280000 处。后面提取固件时,我就知道该从哪里切分。
2.4 本章知识体系
下面这张图总结了本章的核心逻辑:从硬件接口到固件提取的完整路径。
2.5 实战要点总结
| 接口/方法 | 难度 | 成功率 | 风险 | 适用场景 |
|---|---|---|---|---|
| UART 日志抓取 | 低 | 高 | 低 | 设备可启动,有 TX 信号 |
| JTAG 调试 | 中 | 中 | 中 | 需要调试器,可能被锁定 |
| SPI 编程器读取 | 中 | 高 | 低 | 芯片可拆卸或可夹持 |
| 逻辑分析仪抓取 | 低 | 高 | 低 | 任何有信号输出的设备 |
| 热拔插法 | 高 | 低 | 高 | 仅应急使用 |
嗯,这一章的内容就到这里。固件提取是逆向分析的地基,地基打不牢,后面全是空中楼阁。下一章我们会深入分析提取到的固件,看看里面到底藏了什么秘密。