你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32经验分享——Bootloader详解(2)

[复制链接]
STMCU小助手 发布时间:2022-8-28 21:32
  之前我们说到了Bootloader,有了它我们就可以方便的下载和运行新的程序,但是这也意味着别人也可以抄你的板子,用仿真器读出来你的程序,从而复制你的完整产品功能。所以你还需要学会对产品加密。
$ D. K; p1 `3 g0 l8 J8 i; u$ l9 V0 F& e2 C( r  D2 ?3 A
        加密和破解是个比较那个的话题了。怎么说呢?有的东西不该收费、不该限制那么破解就是合理的,比如黑客们就看不惯某些网站企图垄断收费,某些软件企图限制网速收费。当然了,大多数人都是出于需求考虑选择的破解或者是盗版。总不能需要编辑个文档就买一套Word吧,总不能学个单片机花数十万买MDK和AD授权吧。一定程度上这些也是大多数人需求。这里关于故意引导用户习惯养成、低价&盗版挤压垄断软件市场垄断等等的话题我们就不谈了。
+ u3 J, ]( \$ N( U  Z
* d6 a0 {0 v. q7 D        那么如果你不想你做的产品轻轻松松被人家复制,你就需要花一点功夫了。硬件上你可以灌胶密封、打磨掉丝印、多画无关的布线、多层布线从内走线、外接存储器、配置电阻校验等等。这里我们主要分析一下软件层面的。因为不涉及硬件改动,无差异应用等等。4 h; h3 b: R- Z' x" f: J" K2 l
7 J' C$ d2 f+ n3 _3 r) c
        首先最简单的你可以开启FLASH读取保护,防止0x0800 0000这块硬盘被别人复制下来。FLASH读保护功能在选项字节中配置。+ u! h2 n' e6 B, J' \
3$L_LWOEBQ[F[51Q7T2RK2Q.png

, |& i8 l6 b: F) h1 \" Z2 u
. K- M2 [; Z8 B( W+ i2 F: T
选项字节
9 E7 H; z3 T) P' W  ?/ J
        选项字节的位置在0x1FFF C000,你还可以看到ST的手册的错误。需要关注的是第2个字节,即15~8位。
$ @9 m0 e$ i5 K3 Z7 U
  W, g1 H, n1 Z( e1 r
NYD$}U$`8}RQBXWKL)7AKBA.png
9 \, q0 F) I, V, j* i, M4 ~5 Y2 ~, j
) B* _. S+ [( R! L
读保护

& g) C8 t3 A: [0 y
) h/ m8 B! g- U+ Z6 v1 O% K7 F8 i  ?) }3 @2 M; v( c. r
        默认值0xAA、保护等级0,就是不保护,所以你刚焊接好的新片子可以调试运行程序。$ j  ]1 j8 W. {
& j8 a9 n- p, |, Y. V
3LBS8N0M{{RXJTK1BR)X0TH.png
+ d  w; z0 {: R+ F2 Q

% `1 ]  X) y; P
读保护默认值

9 ~% E# h% K6 }- M, j; ^% Z0 U. Q; h3 e* s' K1 [/ n% M! O

; M# V$ X9 }* I( W$ J5 R        如果写的不是0xAA也不是0xCC,那么这时候就有了读保护功能,其他人就不能通过仿真器把你的FLASH数据读出来了。如果是0xCC那就更绝了。后面再讲。
; r3 a% O9 M+ m+ [3 [' f, O# X( C2 `0 c4 B2 p& w* N/ R
        那么怎么操作选项字节呢,跟你擦写FLASH一样,你首先得知道它在哪,也就是选项字节的地址。0 U- u0 z, Y; U. w, ^' _

) n" [  M' z/ }, f
P}~T3)(6K205`}X7NFL]ARE.png

7 x, \8 Z+ z& v* x7 C, M8 t: \  a/ f
6 F) p: d, h+ d2 x# V7 M) h) w
闪存存储器组织
" d- ~0 c! v% G/ f: l2 S
% F1 z6 X+ W* p8 C1 E& N  [

  r& g& J  ]8 S7 A& i- ]$ f        在这里你可以看到最最最熟悉的0x0800 0000那块主存储区,还有帮你用串口下程序的ISP程序的0x1FFF 0000系统存储区,我们要找的选项字节首地址是0x1FFF C000。
4 c+ T8 d, v  f2 n8 _. z* {! I% r: e* \. p. m0 J% C9 P' M
        我们可以直接访问选项字存储区,也可以通过FLASH接口寄存器。
; R' V5 L6 o5 n& e
# g+ X. G, b+ ^) p2 C4 v        首先翻到FLASH的接口寄存器位置。记住这个地址:0x4002 3C00。+ s7 q4 i# h4 O5 U  n

& V/ S( Q7 k0 K$ ?3 L' o
331HG~Y%OPM)FFVQA]DD695.png
' P! b9 d* ^. f* g
. ]$ e7 c0 I/ O  B
FLASH接口寄存器
, i9 w7 h! z9 `. ~

- Y# O: \% ]' T2 o# d$ A" h9 R; d# T+ @: Z0 _2 H( [* f+ o
        然后在最后的寄存器地图和复位值表中可以发现选项字节控制寄存器。; i( c% Q) `6 K& Q

$ ?" ^$ E1 O2 a: _4 j) t1 Y
X943YSZ`{_%TOJ7FMLLS8X1.png
, b5 A: u( {" J8 o/ q9 ?9 g
7 d& l. N8 x8 R
选项字节控制寄存器
' D. c( n4 {9 G% x6 A

) x# {) N3 V5 U9 D8 ?. d, E; N* e7 r: A" u
        可以发现它的偏移是0x14,加上我们上面记住的地址,就是0x4002 3C00+0x14,即0x4002 3C14。然后读保护寄存器在15~8位,倒数第二个字节,由于STM32是小端模式,所以0x4002 3C14这个地址还只是第7~0位的第一个字节,所以读保护寄存器的地址就是0x4002 3C14 + 1了,即0x4002 3C15;3 T% B! i% a" v
8 z! b0 S  T) E" j5 P
        如果我们想知道FLASH有没有读保护呢?直接读取0x4002 3C15这个地址的一字节数据,不是0xAA就说明已经开了读保护了。比如HAL库的读保护读取源码就是这样。' D, `, l8 s( G, _) M# d1 \4 K5 N
2 ^# A2 A5 f* b) D# Z8 W, Q
[30JA]A00A4N8(L$OH{`(7T.png
+ Y/ ^) i* B2 d' a6 Y

; _2 b0 H$ q6 Q: e& [
读保护等级获取
9 b5 A0 |7 f  }* ^

4 m5 v$ V& ]' B5 M) q& l! x0 f
        通过直接访问选项字也可以。同样需要加1访问15~8位的第二个字节。3 C! u' T0 e; ^9 R9 ?  D: D
; ?- P+ ]0 f. _8 y5 D3 ]
UWH`CZUZQZ@U]GFF{5[3W]3.png
, V% r0 G( H; c9 I; h+ t

: B# J* d0 d0 A$ n: G: J: h3 b- }
直接访问选项字
, t; v0 K8 [2 K

0 Q& p* w* R$ z6 @& ^        除此之外,STM32还有写保护功能。地址在读保护地址后面。即0x1FFF C008。$ O- Y4 y3 ~  v5 J5 h$ C% k
# Q6 b* v. k$ m# B$ F+ {' Y' j
_JJW)9OJF5DL3V)`(H%TIUY.png
+ W" J( e! D$ X. b; ]! b/ u
; Z# D6 I( j% C' B0 }
写保护功能描述

' L' O5 D( T2 o' K  t0 b( K
5 }. J# [: z! d: {
/ z- r* s! X$ l' _: m        例如407xx的单片机就是位11~0这12块扇区的写保护配置。同样的还是通过闪存接口寄存器访问,默认值是0xFFF。即全部是1。因为1是表示不保护,所以可以随便用bootloader来擦写FLASH扇区从而更新固件。紧接着后面就是前面讲的读保护。+ j2 f  ]2 E' {) f7 ?
1 i" D% C9 @- W- L* S+ j
A1`$ATZEGLWIK3_BX535Q77.png
4 v6 W& N% n6 i$ R
' I8 E. _1 `5 W$ C$ f, l1 t+ c
写保护默认值
, d6 c7 h+ x9 s
0 e. O- Z7 s3 w$ S, T

1 r5 }4 i2 k+ Y( R6 p        比如可以开启bootloader所在FLASH的扇区的写保护。
- e: G2 F$ [' E0 F3 C2 p, q9 V' f9 C8 o% _/ D
        访问的基本地址还是0x4002 3C00+0x14,偏移到FLASH_OPTCR,同样还是由于小端原因,所以bit 23~16所在的第3字节需要偏移2个字节,也就是之前的读保护RDP之后,即0x4002 3C16,比如HAL库就是这么上锁的。
! \1 l2 T+ C5 R5 g+ R5 w$ ]; C2 n: x; P( U* t0 B* O
~)IY4[(W7BL%N@%_)R{G7WQ.png
' y! h; Z! ~5 x  y" ~1 F
/ T; o7 J8 T& R; ~" o
使能写保护

/ K! z; @/ v  T' X6 K' l- V
# v  Q4 R6 N$ G8 |# `        这样一来,除了你的bootloader可以擦写FLASH升级,外部仿真器想要解锁的话只能顺带清空FLASH了,就可以保护你的程序不被读出来复制。
# H% Q9 U6 b  Y- {
! U' i: c5 G  ^* ?1 y        那么这样就真的安全了吗?仍然不是,依赖硬件保护只是其中一种最简单的方法。更多的是靠加密算来进一步增加别人的复刻难度。
* x$ x1 j. O) q7 {2 K5 {2 E- l
/ T" Q: L- d+ `作者:mymymind $ |; {7 z4 z0 w; h3 n$ F5 _; T1 D, m

& [; }/ w6 s, F* i* T6 f
3 W2 H/ D# B- }0 I
赞 收藏 评论0 发布时间:2022-8-28 21:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版