← 返回目录课程:《工业控制单片机固件逆向工程案例实战教程》
02

02 STM32F103 固件提取:SWD/JTAG 接口识别与读保护绕过实验

梳理使用OpenOCD与J-Link识别调试接口,尝试读取受保护Flash并分析绕过条件
章节导航 难度:入门类型:工程实战
本页抓手

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

判断线索
接口配置流程状态日志
复用位置
代码片段排障表检查清单架构图

查看现场信号与复查材料

  1. 核对固件提取的输入条件、变化信号和结果材料
  2. 再把命令、配置、日志和状态结果对应到同一个操作结果
  3. 最后用状态记录验证结果是否可复现

排查线索

STM32F103 固件提取排查时最怕只改表面现象,没有固定触发条件、现场记录和结果判断。

处理固件提取时先保留原始现象,再用最小复现动作确认问题是否真的被缩小。

调试接口识别与读保护状态判定

STM32F103固件提取对象、步骤、结果对齐01⭐调试接口识别与读保对齐约束与联调口径02⭐读保护绕过实验:条明确检查要点03⭐技术资产:接口识别对齐约束与联调口径04固件提取明确检查要点05对象边界先定义适用范围06触发条件确认起点与约束

固件提取的验收口径

在工业控制现场,固件提取的第一步并非直接连接调试器,而是准确识别目标板上的调试接口。STM32F103 同时支持 SWD(Serial Wire Debug)和 JTAG(Joint Test Action Group)两种调试协议。SWD 仅需 SWDIO 和 SWCLK 两根信号线,占用引脚少,是当前工业现场的主流选择;JTAG 则需要 TMS、TCK、TDI、TDO 四线,多用于需要边界扫描的复杂板级测试。实际工程中,多数 STM32F103 板卡默认启用 SWD 模式,但部分设计会复用 SWDIO(PA13)和 SWCLK(PA14)为 GPIO,导致调试接口失效。因此,第一步必须通过万用表测量或查阅原理图确认接口引脚是否被复用,再通过调试器尝试连接

实操步骤

使用 J-Link 或 OpenOCD 连接前,先执行 jlinkexe -device STM32F103C8 -if SWD -speed 4000 或 openocd -f interface/jlink.cfg -f target/stm32f1x.cfg 启动连接。若返回 AP IDR: 0x24770011 则接口正常;若返回 DAP operation failed,则需检查引脚复用或电平冲突

连接成功后,必须立即检查 Flash 的读保护(RDP)等级。STM32F103 的读保护通过选项字节(Option Bytes)配置,分为三个等级:RDP Level 0(无保护)、Level 1(中等保护,禁止通过调试接口读取 Flash 内容)、Level 2(永久保护,不可回退)。读取选项字节的命令为:

# 通过 OpenOCD 读取选项字节
flash protect 0 0 0 off
# 或直接读取地址 0x1FFFF800
mdw 0x1FFFF800 4

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

若返回值为 0x00FF00FF 表示 Level 0;若为 0x00FF0055 表示 Level 1。Level 1 状态下,调试器虽能识别内核,但读取 Flash 时只会返回全 0 或全 1 数据,这是固件提取的关键障碍

固件提取 · STM32F103 读保护等级判断标准
检查项标准是否通过常见遗漏
选项字节值(0x1FFFF800)0x00FF00FF0x00FF00550x00FF00CC
调试器读取 Flash正常读取返回全 0 / 全 1无法连接
能否绕过无需绕过可通过全片擦除降级不可绕过
工业现场常见场景开发调试阶段量产固件保护极少使用
关键判断

Level 1 并非绝对安全。通过 stm32f1x unlock 命令执行全片擦除后,RDP 会回退到 Level 0,但固件内容也随之消失。因此,读保护绕过的前提是:固件仍保留在 Flash 中,且你愿意承担擦除代价

读保护绕过实验:条件分析与操作流程

当确认目标处于 Level 1 保护时,绕过路径只有一条:通过调试接口发送全片擦除命令,清除选项字节中的保护标志。这一操作会同时擦除主 Flash 和选项字节,导致固件永久丢失。因此,绕过实验必须在以下条件下进行:

绕过操作的核心命令如下:

执行后,再次读取选项字节应返回 0x00FF00FF,此时 Flash 已为空,但调试接口恢复完全访问权限。若目标仅需提取固件而非恢复运行,此步骤即完成

真实项目场景

某工业变频器主控板采用 STM32F103C8T6,设备因固件异常停机。客户要求提取固件以分析故障原因。连接 J-Link 后,mdw 0x1FFFF800 返回 0x00FF0055,确认 Level 1 保护。经客户确认,该设备已停产且无备份固件,同意执行全片擦除。擦除后成功读取空 Flash,虽未获得有效固件,但排除了硬件故障,最终定位为外部 EEPROM 数据损坏。此案例说明:读保护绕过并非总能恢复固件,但能快速缩小故障排查范围

常见误区

初学者常误以为 Level 1 保护下可以通过“读保护降级命令”直接读取固件。实际上,任何降级操作都会触发全片擦除,这是 STM32F103 的硬件安全机制,不可绕过。不要尝试修改选项字节中的 RDP 位而不擦除 Flash,芯片会拒绝写入

技术资产:接口识别与保护状态检查命令集

以下命令集可直接用于现场快速识别调试接口状态和读保护等级,建议保存为脚本文件 check_stm32f103.sh

该脚本通过 nc(netcat)向 OpenOCD 的 Telnet 端口发送命令,适合自动化集成。注意:执行解锁前务必确认已获得授权,且固件已备份或允许擦除

场景复盘

复盘STM32F103 固件提取时,可以先问“安全或机制边界在哪里”:固件提取说明对象,STM32F103 固件提取说明条件,固件提取说明可观察结果。如果条件换成STM32F103或SWD/JTAG,原结论可能只剩参考价值,需要重新检查假设、测量方式和解释范围。接口识别最好保留成一张关系说明,帮助读者在新章节里判断这套机制是否还能解释问题。复盘顺序可以固定为STM32F103 固件提取、固件提取、接口识别三步,但每一步都要回到知识结构的当前条件,确认结论没有被旧场景带偏。第02节后续复用时,不复述整段结论,只检查知识结构、固件提取和接口识别是否仍然同向。