STM32系列微 Controller 具有读出保护功能,因此无法通过调试接口(interface)(JTAG或SWD)读出专有代码。
使用OpenOCD,如何通过SWD/JTAG接口(interface)启用/禁用读出保护? RDP读取保护的安全性如何?
如果可能,请给出对整个STM32系列有效的答案。
最佳答案
RDP级别
首先,您必须知道要设置的读取保护级别(例如,参见STM32F4 reference manual的3.7.3节):
通常,您要激活RDP级别1。为了避免肯定会使微 Controller 陷入困境的错误,我不会在此答案中展示如何启用RDP级别2。有关详细信息,请参见引用手册。
使用OpenOCD激活它
激活功能实际上是使用
lock
命令内置在OpenOCD中的。就像执行program
命令来刷新固件一样,您可以使用stm32f1x lock
命令(或STM32F2/F4的stm32f2x lock
)来激活它。典型的OpenOCD配置文件如下所示(运行此文件之前,您需要刷新正确的固件):
# Set RDP to level 1
init
reset halt
stm32f1x lock 0
reset halt
exit
注意,只有在微 Controller 复位或关闭电源后,读出保护才会生效(这就是命令序列中第二次复位的原因)。
典型的OpenOCD调用可能如下所示:
openocd -d0 -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg
其中
ocd-lock.cfg
包含上面显示的命令序列。激活后,您可以通过尝试使用常规编程命令序列刷新MCU来验证RDP是否处于事件状态
停用RDP
停用它非常简单:只需使用
stm32f1x unlock
(或F2/F4设备的stm32f2x unlock
),如下所示:# Set RDP to level 0
init
reset halt
stm32f1x unlock 0
reset halt
exit
它有多安全?
这是一个棘手的问题,没有其他信息就无法真正回答。我可以给出一个简要的答案是,如果您认为保护没有固有的错误并且仅使用软件工具,那将是非常安全的。
在不对闪存进行整体擦除的情况下重置RDP位的最流行方法之一是disable the RDP with a laser。鉴于STM32系列不是具有特定对策的专用安全微 Controller 系列,如果您在该领域拥有合适的设备和足够的经验,这将非常容易。甚至某些特定的安全MCU也存在一些安全问题,请参见例如Security from the IC backside谈话。但是,大多数低级别攻击者通常会避免这样做的成本。
关于embedded - 通过OpenOCD进行STM32读出保护,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32509747/