Ubuntu22.04下用STLINK-V2和OpenOCD提取STM32固件的保姆级教程

张开发
2026/4/17 1:10:20 15 分钟阅读

分享文章

Ubuntu22.04下用STLINK-V2和OpenOCD提取STM32固件的保姆级教程
Ubuntu 22.04环境下使用STLINK-V2与OpenOCD提取STM32固件全流程解析在嵌入式开发领域固件提取是一项基础但至关重要的技能。无论是进行逆向分析、设备维护还是代码审计掌握高效的固件提取方法都能显著提升工作效率。本文将详细介绍在Ubuntu 22.04系统中如何利用STLINK-V2调试器和OpenOCD工具链完成STM32系列芯片的固件提取工作。1. 环境准备与工具安装工欲善其事必先利其器。在开始固件提取前我们需要确保开发环境配置正确。Ubuntu 22.04作为长期支持版本提供了稳定的基础环境而STLINK-V2则是ST官方推出的高性价比调试工具。首先更新系统软件包列表并安装必要依赖sudo apt update sudo apt upgrade -y sudo apt install build-essential git libusb-1.0-0-dev -y接下来安装OpenOCD这是整个流程的核心工具。虽然Ubuntu仓库提供了预编译版本但为了获得最新功能和更好的兼容性建议从源码编译安装git clone https://git.code.sf.net/p/openocd/code openocd-code cd openocd-code ./bootstrap ./configure --enable-stlink make -j$(nproc) sudo make install验证安装是否成功openocd --version提示如果遇到权限问题可以创建udev规则文件/etc/udev/rules.d/49-stlinkv2.rules内容如下# STLINK-V2 SUBSYSTEMSusb, ATTRS{idVendor}0483, ATTRS{idProduct}3748, MODE06662. 硬件连接与配置正确的硬件连接是成功提取固件的前提。STLINK-V2调试器与STM32开发板的连接方式如下表所示STLINK-V2引脚STM32引脚说明VCC3.3V电源可选GNDGND地线SWDIOPA13串行数据线SWCLKPA14串行时钟线NRSTNRST复位信号可选连接完成后可以通过以下命令检查设备是否被系统识别lsusb | grep ST-LINK如果输出中包含ST-LINK/V2字样说明硬件连接正常。接下来需要准备OpenOCD的配置文件通常位于/usr/local/share/openocd/scripts/目录下。对于常见的STM32F1系列芯片可以创建自定义配置文件stm32f1x.cfgsource [find interface/stlink-v2.cfg] transport select hla_swd source [find target/stm32f1x.cfg] reset_config srst_only3. 固件提取实战操作一切准备就绪后我们就可以开始实际的固件提取工作了。这个过程主要分为三个步骤启动OpenOCD服务、连接调试会话和执行提取命令。首先启动OpenOCD服务openocd -f stm32f1x.cfg服务启动后会监听本地4444端口Telnet接口和3333端口GDB接口。我们需要新建一个终端窗口使用Telnet连接调试接口telnet localhost 4444连接成功后依次执行以下命令暂停芯片运行确保内存状态稳定 halt查询Flash内存信息 flash info 0提取固件到本地文件 dump_image firmware.bin 0x08000000 0x10000注意0x08000000是STM32系列的标准Flash起始地址0x10000表示提取64KB数据。实际应用中需要根据芯片型号和固件大小调整这些参数。4. 常见问题与高级技巧在实际操作中开发者可能会遇到各种问题。下面列出几个典型场景及其解决方案问题1OpenOCD无法识别STLINK-V2检查USB连接是否牢固确认udev规则已正确配置尝试降低通信速度在配置文件中添加adapter speed 1000问题2固件提取不完整确保芯片没有启用读保护RDP尝试分段提取后再合并 dump_image part1.bin 0x08000000 0x8000 dump_image part2.bin 0x08008000 0x8000使用mdw命令手动验证内存内容 mdw 0x08000000 10高级技巧自动化脚本对于需要频繁提取固件的场景可以编写自动化脚本#!/bin/bash openocd -f stm32f1x.cfg -c init; dump_image $1 0x08000000 $2; exit保存为dump_fw.sh后通过以下方式调用./dump_fw.sh firmware.bin 0x100005. 固件分析与验证成功提取固件后我们需要验证其完整性和正确性。常用的验证方法包括文件头检查使用hexdump查看文件头部信息hexdump -C firmware.bin | head -n 20校验和计算比较提取前后的校验值 flash verify_image firmware.bin 0x08000000反汇编分析使用ARM工具链进行初步反编译arm-none-eabi-objdump -D -b binary -marm firmware.bin disassembly.asm对于STM32系列芯片典型的固件文件头应包含中断向量表起始4字节通常是栈指针初始值随后4字节是复位向量地址。6. 安全考量与最佳实践在进行固件提取工作时必须考虑以下安全因素静电防护操作前接触接地金属释放静电电源稳定确保供电电压在3.3V±5%范围内数据备份提取前备份原始固件法律合规仅对拥有合法权限的设备进行操作推荐的工作流程如下确认芯片型号和内存布局检查读保护状态进行测试性读取小数据块完整提取固件立即验证固件完整性安全存储提取的文件在多次实际项目中我发现最稳妥的方法是先提取256字节的头部数据确认无误后再进行完整提取。这能避免因配置错误导致的时间浪费。

更多文章