Embedded STM32通过OpenOCD读取保护

Embedded STM32通过OpenOCD读取保护,embedded,stm32,openocd,Embedded,Stm32,Openocd,STM32系列微控制器具有读取保护功能,因此无法通过调试接口(JTAG或SWD)读取专有代码 使用OpenOCD,如何通过SWD/JTAG接口启用/禁用读取保护?RDP读取保护的安全性如何 如果可能,请给出对整个STM32系列有效的答案。RDP级别 首先,您必须知道要设置的读出保护级别(例如,请参阅本手册第3.7.3节): RDP级别1:此级别是可逆的。一旦禁用,系统内存将被大量擦除,您可以重新编程 RDP级别2:此级别是不可逆的,并且完全禁用调试接口。更新固件的唯一方法是通过一些引导加载机制

STM32系列微控制器具有读取保护功能,因此无法通过调试接口(JTAG或SWD)读取专有代码

使用OpenOCD,如何通过SWD/JTAG接口启用/禁用读取保护?RDP读取保护的安全性如何

如果可能,请给出对整个STM32系列有效的答案。

RDP级别 首先,您必须知道要设置的读出保护级别(例如,请参阅本手册第3.7.3节):

  • RDP级别1:此级别是可逆的。一旦禁用,系统内存将被大量擦除,您可以重新编程
  • RDP级别2:此级别是不可逆的,并且完全禁用调试接口。更新固件的唯一方法是通过一些引导加载机制
通常,您希望激活RDP级别1。为了避免错误,这肯定会砖微控制器,我将不显示如何启用RDP级别2在这个答案。有关详细信息,请参阅参考手册

使用OpenOCD激活它 激活功能实际上是使用
lock
命令内置到OpenOCD中的。就像执行
program
命令来闪存固件一样,您可以使用
stm32f1x lock
命令(或STM32F2/F4的
stm32f2x lock
来激活固件

典型的OpenOCD配置文件如下所示(运行此配置文件之前,您需要闪存正确的固件):

请注意,只有当微控制器复位或断电时,读出保护才会生效(这就是为什么在命令序列中有第二次复位)

典型的OpenOCD调用可能如下所示:

openocd -d0  -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg
# Set RDP to level 0
init
reset halt
stm32f1x unlock 0
reset halt
exit
其中,
ocd lock.cfg
包含上述命令序列

激活后,您可以通过尝试使用常用的编程命令序列刷新MCU来验证RDP是否处于激活状态

停用RDP 停用它也很简单:只需使用
stm32f1x解锁
(或对F2/F4设备使用
stm32f2x解锁
),如下所示:

openocd -d0  -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg
# Set RDP to level 0
init
reset halt
stm32f1x unlock 0
reset halt
exit
它有多安全? 这是一个很难回答的问题,如果没有更多的信息。我能给出的一个简要回答是,如果您假设保护没有固有的缺陷,并且有人只使用软件工具,那么它是相当安全的


在不大量擦除闪存的情况下重置RDP位的最常用方法之一是。鉴于STM32系列不是具有特定对策的专用安全微控制器系列,如果您在该领域拥有合适的设备和足够的经验,这是相当容易的。甚至一些特定的安全MCU也存在一些安全问题,请参见谈话。但是,大多数低级攻击者通常不会为此付出代价。

另一种解决方案是使用Segger Jlink 6.60c(或更高版本,如果可用) 使用J-Link解锁STM32软件。 只需运行它,它将通知以下内容:“如果启用设备的读取保护,重置选项字节将导致大规模擦除”。单击“确定”。它将要求提供设备系列。输入设备系列(对于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.

看起来是个好答案!然而,我想说的是,关于投票的评论并没有被添加到问题中——它们对大多数读者没有用处,因为他们的数量远远超过了选民。如果你必须添加这种请求,也许可以添加它作为评论?@halfer我100%同意,并且真的不想这样做。然而,我过去做过很多问答题,如果没有问答题,我会一个接一个地投反对票,一个接一个地投接近票。加上这些话。就在我写这篇文章的时候,我得到了一张反对票和一张反对票,因为我没有把这句话写进去。有时我想知道一些评论家有什么问题。如果你有其他选择,请随时告诉我。@halfer最接近的投票结果是我离题了,因为我正在寻找一个图书馆。。。不是我的眼睛受伤了,就是有人点击了关闭按钮。我将询问Meta,也许有人有一个建议。@halfer这里有一个Meta问题:它不适用于STM32F072,但在STM32F107上测试成功@halfer你的文件ocd-stm32f0.cfg的内容是什么?@Motla:我的头像附在这个答案后面,因为我编辑了它(中间的“编辑”链接)。Uli是答案的所有者,现在你已经评论过了,他们会被ping。@Motla有很多细节需要纠正。我怀疑你的水龙头ID搞错了(在数据表或参考手册中查找F072)。仅供参考,我使用STM32F030、STM32F042和STM32F407对此进行了测试(我经常使用)。这是我的
ocd-stm32f0.cfg
,但您确实需要为您的设置正确的参数,例如,在第32.5节中,IDCODE显然与您的TAP ID相对应。此外,“stm32f1x options\u read 0”命令似乎工作正常,但“stm32f1x options\u write 0…”所以这可能是OpenOCD的一个bug,它不能在这个特定的设备上写入选项字节,idk为什么,因为它在同一个地址。。。