← 返回目录课程:《IDA Pro单片机固件逆向分析实战教程》
02

02 STM32F103固件提取与二进制加载:从Flash dump到IDA数据库

形成固件提取方法,并梳理如何将裸机二进制正确加载到IDA Pro中
章节导航 难度:入门类型:排障定位
本页抓手

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

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

查看现场信号与复查材料

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

代码阅读线索

STM32F103固件提取与二进制加载涉及源码、函数、脚本或 API 时,应先确认代码对象、调用条件和结果信号是否对应。

本节用STM32F103固件提取的真实调用点说明代码变化会影响哪一个操作结果。

从Flash转储到IDA数据库:固件提取与加载的完整链路

Pro单片机固件逆向分析实战教程准备区01⭐从Flash转储到明确检查要点02⭐固件提取:从硬件接明确检查要点执行区01⭐IDAPro加载明确检查要点02STM32F103固明确检查要点验收区01对象边界先定义适用范围02触发条件确认起点与约束

在嵌入式逆向工程中,获取原始固件并将其正确加载到反汇编器中,是决定后续分析成败的第一步。STM32F103作为Cortex-M3内核的经典MCU,其固件通常存储在内部Flash中,起始地址为0x08000000。本节将演示如何通过调试器(如J-Link或ST-Link)完成Flash转储(Flash Dump),并指导你将裸机二进制文件(.bin)正确加载到IDA Pro中,确保向量表、中断服务例程和代码段被正确解析

实操步骤

使用JLinkExe命令直接读取STM32F103的整个Flash区域:savebin C:\dump\fw_dump.bin 0x08000000 0x10000。该命令将64KB的Flash内容保存为原始二进制文件,这是后续所有分析工作的起点

固件提取:从硬件接口到二进制交付物

固件提取的核心目标是将目标MCU的Flash内容完整、无损地导出为二进制文件,即Flash交付物(Flash Deliverable)。对于STM32F103,最可靠的方式是通过SWD(Serial Wire Debug)接口连接调试器。以下是标准操作流程:

提取完成后,务必进行完整性校验:将转储文件的大小与芯片Flash容量对比,并通过JLinkExe的verifybin命令验证数据一致性。这一步是确保environment_setup交付物(Environment Setup Deliverable)可靠的关键

真实项目场景

某工业控制器的固件升级后出现偶发死机。通过SWD接口转储Flash,发现0x08004000区域(应用程序主循环)存在异常字节。对比原始固件,确认是Flash写入过程中掉电导致数据损坏。此案例说明,固件提取不仅是逆向的起点,也是故障复现和根因分析的基础

IDA Pro加载:从裸机二进制到可分析数据库

将.bin文件加载到IDA Pro时,错误的配置会导致反汇编结果完全不可用。核心在于正确设置加载地址和处理器选项。以下是标准加载流程,最终生成IDA调试验证(IDA Debug Verification)所需的Pro交付物(Pro Deliverable)——即.idb或.i64数据库文件

加载步骤与关键参数

  1. 新建工程:在IDA Pro中选择“New”,加载.bin文件
  2. 处理器选择:选择“ARM Little-Endian [ARM]”或“ARM Cortex-M [ARMB]”。对于STM32F103,推荐使用“ARM Cortex-M [ARMB]”,因为它能自动识别Thumb/Thumb-2指令集
  3. 加载地址设置:在“Loading segment”和“Loading offset”中填入0x08000000。这是STM32F103的Flash基地址,也是向量表的起始位置
  4. 向量表解析:IDA Pro加载后,检查地址0x08000000处的内容。前4字节应为栈顶指针(MSP),后4字节为复位向量(Reset_Handler)。若这两个值看起来合理(例如栈顶指针指向SRAM区域0x20000000附近),则加载基本正确
关键判断

加载后,若IDA Pro显示大量“undefined”或“DCB”伪指令,且地址0x08000000处的数据不符合向量表结构,说明加载地址或处理器类型配置错误。此时应重新检查芯片手册,确认Flash基地址和指令集架构

项目下一步

继续推进STM32F103固件提取与二进制加载时,先把STM32F103固件提取与二进制加载对应到工程结构中的入口、依赖和输出,再确认STM32F103固件提取能不能复现当前结果。如果STM32F103或固件提取与二进制加载变化,下一步不是马上改代码,而是先补一条最小验证,观察可观察信号是否还能说明目标达成。交接材料应写清可保留部分、可替换部分和优先复查位置,让项目能从本节自然进入下一轮迭代。如果后续章节复用本节判断,先问源码结构是否还成立,再看可运行材料是否改变STM32F103固件提取的解释范围。第02节如果迁移到新环境,先重做STM32F103固件提取与二进制加载的最小验证,再决定可运行材料是否需要调整。