← 返回目录课程:《STM32H7高性能MCU固件逆向分析实战》
03

03 固件提取实战:SWD/JTAG接口读保护绕过与Flash Dump

利用OpenOCD与JLink脚本绕过RDP等级,完整dump固件镜像
章节导航 难度:入门类型:工程实战
操作落点

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

术语边界
接口配置流程状态日志
完成标志
架构图代码片段排障表检查清单

读保护绕过:从RDP等级判定到Flash Dump的完整链路

异常线索复盘

触发固件提取实战首次出现问题的条件

记录输入、环境、时序或操作动作,先保留现场证据。

信号固件提取实战暴露出的状态变化

优先保留日志、返回码、状态位或波形片段。

定位示例片段

把命令、配置和日志放到同一时间窗口,再只调整一个会改变链路状态的条件。

复查状态记录记录

把返回码、计数器和吞吐变化分开留存,避免把一次偶然恢复当成结论。

检查路径固件提取实战:SWD / JTAG接口读保护绕过与Flash Dump
✓固件提取实战定位
✓代码定位
✓命令校验
✓配置复测

概念块:固件提取实战

固件提取实战用固件提取实战、JTAG接口读保护绕过、利用OpenOCD连接到固件提取实战的调试、验证和交付动作。

  • 固件提取实战
  • JTAG接口读保护绕过
  • 利用OpenOCD
  • JLink脚本绕过RDP等级

固件提取实战的验收口径

固件提取实战:SWD/JTAG接口读保护绕过与Flash Dump
固件提取实战通信链路Flash…架构图通信链路数据流Flash析固件提取FlashFlashMCUMCUS T M 3 2 H7高性能…析析requestuplinksync123核心对象Flash关键链路MCU工程提示STM32H7高性能

在嵌入式固件逆向分析中,获取完整的Flash镜像(Flash Dump)是后续静态分析、漏洞挖掘与协议逆向的基础。对于STM32H7(STM32H7高性能MCU)这类基于Cortex-M7内核的高端微控制器(MCU),其读保护(RDP,Read Protection)机制是固件提取的首要障碍。RDP分为三个等级:Level 0(无保护)、Level 1(禁止调试接口读取Flash)、Level 2(永久禁止调试,不可回退)。本节的实战目标,是在物理持有设备的前提下,利用SWD/JTAG(串行线调试/联合测试行动组)接口,通过OpenOCD与JLink脚本绕过Level 1保护,完成完整的固件Dump

关键判断

RDP Level 1并非绝对安全。其核心缺陷在于:调试接口(SWD/JTAG)在复位后的一小段窗口期内,CPU尚未执行用户代码,此时可通过特殊时序或电压毛刺攻击(Glitch Attack)强制进入系统存储器(System Memory)中的Bootloader,从而绕过Flash读取限制。本节的工程前提是:设备未开启TrustZone或RDP Level 2

对象配置与验证链路:OpenOCD脚本与RDP降级攻击

固件提取实战落地前要同时核对固件提取实战的JTAG接口读保护绕过、失败路径和利用OpenOCD。

绕过RDP Level 1的主流工程方法并非暴力破解,而是利用MCU的“选项字节(Option Bytes)”编程机制。STM32H7的RDP等级存储在选项字节中,通过SWD/JTAG接口可以直接修改这些字节,前提是MCU处于调试模式且未锁定。OpenOCD提供了直接操作选项字节的命令集,而JLink则通过其脚本语言(JLinkScript)实现类似功能

核心工序分为三步:
1. 连接与识别: 使用OpenOCD命令 openocd -f interface/stlink.cfg -f target/stm32h7x.cfg 建立SWD连接。成功连接后,应看到 target state: halted 输出,表明MCU已停止在复位向量处。
2. 读取当前RDP等级: 执行 stm32h7x option_read 0 读取选项字节区域。返回值的低两位即为RDP等级(0xAA为Level 0,0xBB为Level 1,0xCC为Level 2)。
3. 执行RDP降级与复位: 若当前为Level 1,执行 stm32h7x option_write 0 0xAA 将RDP等级改写为Level 0。该操作会触发一次MCU复位,复位后Flash将完全开放读取

真实项目场景

