本帖最后由 zhanghuichun 于 2017-4-4 15:55 编辑
清明节窝在家里写帖子,老祖宗会不会说我不孝呀
STM32F4、STM32F7及STM32L4是带有读保护和写保护的,并且有个专用代码保护功能。
读出保护是一个全球性的闪存读保护允许嵌入式软件代码防复制,逆向工程,倾销使用调试工具或其他侵入性攻击的手段。这种保护必须设置由用户后的二进制代码加载到嵌入式闪存。三个RDP水平(0,1,2)定义,以下各部分将描述
- 0级是默认,闪存完全开放,所有的内存操作可能在启动配置(调试特性,从RAM,启动引导的系统内存引导装载程序或从闪存)。在这种模式下,没有保护,这种模式的开发和调试。
- 读保护级别1被激活时,不能访问(读、擦除和程序)闪存或备份存储器,可以通过调试特性,比如执行串行线或从SRAM JTAG即使引导引导装载程序或系统内存。然而当启动闪存,访问闪存和备份存储器允许用户代码。禁用RDP一级保护通过重构RDP选项字节0级导致大规模擦掉。
- RDP二级被激活时,所有提供的保护级别1是活跃的和芯片完全保护。RDP选项字节和所有其他选项字节被冻结,不能再被修改。JTAG,SWV(单线查看器)、ETM,边界扫描被禁用。当启动闪存,内存内容访问用户代码。然而,从SRAM或引导系统内存引导装载程序不再是可能的。这种保护是不可逆(JTAG保险丝),所以是不可能回到保护级别1或0。
PCROP是读和写保护的闪存ip代码。flash区域被分为8个部分(0 - 7)保护的专有代码可能修改或读出由最终用户代码,调试器工具或RAM木马代码。以外的任何读访问权(获取)PCROP保护的区域,通过ITCM或执行AXI总线,触发:
1、总线上给定的总线错误。
2、RDERR标志位FLASH_SR状态寄存器的设置。
如果产生一个中断也读取错误中断需要在(RDERRIE)FLASH_CR寄存器中设置。任何程序PCROP-ed部分/擦除操作,触发WRPERR标志错误。受保护的ip代码可以很容易地由最终用户应用程序调用,还可以防止直接访问ip代码本身,然后PCROP并不阻止受保护的代码被执行。
而读访问权PCROP-ed部分生成一个总线错误,读取错误中断可以被一个硬件故障错误中断或总线故障错误中断。使用读取错误中断,必须启用总线故障错误中断的优先级低于读取错误中断的优先级
PCROP保护的flash部分防止D-code总线读访问,在这里提到很重要,只有允许代码执行(通过ip代码指令取出总线),而阅读的数据是被禁止的。因此保护ip代码无法访问相关的数据值存储在同一地区(如文字池、分支表或常数从闪存通过获取D-code总线执行期间)。PCROP代码必须是只是执行的代码,必须不包含任何数据。用户必须配置编译器生成一个只是执行的ip代码避免任何数据读取。
一般中断向量表位于第一个扇区在第一个地址0x08000000(除了在某些情况下,在其他地区搬迁,SRAM)。在放置代码保护的闪存,必须尊重规则如下:
1、第一闪存部门矢量表的位置不能PCROPed部分
2、PCROP-ed代码不得放置在第一个扇区。
PCROP-ed ip代码依赖项的保护ip代码可以调用函数库位于用户代码PCROP-ed区域以外的地区。在这种情况下,ip代码包含相关的函数地址允许PC(程序计数器)跳转到这些函数在执行ip代码。这些地址是不变的ip代码一旦PCROP-ed代码。因此每个调用的函数都必须位于(PCROP-ed以外的地区)在其相应的解决地址写在PCROP-ed ip代码,PC跳到一个无效的地址和ip代码不正确工作。完全独立,保护ip代码必须与所有相关的功能被放置在一起。
那么如何设置代码保护呢?
1、直接操作寄存器,对要保护的代码进行操作
2、使用STM32 ST-LINK Utility进行配置,这个比较方便,也不用区分开发固件和量产固件,直接在下载软件中配置。
打开Option Bytes可以看到很多配置选项,可以去官方下载这个软件的使用教程。
测试0x0800C00这边区域,没有开启PCROP时,这个地址用keil在线调试是可以读出来的。
将读保护等级设置为1,这里千万不要选择等级2,这是一条不归路,直接把JTAG保险丝烧断了。
再用keil在线调试,查看0x0800C00地址的信息时可以看到,软件已经开始报错了,这片区域也全部显示 ?? 等错误了。 再打开STM32 ST-LINK Utility,软件已经提示需要把保护关掉了。 把保护的模式改回0后,flash内容也全部被擦除了,起到保护代码的作用。 需要详细了解代码保护的,可以看看官方的介绍文档:https://bbs.21ic.com/forum.php?mod=attachment&aid=ODI5ODM4fDQxNzgxZGYzZjNjM2E5MDg4YTNjMTE2NTk5MzFjY2Y3fDE3MzA5OTQ1MzU%3D&request=yes&_f=.pdf |