STM32系列微控制器具有读出保护功能,因此专有代码无法通过调试接口(JTAG或SWD)读出。
使用OpenOCD时,如何通过SWD/JTAG接口启用/禁用读出保护?RDP读出保护的安全性如何?
如果可能,请给出适用于整个STM32系列的答案。
发布于 2015-09-11 02:59:49
RDP级别
首先,您必须知道要设置的读出保护级别(例如,参考STM32F4 reference manual的3.7.3节):
通常您想要激活RDP级别1。为了避免肯定会对微控制器造成影响的错误,我不会在此答案中说明如何启用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请注意,只有在微控制器复位或断电时,读出保护才会生效(这就是命令序列中有第二次复位的原因)。
典型的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它有多安全?
这是一个很难回答的问题,如果没有额外的信息就不能真正回答。我可以给出的一个总结答案是,如果你假设保护没有固有的bug,并且有人只使用软件工具,那么它是相当安全的。
要在不大量擦除闪存的情况下重置RDP位,最流行的方法之一是disable the RDP with a laser。鉴于STM32系列不是具有特定对策的专用安全微控制器系列,如果您在该领域拥有正确的设备和足够的经验,这将是相当容易的。甚至一些特定的安全MCU也有一些安全问题,参见Security from the IC backside talk。然而,大多数低级攻击者通常会避免这样做的成本。
发布于 2019-12-25 06:09:16
另一种解决方案是将Segger Jlink 6.60c (或更高版本,如果可用)与J-Link unlock STM32软件一起使用。只需运行它,它将通知以下内容:“如果启用了设备的读保护,重置选项字节将导致批量擦除”。单击OK。它将要求提供设备系列。输入设备系列(对于STM32L4R9ZI,我的选择是12 ),然后按Enter。

如果一切正常,输出将如下所示:
Please select the correct device family: 12
Connecting to J-Link via USB...O.K.
Using SWD as target interface.
Target interface speed: 1000 kHz.
VTarget = 3.396V
Reset target...O.K.
Reset option bytes to factory settings...
Resetting FLASH_OPTR...
Reset target...O.K.
Reset target...O.K.
Resetting Write protection (WRP) and PCROP...O.K.
Reset target...O.K.
Option bytes reset to factory settings.
Press any key to exit.https://stackoverflow.com/questions/32509747
复制相似问题