Uli*_*ler 6 embedded stm32 openocd
STM32系列微控制器具有读出保护功能,因此无法通过调试接口(JTAG或SWD)读取专有代码.
使用OpenOCD,如何通过SWD/JTAG接口启用/禁用读出保护?RDP读出保护有多安全?
如果可能,请给出对整个STM32系列有效的答案.
Uli*_*ler 15
首先,您必须知道要设置哪种级别的读数保护(参见例如STM32F4参考手册的 3.7.3节):
通常你想激活RDP级别1.为了避免错误,这肯定会困扰微控制器,我不会在这个答案中展示如何启用RDP级别2.有关详细信息,请参阅参考手册.
激活功能实际上是使用该lock命令内置到OpenOCD中.就像执行program命令来刷新固件一样,您可以使用stm32f1x lock命令(或stm32f2x lockSTM32F2/F4)来激活它.
典型的OpenOCD配置文件看起来像这样(在运行之前需要刷新正确的固件):
# Set RDP to level 1
init
reset halt
stm32f1x lock 0
reset halt
exit
Run Code Online (Sandbox Code Playgroud)
请注意,只有在微控制器复位或断电后,读出保护才会生效(这就是为什么命令序列中有第二次复位的原因).
典型的OpenOCD调用可能如下所示:
openocd -d0 -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg
Run Code Online (Sandbox Code Playgroud)
其中ocd-lock.cfg包含上面显示的命令序列.
激活后,您可以尝试使用通常的编程命令序列刷新MCU来验证RDP是否处于活动状态
停用它就像这样简单:只需使用stm32f1x unlock(或stm32f2x unlock用于F2/F4设备),如下所示:
# Set RDP to level 0
init
reset halt
stm32f1x unlock 0
reset halt
exit
Run Code Online (Sandbox Code Playgroud)
如果没有其他信息,这是一个难以回答的难题.我可以给出的一个总结答案是,如果您认为保护没有固有的错误而且有人仅使用软件工具,则它非常安全.
在没有质量擦除闪存的情况下重置RDP位的最常用方法之一是使用激光禁用RDP.鉴于STM32系列不是具有特定对策的专用安全微控制器系列,如果您拥有合适的设备和足够的经验,这一点非常简单.甚至一些特定的安全MCU也存在一些安全问题,例如参见IC背面谈话中的安全性.但是,大多数低级攻击者通常会避免这样做的代价.