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 位数据
我的经验: 我遇到过一块智能插座,UART 口被抹掉了丝印,但板子背面有四个测试点。用逻辑分析仪一抓,其中一个点在启动时规律性跳变——那就是 TX。接上串口工具,波特率 115200,直接看到了 uboot 启动日志。

2.1.2 JTAG——调试器的终极武器

JTAG 比 UART 强大得多。它不仅能输出日志,还能直接读写内存、设置断点、单步执行代码。JTAG 接口通常有 4 根信号线:TMS、TCK、TDI、TDO,外加 Vref 和 GND。

识别 JTAG 的技巧:

  • JTAG 的 TCK 脚在启动时会有固定频率的时钟信号
  • TMS 脚在复位后会有一段特定的状态机序列
  • 用 JTAGulator 或类似工具可以自动扫描
注意: 有些设备会禁用 JTAG 或设置密码。我曾经碰到一台智能网关,JTAG 接口是物理断开的——板子上有焊盘,但没焊接排针。补上排针后,发现 JTAG 被锁了。这种情况只能走其他路径。

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 等。

操作步骤:

  1. 确认 Flash 芯片型号(看丝印,比如 W25Q64、MX25L128)
  2. 在编程器软件中选择对应型号
  3. 连接引脚:CS、SCLK、MOSI、MISO、VCC、GND
  4. 读取全片数据,保存为 .bin 文件
  5. 校验读取结果(读两次,对比 MD5)
避坑指南: 我曾经读一块 16MB 的 SPI Flash,第一次读出来全是 0xFF。检查发现是夹子没夹紧,MISO 脚虚接了。所以读完后一定要校验,最好读两次。

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 抓取步骤

  1. 找到板子上的 UART TX 脚(用万用表测电压,启动时跳变的那个)
  2. 将逻辑分析仪的通道 0 接到 TX 脚,GND 接到板子地
  3. 设置采样率:至少 4 倍于波特率(比如 115200 波特率,采样率设 1MHz 以上)
  4. 触发方式:设成下降沿触发(UART 起始位是低电平)
  5. 给设备上电,等待触发
  6. 抓取完成后,用协议解析功能解码 UART 数据
关键点: 波特率不确定怎么办?逻辑分析仪软件通常有自动波特率检测功能。如果没有,就试常见的:9600、19200、38400、115200、921600。我遇到过最奇葩的是 230400,一个智能灯泡用的。

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 本章知识体系

下面这张图总结了本章的核心逻辑:从硬件接口到固件提取的完整路径。

固件提取核心路径 硬件接口识别 Flash 芯片读取 逻辑分析仪抓取 UART TX/RX/GND 识别 波特率探测 启动日志获取 编程器读取 芯片型号确认 SPI 引脚连接 全片读取与校验 逻辑分析仪 信号捕获 协议解码 日志分析 固件文件(.bin) 三种路径最终汇聚到固件文件,后续分析的基础 调试接口 存储芯片 信号分析

2.5 实战要点总结

接口/方法 难度 成功率 风险 适用场景
UART 日志抓取 设备可启动,有 TX 信号
JTAG 调试 需要调试器,可能被锁定
SPI 编程器读取 芯片可拆卸或可夹持
逻辑分析仪抓取 任何有信号输出的设备
热拔插法 仅应急使用
我的建议: 拿到新板子,先试 UART 抓日志。如果不行,再看 Flash 芯片能不能用编程器读。逻辑分析仪是兜底方案——只要芯片在工作,就一定有信号可以抓。这三种方法配合使用,90% 的设备都能搞定。

嗯,这一章的内容就到这里。固件提取是逆向分析的地基,地基打不牢,后面全是空中楼阁。下一章我们会深入分析提取到的固件,看看里面到底藏了什么秘密。


专注资料整理