STMCU小助手
发布时间:2022-7-13 10:33
|
前言. i* f8 _: f* C0 \+ P7 g 在微控制器领域,对嵌入式代码的知识产权保护已经成为被高度重视的问题。为了提供这方面的保护,STM32 微控制器采用多种不同方法来保护 Flash 代码,避免复制和逆向工程。: b! U; a3 e5 S3 J7 k. O D 本应用笔记描述了通用 STM32 系列的 Flash 保护功能。重点关注 Proprietary Code Read OutProtection(PCROP),它内嵌于中等容量的 STM32L151xC、 STM32L152xC、 STM32L162xC 和STM32L100xC微控制器中。 表 1 列出了本应用笔记涉及的微控制器/ K) w r, q# ?* t& M
0 S H# F- W) j9 _2 v" M 1 Flash 代码保护 STM32 微控制器系列产品具有下列代码保护功能: 1. 全局读保护 (Read-out Protection, RDP)5 f7 o2 g- J7 o; s7 H U6 v 2. 写保护 3. 专有代码读保护 (Proprietary Code Read Out Protection, PCROP)% N6 C' J1 E7 D" d8 O: `3 l 这些功能用来保护嵌入式固件代码的知识产权,这表示对复杂嵌入式系统的关注正在日益增加。 1.1 全局读保护 (RDP): u! A5 A+ b% S# X( d8 i- T0 _ 全局读保护可保护嵌入式固件代码 (预加载到闪存中),避免逆向工程、使用调试工具读出或其他方式的入侵攻击。' q5 X# q L; r3 U) a8 K- ]+ m 该保护在二进制代码载入嵌入式闪存后,由用户进行设置。' V; z. v# [5 e, ]/ v 表 2 描述了 3 个用户定义的保护级别。 ! i* o3 S/ ?8 w) a! u/ f
@* H9 K A7 A 一旦用户代码被载入闪存中,即可避免代码倾出。可通过激活级别 1 或级别 2 保护来实现,或者通过 RDP 选项字节按照图 1. 中所示的准则进行编程。 1 D2 G# Z* [ m; o
# j1 n5 \3 x, _2 O* R. b/ ^ 两个保护级别 (1 和 2)都可以保护闪存。其内容不可被 Serial Wire 或 JTAG Debug 访问、自举程序系统软件或通过向易失性 RAM 存储器载入其他软件来读取。 两个保护级别的主要区别在于易失性数据 (RAM 内容)保护,此保护仅存在于级别 2 中。RDP 保护被设为级别 1 时,调试工具仍然能够连接和访问 MCU (RAM 和寄存器)的所有易失性资源。这些工具通过向 RAM 载入一些测试代码来检查部件和 / 或系统。4 B' n$ h6 I8 U% Y& ~) Z) V 并且,级别 1 保护允许通过擦除全部 Flash 内容来恢复已编程部分。可通过将 RDP 选项字节从级别 1 重新编程为级别 0 来实现 (参见图 1)。 另一方面,级别 2 保护是不可逆的 (熔断)。一旦 RDP 设为级别 2, RDP 选项字节和所有其他选项字节都会被冻结,不能再修改。 但是,用户 Flash 内容 (除了所有写保护扇区,参见第 1.2 节:写保护)在用户代码本身的控制下仍然可被更新。通过执行 IAP (In Application Programming,在应用编程)自举程序代码来允许一些扇区的固件更新。 为了确保能够保护预先编程的用户代码,自举程序协议可以由用户指定 (执行相关保护来避免攻击、倾出和 / 或恶意代码更新)。 E8 W \8 K- Y0 C$ [ 注: 利用 STM32 上提供的嵌入式 AES 加速器实现了一些 Secure Bootloader 示例,应用笔记AN4023 - STM32 安全固件升级中对此有描述。 关于读保护的更多详细信息,请参考微控制器参考手册。 1.2 写保护; A v/ C t& O9 J 写保护通过 Flash 区 (扇区)实现,可保护指定扇区,避免代码更新或擦除。 利用一个选项位来激活对每个 Flash 扇区的写保护。当设置扇区 i (选项位 nWRPi = 0)为写保护时,该扇区不能被擦除或编程。 表 3 显示了对于不同 RDP 级别的扇区写保护。 0 @0 ^; i9 m7 Q7 g$ m% `6 X5 Z ! G7 N$ ?: d9 }9 u3 b. L
8 s" I A) r1 B$ u" `5 ^ 3 o; x) B' e! `6 l) U$ k3 d 1.3 专有代码读保护- g* f: b# ]" ^! J9 T& h$ K& r$ C 专有代码读保护 (PCROP)是一种替代保护,也是通过扇区实现,可保护特定代码 (知识产权)不受攻击。# Q X: s# I. l9 Q8 U" f PCROP 在微控制器代码保护和代码管理上实现了 2 种主要功能。' s5 B$ h9 d! Q' z6 X9 ~7 S4 I 表 4 中将两种 PCROP 功能分别与 RDP 保护方法进行了对比。2 K8 S X& Q8 R( \& T, k7 s! k
v6 Z6 Z4 a, D* P, m+ t6 k 这种保护基于一种只执行机制。 Flash 代码区域仅能被 STM32 CPU (作为指令代码)获取,而所有其他访问 (DMA,调试和 CPU 数据读取)是严格禁止的。 在保护可执行代码不被读取时,这种只执行机制会产生一种副作用,导致被保护代码本身(从该区域执行)不能访问存储在相同区域的相关数据值 (如文字库)。为了避免该区域中数据访问的需要 (特别是文字库访问),必须在 ARM/Keil 编译器中选择一个特殊的命令行选项:" c2 H, t: D% s* R+ T' D2 y (armcc --no_literal_pools --max_string_in_code = 0). w, {: v) S) h5 \, i0 n1 j . o( G, B: i/ g* D+ {2 V N6 u 此命令行选项使用其他指令转换文字库操作。这些指令可创建寄存器值,而无需任何数据读取访问。它主要用于载入地址可变寄存器。由于替代方法效率较低,此选项将这些操作转换为效率略低的代码。但性能损失是有限的 (低于 5%),这对于受保护的代码部分来说是可接受的。; V/ x- Z0 }$ s3 u" Q# e" A* P 利用与写保护同样的选项字节来选择 PCROP 扇区。因此这 2 个选项是互斥的。但是,受保护不被读取的扇区 (PCROP)也不会被写入 / 擦除。因此, PCROP 可认为是扇区写保护的超集。 为了激活 PCROP (改变 nWRP 选项位的功能),必须激活 SPRMOD 选项位。该操作是不可逆的。 同样在 PCROP 模式下,设置为读保护的扇区也不能被复位成无保护状态。因此,新扇区可成为读保护区 (当 RDP 设为级别 0 或 1 时),但是被保护的扇区不能通过擦除或修改成为无保护区。 根据 RDP 级别,存在可能的变通方案来恢复受保护芯片。若 STM32 处于 RDP 级别 1 且RDP 选项字节设为级别 0,则用户 Flash 区域将被完全擦除。这是 SPRMOD 和 nWRP 位可被复位、所有受保护扇区成为无保护的唯一一种情形。 但是,由于此操作总是与用户 Flash 区域的全局擦除相关联,因此代码保护不受影响。" G7 k6 V0 D3 N" `3 L+ w 当 RDP 设为级别 2,所有选项字节都会被冻结,不能再修改。因此,受保护扇区不能再被擦除或修改,这样就成为永久性保护。 / |. Z4 n7 h, L 完整版请查看:附件 |
DM00075930_ZHV1.pdf
下载265.09 KB, 下载次数: 0
微信公众号
手机版