把目标平台F103 Flash读取与固件Dump落到Flash读取的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。
目标平台F103 Flash读取与固件Dump常见问题来自默认值、路径、版本或权限未形成同一条判断链。
本节用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),直接通过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则几乎不可能绕过,遇到此类芯片应直接放弃固件提取
成功获取固件Dump后,必须验证其完整性。一个常见的检查方法是查看Dump文件的大小是否与目标芯片的Flash容量一致。此外,可以通过分析文件头或特定模式来初步判断。例如,ARM 处理平台3的中断向量表位于Flash起始地址,前四个字节应为栈顶指针(通常指向SRAM区域),紧接着的四个字节为复位向量。如果这些值看起来合理(例如栈顶指针在0x20000000附近),则Dump很可能有效
以下是一个用于排查SWD读取与RDP绕过问题的排障表:
| 现象 | 可能原因 | 检查位置 | 修复动作 |
|---|---|---|---|
| J-Link无法识别目标 | SWD连接错误或目标未上电 | SWD接口引脚电压 | 重新焊接或更换杜邦线,确保VCC为3.3V |
| 连接成功但读取全为0xFF | Flash已擦除或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读取是短暂波动还是可复现证据。