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

STM32F4(Flash读保护)

[复制链接]
XinLiYF 发布时间:2018-2-2 21:35
STM32F4(Flash读保护)
/ Q  V4 s* z2 n: W
: D( i1 z/ K; x3 n

! t# E" L6 |- x0 u; y. t转载来源:STM32F4(Flash读保护)
8 S3 F! o1 ~, t  ]1 U4 a7 v6 {1 d3 g( [5 A: F0 m
, M! k( T# ^9 b4 c0 V# Y
1,目的
0 @( S6 k( v, K4 S/ y        在实际的产品发布中,如果不对储存在单片机Flash中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link等)把Flash中的程序读取回来,得到bin文件或hex文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。# P5 s& @, P, l: y" e' G. ?

  A* `6 X9 w& Z, Y# |2,开发环境
1 k* E3 p% F8 D' K! K        1,适用芯片:STM32F4全部芯片! u  e5 K7 V7 S0 ?$ m# s
        2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0
, [$ f) ^1 R( L& P+ D! f2 f- ]) h        3,IDE:MDK517
5 T7 \9 I8 P6 j) G* _; H1 p8 O  z
4 Y( Z# ?4 r! ~4 e! _$ f3,程序源码) B$ T- w+ L) [
! v2 ?3 j/ ~9 W& E: z
  1. /****************************************************************
    + ~7 r. }( `: T( n3 U6 M& T4 f
  2. * Function:    Flash_EnableReadProtection
    - M/ l- d9 n3 t9 \1 F: i2 Z
  3. * Description: Enable the read protection of user flash area.2 q% J/ H3 A- a
  4. * Input:
    ; ~$ Z4 e- N0 q8 B
  5. * Output:$ W  M: O! j  Y# `
  6. * Return:      1: Read Protection successfully enable
    4 E# R6 j8 H/ i2 k
  7. *              2: Error: Flash read unprotection failed
    1 n& B; w# K' b" Z6 f, j
  8. *****************************************************************/
    0 B2 K: B5 Y' u6 Y+ a3 U( N. j
  9. uint32_t Flash_EnableReadProtection(void). Z4 U. I' O2 r7 x4 l- q
  10. {
    " {& @! u! `1 F. x- m, ^  K
  11.   /* Returns the FLASH Read Protection level. */
    : a4 b+ k+ A3 _6 l+ ], O4 S3 R
  12.   if( FLASH_OB_GetRDP() == RESET )
    8 B1 p( M) S# |6 i
  13.   {  m5 \% O  e0 t
  14.     /* Unlock the Option Bytes */
    , {3 Q" B( d0 B1 o2 C) A2 `- l6 T
  15.     FLASH_OB_Unlock();
    ) w3 Q7 W: w4 i; ~
  16.     . C( k2 q/ D6 h7 v4 k
  17.     /* Sets the read protection level. */
    / ?0 U: g0 A" ~% V3 F: X
  18.     FLASH_OB_RDPConfig(OB_RDP_Level_1);
    # Z! l& ~" a: S
  19.    
    5 E6 S( ~5 J. y/ {# R" k' t
  20.     /* Start the Option Bytes programming process. */  $ |6 l* M& B% l" Q6 i8 [
  21.     if (FLASH_OB_Launch() != FLASH_COMPLETE)1 o% x9 d* s4 t0 a
  22.     {) |6 G3 v  w2 y4 y% N
  23.       /* Disable the Flash option control register access (recommended to protect % b$ u: r4 S, O* }$ E
  24.          the option Bytes against possible unwanted operations) */
    0 U! e) _4 H1 V1 h; v7 L2 F
  25.       FLASH_OB_Lock();
    / D1 ~  x, ~0 p3 K
  26.       2 E. z5 D( |% U/ G+ @
  27.       /* Error: Flash read unprotection failed */# [* b. T# b- g$ o
  28.       return (2);
    5 X4 O6 r6 u+ H7 `( P
  29.     }- e& u0 ?! |7 W; z! A" p' a8 {6 E
  30.   6 S+ ^& t/ s2 V6 Y) @) Z; c4 p
  31.     /* Disable the Flash option control register access (recommended to protect
    " x. m. p: U" a8 Y
  32.        the option Bytes against possible unwanted operations) */9 B; s! e2 U  {) U1 \) `
  33.     FLASH_OB_Lock();# h% K$ X: }8 j0 g. M2 e( q

  34. 8 d1 W$ E+ [  n: `+ y1 a3 k+ k  ^
  35.     /* Read Protection successfully enable */7 J! I. {& ]8 {5 @/ E0 U
  36.     return (1);
    5 }" A. O$ I$ `2 x
  37.   }
    8 k' S3 c& ^7 {( w' ?, C
  38.   
    ) p: _# H9 s' Z, d
  39.   /* Read Protection successfully enable */0 Z1 `, f) O6 z3 _4 @/ e. H
  40.   return (1);
    : e$ ]3 a6 u+ u/ O, }
  41. }
    0 C4 s. B' }9 I) o

  42. 9 I2 K+ ^6 n3 f; |' H, I& i) K3 o
  43. /****************************************************************
    $ C+ {# G& h9 ]4 Z) G7 }
  44. * Function:    Flash_DisableReadProtection
    ! f: `) L2 _0 p; S0 f
  45. * Description: Disable the read protection of user flash area.
    2 E" u( I3 X$ e7 w! i2 n* C
  46. * Input:
    3 P0 b- ~$ X9 ^: {
  47. * Output:
    8 V/ S; w  E. I: t) t/ N
  48. * Return:      1: Read Protection successfully disable
    4 V( Y; G  G8 a+ v
  49. *              2: Error: Flash read unprotection failed
    ) V3 s1 Y2 @, B) V0 C* Y
  50. *****************************************************************/
    % {/ F2 S8 K- S, N0 s
  51. uint32_t Flash_DisableReadProtection(void)
    % ~( X) i9 T' V/ C7 |
  52. {
    0 u1 f5 g4 C5 c3 s% J
  53.   /* Returns the FLASH Read Protection level. */
      ^; u5 y$ h* r
  54.   if( FLASH_OB_GetRDP() != RESET )
    ' y3 y( C& N4 V% U0 J
  55.   {! a+ R; K! z! S' m2 d0 }! m
  56.     /* Unlock the Option Bytes */
    + Q5 S7 Z7 F' ^" Q( h
  57.     FLASH_OB_Unlock();
      P+ i$ B: I. V
  58.     & {- f* o$ t4 P# f5 f  ^7 n$ z
  59.     /* Sets the read protection level. */- O: a, m! _& D: _" D7 |" e; g+ [
  60.     FLASH_OB_RDPConfig(OB_RDP_Level_0);) C* F) [, Y: e" X' h3 y) x2 u
  61.    
    8 _; t! X  Z- [3 y1 u4 z+ O$ `
  62.     /* Start the Option Bytes programming process. */  
    # F5 l& F3 M, [7 [8 @( D
  63.     if (FLASH_OB_Launch() != FLASH_COMPLETE)
    5 h6 h6 O0 G; N! _  m
  64.     {
    4 B$ `; ?, m# U
  65.       /* Disable the Flash option control register access (recommended to protect
    5 ]& [& d4 Z& A: R6 W
  66.          the option Bytes against possible unwanted operations) */
      ]+ ]! A. M4 m5 h
  67.       FLASH_OB_Lock();
    7 |2 a  y1 i% G- ^% r8 C
  68.       
    . J' z3 E8 u7 n# ^
  69.       /* Error: Flash read unprotection failed */
    ( i5 t" H7 W) k+ x" E% U5 A; S
  70.       return (2);4 {6 F% u4 i2 x# {) z
  71.     }' m2 I# [4 Z/ P; }1 l
  72.   
    9 z$ {5 k; f9 u
  73.     /* Disable the Flash option control register access (recommended to protect 9 a6 J8 V; `8 D; P4 J0 \2 Z
  74.        the option Bytes against possible unwanted operations) */
    8 n, S0 n* d0 L$ _; X
  75.     FLASH_OB_Lock();
    9 Y& B6 c+ z. H* w$ M& A
  76.   t- _, r6 k- Y5 J4 _
  77.     /* Read Protection successfully disable */6 ^* _* [3 Z5 a1 A! I. ?! G2 \
  78.     return (1);2 r7 W- d( w- x, e+ b+ w0 m
  79.   }8 x0 {8 k- [$ Q+ p: x
  80.   $ ?  l" i* \3 T% J  F. K
  81.   /* Read Protection successfully disable */+ k' i( V# _$ `( C: S8 Y
  82.   return (1);7 p& }* `7 U: ?
  83. }
复制代码

( G* W9 s5 ]7 G. D' Z
. S* ~( Q" c9 }2 z3 Z: K! f

评分

参与人数 1 ST金币 +2 收起 理由
努力的人 + 2 可以对程序录一个简短的视频进行讲解一下.

查看全部评分

赞 收藏 2 评论9 发布时间:2018-2-2 21:35

举报

9个回答
maxtch 回答时间:2018-2-3 00:56:27
一般来说不要直接在程序代码里面这么写,而是生产烧录完成之后有生产烧录设备来操作。要不然如果在开发设备上这么折腾一下芯片就不能做开发了。
奏奏奏 回答时间:2018-2-3 07:39:35
maxtch 发表于 2018-2-3 00:56
& K" y; m' S: D9 K- p& Y3 ]; w一般来说不要直接在程序代码里面这么写,而是生产烧录完成之后有生产烧录设备来操作。要不然如果在开发设备 ...

. O8 b* t4 I; f4 q2 w( b- h是不是如果就这么将LZ提供的代码放进去的话就无法对产品进行软件升级了?3 S! S* s+ C# ]1 I. g+ o
比如说产品早期推出的时候有BUG,后期发现可以通过(例如说)产品接口的串口进行软件升级解决。但是由于进行Flash读保护,因此就无法实施了?
XinLiYF 回答时间:2018-2-3 08:57:25
奏奏奏 发表于 2018-2-3 07:39/ \- f, g% l- L% \  }
是不是如果就这么将LZ提供的代码放进去的话就无法对产品进行软件升级了?: ^1 y& n0 [8 B
比如说产品早期推出的时候有BUG ...
% m  J. u& z) `% w3 k+ T8 W' {/ i
捕获1.JPG / h* b! X8 F. a- ~
捕获2.JPG

: ]' m( y2 M7 k5 J- S
奏奏奏 回答时间:2018-2-3 09:44:52

3 C: J& f- E9 T$ u3 E! `) s# U那么楼主提供的代码是属于哪个级别的操作?我觉得已经是级别2了,因为需要防止别人抄里面的程序。
时光虫子 回答时间:2018-2-3 10:28:48
对于专业芯片解密人来说这些都没有用的,现在破解方法太多了,相信伟大的华强北
XinLiYF 回答时间:2018-2-3 18:44:07
奏奏奏 发表于 2018-2-3 09:44$ ?- y/ N/ c7 Q
那么楼主提供的代码是属于哪个级别的操作?我觉得已经是级别2了,因为需要防止别人抄里面的程序。 ...
. A0 _4 n  m6 D& l8 [
是等级1的,可以通过程序改为等级0,然后Flash中的程序就会被擦除,之后芯片就变成新的了,就可以使用仿真器了。如果把等级设置成2,就没有办法再修改等级了,仿真器接口直接熔断,只能通过boot升级程序了。
Tcreat 回答时间:2018-2-3 19:50:38
本帖最后由 Tcreat 于 2018-2-3 19:52 编辑 + j" s* m; U/ W0 V- c: y( u* b
! _3 u1 K+ w# S. v9 b2 z" M/ X
其实楼主的代码  根本就是官方的例程提供的  一开始自己都没详细的说明保护的机制和原理
cloudmr 回答时间:2018-3-25 15:58:45
Talons 回答时间:2019-4-7 09:03:35
时光虫子 发表于 2018-2-3 10:28
! I& K2 ~8 n8 o: V* v3 y& q对于专业芯片解密人来说这些都没有用的,现在破解方法太多了,相信伟大的华强北 ...
$ w4 x7 X1 c$ O8 [7 d3 M
解密要钱的啊,而且还不少,小众产品或者产品中有多芯片协同工作的,破解难度极大,可以交叉验证版本。

所属标签

相似技术帖

官网相关资源

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