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

STM32F4(Flash读保护)

[复制链接]
XinLiYF 发布时间:2018-2-2 21:35
STM32F4(Flash读保护)* W% o1 M! Y! B' E% v2 O
; O1 f& r( a% E2 D3 i- T1 n7 @. J1 |
4 b% m# {$ b5 M1 V
转载来源:STM32F4(Flash读保护)
, L) m7 U1 K5 L7 W& g$ Q, Y7 C! u2 R/ O8 T" i

5 p5 T- }& R' d! g( g& d1,目的7 V" E' @% z* n" }  S6 J4 z5 Y6 z
        在实际的产品发布中,如果不对储存在单片机Flash中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link等)把Flash中的程序读取回来,得到bin文件或hex文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。
* B/ W% a( L8 h, V5 t4 v
/ j# A* J+ F% f$ A3 j, o6 W6 _6 i2,开发环境& w6 s* B4 L1 q- R( N
        1,适用芯片:STM32F4全部芯片; j% U/ `9 V, W( |6 a/ g1 H- V
        2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0& x' h! Q; f0 @
        3,IDE:MDK517& R- j6 o. [& ?) m" `

0 p& I/ G9 E2 x: Q; [; z3,程序源码& z3 L: j/ X( G! F2 I& ^) i

7 ~! [* x8 |' C/ d/ F9 S* n
  1. /****************************************************************' z0 r- a0 v& ]* F# a. ^# {; n# z
  2. * Function:    Flash_EnableReadProtection
    " k0 b, @5 l7 V/ K
  3. * Description: Enable the read protection of user flash area.
    : A" ?& X' k' X. o9 ?
  4. * Input:; g' U) P# P) n( S# ^
  5. * Output:  k3 _  Y8 z  q/ S3 d$ A
  6. * Return:      1: Read Protection successfully enable* ^6 X6 z# I8 `) E' g* N  B
  7. *              2: Error: Flash read unprotection failed5 W5 r) j( G; o4 ^( |* B& i
  8. *****************************************************************/
    5 V4 W$ I* V! \: t+ a
  9. uint32_t Flash_EnableReadProtection(void)5 p4 q( h) v6 y0 }
  10. {
    ; O, I8 a* A  d# {# v5 A( ?! t
  11.   /* Returns the FLASH Read Protection level. */
    # \- u: D8 w6 [: ~& v
  12.   if( FLASH_OB_GetRDP() == RESET )
    1 M+ X! ]9 c0 U9 ]' _) s
  13.   {: E+ O% A# M0 l8 I( O
  14.     /* Unlock the Option Bytes */; V8 `0 I# J& f
  15.     FLASH_OB_Unlock();
    8 ?' E+ s4 o/ M" `4 y0 \! g
  16.    
    + J; |, g% ?3 c$ T5 @( S
  17.     /* Sets the read protection level. */+ H  r- P! d4 g  v( A
  18.     FLASH_OB_RDPConfig(OB_RDP_Level_1);" h: {+ v6 _9 i. i. I- r
  19.     2 Z" v) j0 P0 z% C: H7 H! e! q* y
  20.     /* Start the Option Bytes programming process. */  
    + F% M2 {1 W" w+ \8 E( y4 ~
  21.     if (FLASH_OB_Launch() != FLASH_COMPLETE)2 U* v5 o8 ~& A! |+ j
  22.     {) P) q- ^% f/ O' S
  23.       /* Disable the Flash option control register access (recommended to protect
    * i. ?  B$ \9 W
  24.          the option Bytes against possible unwanted operations) */6 }' @5 g% V. u% h; V9 y
  25.       FLASH_OB_Lock();
      @8 s  u  q* R4 }; D! B
  26.       , \4 `/ {; y% U$ \9 _" Q1 x7 V
  27.       /* Error: Flash read unprotection failed */8 Q- |) v6 G) J" P9 q( V% U3 Z8 \
  28.       return (2);0 Y9 Q0 Q1 W1 B
  29.     }
    6 V, q7 A" p* X& ^. D& W, ~) k6 g( k8 Y
  30.   
    $ s  h. {8 Z  ]6 X0 p8 @6 |4 V, u
  31.     /* Disable the Flash option control register access (recommended to protect $ c* A1 w2 @8 W3 V, `1 F  G, T
  32.        the option Bytes against possible unwanted operations) */" \5 n# t( R; n
  33.     FLASH_OB_Lock();
    / L6 t9 F5 _/ H0 N

  34. 1 L( g& t, p+ K4 o$ S' Q
  35.     /* Read Protection successfully enable */
    6 _  y3 ~1 R5 E' s
  36.     return (1);! h8 m$ R: R; ?% _$ m- m  [
  37.   }
    - t4 {# V  V$ G$ H# S# X
  38.   4 S6 j2 J" y0 F  I
  39.   /* Read Protection successfully enable */
    ) ?+ O( B! V, g
  40.   return (1);; @" @: l/ U, s% ?" f( I6 e" r
  41. }
    / h$ T% t8 J) |. O
  42. ( ~" @1 t. A& t: @% j* b
  43. /****************************************************************0 D% F" F% A7 \# B6 F) C) Q
  44. * Function:    Flash_DisableReadProtection
    ; g, L* R  x9 [' X# {
  45. * Description: Disable the read protection of user flash area.- F3 M/ H% r0 U" V/ Q$ w; H
  46. * Input:
    / K: ^0 z7 H9 n$ @6 t, S: b
  47. * Output:
    . h, M  A1 B  ]/ d/ \" d- G: q
  48. * Return:      1: Read Protection successfully disable$ w5 z& }, q/ c7 \3 T' n
  49. *              2: Error: Flash read unprotection failed9 u( d3 x( `/ y# }2 _
  50. *****************************************************************/1 u7 v. u* f5 s9 j
  51. uint32_t Flash_DisableReadProtection(void)5 p  N( O0 c4 c3 B$ P
  52. {
    5 t9 a! J( b' G  m3 I
  53.   /* Returns the FLASH Read Protection level. */
    . H3 W0 ]5 N) k5 Y& {- R% \
  54.   if( FLASH_OB_GetRDP() != RESET )$ V6 ?1 O- P$ I. m
  55.   {
    $ ]9 l' f6 s6 e& i
  56.     /* Unlock the Option Bytes */0 w/ s+ C1 L6 f2 [# d
  57.     FLASH_OB_Unlock();
    / A, Y# V2 W0 v( F7 S1 a8 }
  58.       [- h' Z0 i+ F9 N: m' I* L7 j1 z, X
  59.     /* Sets the read protection level. */8 C' B, e" o2 A2 x
  60.     FLASH_OB_RDPConfig(OB_RDP_Level_0);+ Z9 N7 V4 n4 Y, f
  61.     * p$ t) f9 N3 C  h0 I% ]
  62.     /* Start the Option Bytes programming process. */  
    . W$ I3 s3 f/ z7 t! F7 W
  63.     if (FLASH_OB_Launch() != FLASH_COMPLETE)0 X* q2 J0 B  f5 u
  64.     {9 U$ d" A+ S0 E+ R. i
  65.       /* Disable the Flash option control register access (recommended to protect ' E! Y6 W2 w. S
  66.          the option Bytes against possible unwanted operations) */
    3 N1 R9 S$ y( v4 b
  67.       FLASH_OB_Lock();
    8 p" f; c5 b& k" L; S$ Z; a
  68.       
    7 k& w9 _; i: ?5 u; \
  69.       /* Error: Flash read unprotection failed */
    : s- o4 |4 H$ F6 f) d
  70.       return (2);
    ) }8 A& L3 n4 `: `7 s2 _7 N* K
  71.     }- I  ~0 ?$ }3 s6 U. L
  72.   * k' D# K! ]" `: w
  73.     /* Disable the Flash option control register access (recommended to protect
    : [8 r6 B. W: [  W8 z
  74.        the option Bytes against possible unwanted operations) */
    . A' E$ x7 W1 z- P( e+ a: L
  75.     FLASH_OB_Lock();
    ) v6 B) i* l8 c% h1 f% C' C' T
  76. . M* F; c4 w. y: T; _; f
  77.     /* Read Protection successfully disable */
    1 |8 @3 m) v. _5 ]7 l" A9 Z
  78.     return (1);
    , @0 l% q+ j) |: e- U4 ^7 S3 W" ]
  79.   }1 \' H0 l* Y; p& x7 u& C: [
  80.   - f# p1 x: E  F# \" k& c
  81.   /* Read Protection successfully disable */8 }6 _# ?$ P  F
  82.   return (1);
    ' @0 K; I4 p* I  Y6 d: z- |
  83. }
