← 返回目录课程:《STM32工业控制设备固件逆向工程实战课程》
04

04 固件提取:SPI Flash、NAND与eMMC在线读取与脱机编程

形成通过SPI协议、SDIO接口读取外部存储固件,使用脱机编程器备份完整镜像
章节导航 难度:入门类型:概念框架
目标结果

把固件提取落到固件提取的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。

关键线索
接口配置流程状态日志
交付材料
架构图代码片段排障表检查清单

从物理接口到镜像文件:固件提取的三种主流路径

指标对照卡:固件提取

  • 关键对象:实际技术应用场景里的固件提取
  • 问题现象:实际技术应用场景里固件提取一开始改动很快,输入需求增加后日志记录显示状态外泄、循环依赖和接口膨胀。
  • 验证动作:先标出谁持有状态、谁发起调用、谁记录日志和失败返回,再按输入条件、阈值标准和处理动作决定接口是否需要拆分。第04节记录前后变化点时,优先确认示例片段、状态记录和固件提取是否指向同一个原因。
  • 工程判断:调整前后调用方向更清楚,失败返回、日志记录和输出结果可追踪,旧入口仍可回退,才说明边界收住了。

固件提取落地前要同时核对固件提取的eMMC在线读取、失败路径和脱机编程。

概念块:固件提取

固件提取用固件提取、eMMC在线读取、脱机编程连接到固件提取的调试、验证和交付动作。

  • 固件提取
  • eMMC在线读取
  • 脱机编程
  • 掌握通过SPI协议

输入、处理和输出的检查项

在工业控制设备的固件逆向工程中,最核心的挑战并非分析本身,而是如何完整、无干扰地获取目标固件。面对 STM32 平台上常见的 SPI Flash、NAND Flash 和 eMMC 三种存储介质,工程师需要根据电路板设计、芯片封装和调试接口的可用性,选择最合适的提取方案。本节聚焦于通过 SPI 协议、SDIO 接口进行在线读取,以及使用脱机编程器进行物理备份,核心目标是交付一个可用于后续分析的、字节级完整的固件镜像

一个常见的工程误区是认为“只要能读出数据,镜像就是可用的”。实际上,SPI Flash 的时序偏差、NAND 的坏块管理、eMMC 的 Boot Partition 配置,任何一个环节出错都会导致镜像不可用。因此,我们的实操步骤必须以“验证交付物”为主线,而不仅仅是“完成读取”

实操步骤

在连接任何探针或编程器前,先用万用表测量目标芯片的 VCC 与 GND 引脚,确认供电正常且与编程器电平一致(通常为 3.3V)。这一步能避免 80% 的因电平不匹配导致的通信失败或芯片损坏

SPI Flash 与 NAND Flash:协议差异与在线读取策略

SPI Flash(如 Winbond W25Q系列)和 NAND Flash(如 K9F 系列)虽然都是非易失性存储,但其接口协议和访问逻辑截然不同。SPI Flash 通过 SPI 协议(SCK、MOSI、MISO、CS)进行全双工通信,结构简单,适合存放固件镜像。而 NAND Flash 通常使用 8 位或 16 位并行接口,需要更复杂的命令序列和地址周期,且必须处理坏块(Bad Block)和 ECC(Error Correction Code)校验

对于 SPI Flash 的在线读取,我们通常使用 STM32 的 SPI 外设或 USB-SPI 适配器(如 FT2232H)。关键步骤是发送 0x03 (Read Data) 或 0x0B (Fast Read) 指令,随后跟 3 字节地址,连续读取直到获取完整容量。一个容易出错的细节是:许多 SPI Flash 在读取末尾会进入“连续读取模式”,如果不发送 /CS 拉高信号终止,后续指令可能被错误解析。对于 NAND Flash,由于其接口非标准化,更推荐使用脱机编程器(如 RT809H)直接夹取或焊接座子进行读取。编程器会自动处理命令序列和 ECC 校验,输出一个经过坏块标记处理的原始镜像(Raw Image)

真实项目场景

在对某款国产 PLC 进行固件提取时,发现其 SPI Flash 型号被磨除。通过测量 PCB 走线,确认 CLK、MOSI、MISO、CS 分别连接至 STM32F407 的 PA5、PA7、PA6、PA4。使用逻辑分析仪抓取上电瞬间的 SPI 通信,捕获到 0x9F (Read JEDEC ID) 指令的返回值为 0xEF 0x40 0x18,查表确认为 Winbond W25Q128JV。随后使用 FT2232H 通过 flashrom 工具成功读取 16MB 固件

eMMC 与 SDIO 接口:分区表与 Boot Partition 的陷阱

eMMC(Embedded MultiMediaCard)是当前高端工业控制设备的主流存储方案,它内部集成了 Flash 控制器和 MMC 接口。通过 STM32 的 SDIO 接口或专用的 eMMC 读卡器,我们可以访问其内部存储。eMMC 的关键在于其分区结构:它通常包含 Boot Area Partition 1 & 2、RPMB(Replay Protected Memory Block)和 User Data Area。固件可能存放在 Boot Partition 或 User Data Area 的特定偏移处

使用 STM32 的 SDIO 接口进行在线读取时,需要初始化 eMMC 设备,发送 CMD0 (GO_IDLE_STATE)、CMD1 (SEND_OP_COND) 等命令进入数据传输模式。然后通过 CMD16 (SET_BLOCKLEN) 设置块大小(通常为 512 字节),再使用 CMD18 (READ_MULTIPLE_BLOCK) 连续读取。一个常见的陷阱是:eMMC 的 Boot Partition 默认是禁用的,需要通过 CMD0 配合特定参数或修改 EXT_CSD 寄存器(如 配置,地址 179)来使能。如果直接读取 User Data Area 而忽略了 Boot Partition,可能会错过关键的引导加载程序

