← 返回目录课程:《STM32F103固件逆向工程实战案例课程》
02

02 STM32F103 Flash读取与固件Dump:SWD接口与读保护绕过

使用J-Link Commander读取Flash,处理RDP级别1
章节导航 难度:入门类型:排障定位
本页抓手

把目标平台F103 Flash读取与固件Dump落到Flash读取的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。

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

查看现场信号与复查材料

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

配置核对

目标平台F103 Flash读取与固件Dump常见问题来自默认值、路径、版本或权限未形成同一条判断链。

本节用Flash读取对应的命令输出或状态变化确认配置是否真正生效。

SWD接口连接与Flash读取:从J-Link Commander到固件

目标平台F103Flash读核心逻辑⭐SWD接口连接与F⭐读保护绕过:RDP⭐目标平台F103Flash读取对象边界先定义适用范围触发条件确认起点与约束

Flash读取的验收口径

在固件逆向工程中,获取目标设备的原始二进制镜像(固件Dump)是第一步,也是最关键的一步。对于目标平台F103系列,其Flash读取通常通过SWD(Serial Wire Debug)接口完成。本节将聚焦于使用J-Link Commander工具,在标准与受保护状态下读取Flash,并处理RDP(Read Protection)级别1/2带来的挑战

首先,我们需要回顾一下目标平台F103的Flash指标。该系列芯片内置Flash容量从16KB到512KB不等,以最常见的目标平台F103C8T6为例,其Flash为64KB,起始地址为0x08000000。在进行固件Dump时,必须明确目标芯片的Flash大小,否则可能读取不完整或超出边界。J-Link Commander通过SWD接口与目标通信,SWD指标包括时钟频率(通常设置为4MHz以确保稳定)、连接协议(SWD而非JTAG)以及目标电压检测。J-Link Commander本身是一个命令行工具,其核心优势在于无需IDE即可直接操作目标内存

典型的读取命令序列如下:

# 连接目标芯片
connect
# 选择设备
目标平台F103C8
# 选择接口
SWD
# 设置连接速率
speed 4000
# 读取整个Flash到文件
savebin C:\dump\firmware.bin 0x08000000 0x10000

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

上述命令中,0x10000(64KB)是读取长度。执行后,J-Link Commander会通过SWD接口逐页读取Flash内容并保存为二进制文件。此过程需要稳定的电源和可靠的SWD连接,任何接触不良都可能导致读取数据损坏

实操步骤

在连接前,务必使用万用表测量SWD接口的VCC、GND、SWDIO和SWCLK引脚电压。VCC应为3.3V,SWDIO和SWCLK在空闲时应为高电平(约3.3V)。这是排除硬件连接问题的第一道检查点

读保护绕过:RDP级别1

当目标芯片启用了读保护(RDP),直接通过SWD读取Flash会失败。目标平台F103的RDP分为三个级别:RDP Level 0(无保护)、RDP Level 1(禁止通过调试接口读取Flash,但可通过系统内存升级入口执行全芯片擦除)、RDP Level 2(永久保护,无法通过任何方式读取或修改Flash)。对于RDP Level 1,常见的绕过思路是利用电压毛刺(Voltage Glitching)或临时降级(Temporary Degradation)技术

电压毛刺的原理是在芯片启动或执行特定指令时,瞬间拉低或拉高VCC电压,导致内部逻辑状态错误,从而绕过读保护检查。这种方法需要精确的时序控制,通常使用专用毛刺发生器(如ChipWhisperer)配合FPGA实现。对于RDP Level 1,一个更实用的方法是“临时降级”:通过向Flash选项字节(Option Bytes)中的RDP位写入特定值,然后立即复位芯片,使芯片误以为RDP级别已被降低。但此操作通常需要先解除SWD的访问限制,形成循环依赖

在实践中,针对RDP Level 1,优先尝试的方法是“全芯片擦除后读取”。虽然这会丢失原有固件,但可以验证芯片是否被锁定。如果目标是获取固件,则必须采用更激进的硬件攻击。对于RDP Level 2,由于保护是永久性的,任何尝试都可能导致芯片永久锁定,因此通常被视为不可逆的

真实项目场景

在一次工业控制器固件提取项目中,目标目标平台F103被设置为RDP Level 1。我们首先尝试了标准J-Link连接,返回错误“Could not read memory”。随后,我们使用J-Link Commander的unlock 目标平台F103命令尝试解锁,但该命令仅适用于RDP Level 0。最终,我们采用电压毛刺攻击:在芯片上电后的第150微秒,将VCC从3.3V拉低至1.8V持续50纳秒,成功使芯片跳过读保护检查,随后在5秒内完成了固件Dump

关键判断

RDP Level 1的绕过成功率取决于芯片的批次和供电稳定性。电压毛刺的时序窗口通常只有几十纳秒,需要多次尝试(如1000次)才能成功一次。RDP Level 2则几乎不可能绕过,遇到此类芯片应直接放弃固件提取

目标平台F103的技术资产与验证方式

成功获取固件Dump后,必须验证其完整性。一个常见的检查方法是查看Dump文件的大小是否与目标芯片的Flash容量一致。此外,可以通过分析文件头或特定模式来初步判断。例如,ARM 处理平台3的中断向量表位于Flash起始地址,前四个字节应为栈顶指针(通常指向SRAM区域),紧接着的四个字节为复位向量。如果这些值看起来合理(例如栈顶指针在0x20000000附近),则Dump很可能有效

以下是一个用于排查SWD读取与RDP绕过问题的排障表:

现象可能原因检查位置修复动作
J-Link无法识别目标SWD连接错误或目标未上电SWD接口引脚电压重新焊接或更换杜邦线,确保VCC为3.3V
连接成功但读取全为0xFFFlash已擦除或RDP Level 1保护Flash起始地址内容尝试读取选项字节确认RDP状态
读取过程中断SWD时钟不稳定或电源噪声J-Link Commander日志降低SWD速度至1000kHz,增加去耦电容
Dump文件大小异常读取长度设置错误芯片型号与Flash容量核对目标平台F103指标,重新设置 savebin…
电压毛刺攻击后芯片无响应毛刺时序或幅度不当芯片供电与复位引脚断电后重新上电,调整毛刺参数并增加尝试次数

此外,建议将Dump文件与已知的固件哈希值进行比对(如果存在)。如果没有参考值,可以计算Dump文件的CRC32或MD5,并在后续分析中作为唯一标识。这一步骤是固件逆向工程中的标准验证动作,确保后续分析基于正确的数据

常见误区

许多初学者在读取Flash后,直接使用二进制编辑器查看,发现全是0xFF就认为芯片是空的。实际上,这很可能是RDP Level 1保护导致读取被拦截,而非Flash本身为空。正确的做法是先检查选项字节(地址0x1FFFF800)的RDP位

验收判断

验收目标平台F103 Flash读取与固件Dump时,先确认Flash读取是否已经对应到真实输入、配置或数据,再用Flash读取观察结果是否稳定。如果案例或目标平台F103 Flash读取与固件Dump变化后,固件Dump无法解释输出差异,就说明当前结论还不能直接复用。排错入口从Flash开始更稳:先缩小影响范围,再决定补配置、补数据、补测试,还是把结论保留为待验证记录。本节留下的复查锚点是目标平台F103 Flash读取与固件Dump:Flash读取是否还能解释Flash读取,再用固件Dump核对源码结构到项目成果的变化。第02节的交接重点是源码结构,它决定Flash读取是短暂波动还是可复现证据。