复制代码
$ T: D) h6 [0 K. [% @

! E+ u, v% z$ o. W

评分

参与人数 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:568 [5 Q. L" T% Y
一般来说不要直接在程序代码里面这么写,而是生产烧录完成之后有生产烧录设备来操作。要不然如果在开发设备 ...
! I4 a0 ~. L/ R* r& [4 H
是不是如果就这么将LZ提供的代码放进去的话就无法对产品进行软件升级了?4 h, P" l+ P. }" d- t# e* W
比如说产品早期推出的时候有BUG,后期发现可以通过(例如说)产品接口的串口进行软件升级解决。但是由于进行Flash读保护,因此就无法实施了?
XinLiYF 回答时间:2018-2-3 08:57:25
奏奏奏 发表于 2018-2-3 07:39, s: [7 V2 V# C
是不是如果就这么将LZ提供的代码放进去的话就无法对产品进行软件升级了?' A% ~0 g9 k' R/ a! A$ K4 X' v/ S/ T
比如说产品早期推出的时候有BUG ...

$ _. J) }8 {$ [2 {& C
捕获1.JPG + N2 t: U# I# N2 `
捕获2.JPG

8 Y' p6 V4 h: d" x
奏奏奏 回答时间:2018-2-3 09:44:52

0 v. ^. k! ^" Y7 k! U" h那么楼主提供的代码是属于哪个级别的操作?我觉得已经是级别2了,因为需要防止别人抄里面的程序。
时光虫子 回答时间:2018-2-3 10:28:48
对于专业芯片解密人来说这些都没有用的,现在破解方法太多了,相信伟大的华强北
XinLiYF 回答时间:2018-2-3 18:44:07
奏奏奏 发表于 2018-2-3 09:44
) J7 [' f# ~& i7 s, R6 v那么楼主提供的代码是属于哪个级别的操作?我觉得已经是级别2了,因为需要防止别人抄里面的程序。 ...

# ~. |+ A* h/ m1 m3 C是等级1的,可以通过程序改为等级0,然后Flash中的程序就会被擦除,之后芯片就变成新的了,就可以使用仿真器了。如果把等级设置成2,就没有办法再修改等级了,仿真器接口直接熔断,只能通过boot升级程序了。
Tcreat 回答时间:2018-2-3 19:50:38
本帖最后由 Tcreat 于 2018-2-3 19:52 编辑 + R5 c2 r; X: g  P- o, ?% }
+ j9 a  r4 E: l6 P
其实楼主的代码  根本就是官方的例程提供的  一开始自己都没详细的说明保护的机制和原理
cloudmr 回答时间:2018-3-25 15:58:45
Talons 回答时间:2019-4-7 09:03:35
时光虫子 发表于 2018-2-3 10:28
/ w. _/ Y& l! A: }& M) J" [对于专业芯片解密人来说这些都没有用的,现在破解方法太多了,相信伟大的华强北 ...
) x7 |: K/ G1 y
解密要钱的啊,而且还不少,小众产品或者产品中有多芯片协同工作的,破解难度极大,可以交叉验证版本。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版