脱机编程器(如 EasyJTAG Plus、TL866II Plus)在处理 eMMC 时更为可靠,它们能自动识别 eMMC 的版本和分区,并提供完整的镜像读取功能。交付物通常是一个 .bin 文件,其大小等于 eMMC 的完整容量(包括所有分区)

关键判断

当目标设备使用 eMMC 时,优先使用脱机编程器进行物理读取。因为在线读取需要 STM32 固件配合,而固件本身可能已被破坏或设置了读保护。脱机编程器直接从 BGA 焊盘或测试点读取,不受目标 MCU 状态影响

问题对照与修正

  1. 常见偏差:把固件提取直接写进主流程,只验证能跑通,留下固件提取边界、状态和验证口径不清。
  2. 修正做法:把固件提取收敛成稳定接口,明确输入条件、状态结果和失败处理。
  3. 验证记录:选一个和固件提取直接相关的失败场景,保留输入、日志、状态结果和状态记录前后变化,让修正是否有效能被复查。

固件提取的技术资产与验证方式

固件提取:SPI Flash、NAND与eMMC在线读取与脱机编程 · 系统架构图
flowchart TB subgraph FIELD["现场 / 设备侧"] N0(("Flash")) N1["NAND"] N2["eMMC"] N3["SPI"] end N0 <-->|指向| N1 N1 <-->|指向| N2 N2 <-->|指向| N3 classDef ns fill:#ecfeff,stroke:#0891b2,color:#164e63,stroke-width:1.6px; class N0,N1,N2,N3 ns;

图表解读:这张图以最终 Mermaid 图中的真实节点为准,先观察“固件提取:SPI Flash、NAND与eMMC在线读取与脱机编程”的主链。读图顺序:现场 / 设备侧 → Flash → NAND → eMMC → SPI

节点说明:【固件提取】表示认证链路中的交互动作,决定请求是否能被正确验证与继续处理;检查重点:报文步骤、校验条件和失败处理。

固件提取:SPI Flash、NAND与eMMC在线读取与脱机编程
具象图固件提取:SPI Flash观察对象参数变化验证记录SPIFlashSCKMOSIMISOCSBootloader

每次固件提取完成后,必须形成标准化的交付物,并执行验证流程。交付物包括:原始镜像文件(.bin)、读取日志(包含芯片型号、容量、读取时间、校验和)、以及硬件连接照片。验证的核心是确保镜像的完整性。对于 SPI Flash,可以通过对比两次独立读取的 SHA256 校验和来验证。对于 NAND Flash,需要确认坏块标记是否被正确保留(通常坏块标记在每页的 spare area 中,偏移 0 或 5)。对于 eMMC,需要验证 Boot Partition 和 User Data Area 的边界是否正确

以下是一份针对固件提取过程的排障检查表,用于快速定位常见问题:

固件提取 相关检查
检查项标准是否通过常见遗漏
SPI Flash 连接SCK/MOSI/MISO/CS 与编程器一一对应,无…☐ 是 / ☐ 否未检查 CS 引脚是否被主控拉高,导致总线冲突
NAND Flash 坏块处理读取日志中记录了坏块信息,镜像中坏块位置被标记(通常为…☐ 是 / ☐ 否未使用支持坏块管理的编程器,导致镜像偏移
eMMC Boot Partition读取了 配置 寄存器,确认 Boot Partitio…☐ 是 / ☐ 否仅读取 User Data Area,遗漏 Bootl…
镜像校验两次独立读取的 SHA256 值完全一致☐ 是 / ☐ 否未进行二次读取验证,或读取过程中编程器掉电
常见误区

不要依赖编程器自带的“校验”功能,它通常只校验编程器内部缓存与芯片数据的匹配,而非验证你最终保存到硬盘的 .bin 文件。正确的做法是:将两次独立读取的镜像文件在 PC 端使用 certutil -hashfile firmware.bin SHA256 命令进行比对

最后,归档交付物时,应包含一个简短的 README 文件,记录以下信息:目标设备型号、存储芯片型号与封装、读取工具与软件版本、读取速度与总耗时、以及任何异常现象(如某次读取超时、某引脚接触不良)。这份记录将成为后续分析阶段最可靠的工程凭证

细节补充:

固件提取的细节补充应直接说明可复查对象:先确认现场任务对应的输入、输出和结果材料,再用固件提取解释哪一处条件会影响判断。

固件提取的主要风险来自固件提取边界、状态和验证口径不清;落地前先核对示例片段,并确认例外场景和结果记录。

结果校验

交付前复查固件提取,重点不是重复步骤,而是确认固件提取、固件提取和eMMC在线读取能不能互相解释。若指标对照卡、关键对象或外部条件变化,原来的结果就要重新验收,不能把旧记录当作新场景的证明。下一步处理可以先锁定实际技术应用场景里的固件提取,再选择补实验、补日志、补参数对照或补一条清晰的失败边界。复盘顺序可以固定为固件提取、固件提取、eMMC在线读取三步,但每一步都要回到项目成果的当前条件,确认结论没有被旧场景带偏。第04节留下的风险提示是源码结构不要脱离项目成果单独判断,否则容易把现象误当成原因。