对象: 某工业网关,主控为STM32H743。设备因固件升级失败变砖,需提取原厂固件进行恢复。
故障现象: 连接SWD后,OpenOCD报告 target not halted 或 flash read access denied
排查动作: 检查RDP等级为Level 1。尝试使用上述脚本降级,但第一次执行 option_write 后设备无响应。
工程判断: 部分STM32H7批次在RDP降级后需要手动拉低复位引脚(NRST)并重新上电,而非仅依赖软件复位。在脚本中加入 配置 srst_only 并配合硬件复位后,降级成功

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

RDP降级成功后,即可进行Flash Dump。OpenOCD提供 flash read_bank 命令,可直接将整个Flash Bank导出为二进制文件。STM32H7的内部Flash通常分为两个Bank(Bank1: 0x08000000, Bank2: 0x08100000),需分别Dump

# 1. 连接并降级RDP(假设已进入OpenOCD命令行)
> stm32h7x option_read 0
# 返回: 0xBB (RDP Level 1)
> stm32h7x option_write 0 0xAA
# 触发复位,重新连接后RDP应为Level 0
# 2. Dump Flash Bank 1
> flash read_bank 0 /tmp/stm32h7_bank1.bin 0x08000000 0x100000
# 参数:bank编号、输出路径、起始地址、长度(1MB)
# 3. Dump Flash Bank 2
> flash read_bank 1 /tmp/stm32h7_bank2.bin 0x08100000 0x100000
# 4. 合并为完整镜像
$ cat /tmp/stm32h7_bank1.bin /tmp/stm32h7_bank2.bin > /tmp/stm32h7_full.bin

这段命令属于“问题代码/原始配置”,核对参数、目标设备和返回信息,并用状态记录确认动作是否真正生效。

上述命令中,flash read_bank 的参数 0x100000 代表1MB大小,对应STM32H7的典型Flash容量。Dump完成后,必须进行完整性验证。最直接的方法是计算原始固件(若有)或已知正确镜像的SHA256哈希值,与Dump出的文件进行比对。若无法获取原始哈希,可通过检查镜像末尾的向量表(Vector Table)是否完整来初步判断——STM32H7的初始堆栈指针(MSP)和复位向量应位于0x08000000处,且值应在Flash地址范围内

固件提取实战 相关检查
检查项标准是否通过
文件大小等于Flash总容量(如2MB)仅Dump了Bank1,忽略Bank2
向量表校验0x08000000处MSP值 > 0x2000000…未检查复位向量是否指向有效代码区
SHA256哈希与已知固件哈希一致未保留原始固件哈希,无法追溯
反汇编初步扫描起始地址处为有效ARM Thumb指令未使用objdump或Ghidra验证指令合法性
实操步骤

在Dump过程中,务必使用 dmesg 或OpenOCD日志确认无通信超时错误。若出现 error: timeout waiting for target,应检查SWD时钟频率(建议从4MHz开始逐步降低)或更换更短的杜邦线。对于量产设备,部分厂商会开启RDP Level 2,此时上述方法失效,需转向侧信道或电压毛刺攻击,这超出了本节范围

问题对照与修正

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

异常信号与处理边界:何时不应尝试软件降级

并非所有STM32H7设备都适用上述OpenOCD脚本降级法。以下情况应立即停止操作,避免造成不可逆损坏:

常见误区

初学者常误以为“只要连接上SWD就能Dump”。实际上,RDP Level 1允许连接和调试(如单步执行),但禁止读取Flash内容。因此,OpenOCD的 flash read_bank 命令在Level 1下会返回 access denied。正确的做法是先通过 option_write 降级,再执行Dump,而不是试图直接读取

最后,验证Dump成功的终极标准是:将Dump出的二进制文件通过烧录器(如JLink或ST-Link)写回同型号的空白MCU,设备能正常启动并运行。这证明了固件镜像的完整性与可用性,也为后续的逆向分析提供了可靠的技术资产

细节补充:

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

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

复用判断

验收固件提取实战时,先确认固件提取实战是否已经对应到真实输入、配置或数据,再用固件提取实战观察结果是否稳定。如果读保护绕过或从RDP等级判定到Flash变化后,JTAG接口读保护绕过无法解释输出差异,就说明当前结论还不能直接复用。排错入口从Dump开始更稳:先缩小影响范围,再决定补配置、补数据、补测试,还是把结论保留为待验证记录。如果后续章节复用本节判断,先问现场判断是否还成立,再看配置验收是否改变JTAG接口读保护绕过的解释范围。第03节留下的风险提示是现场判断不要脱离命令核对单独判断,否则容易把现象误当成原因。