GD32代码读保护

  • 引言
  • 手册介绍
    • 芯片内存结构
    • 闪存操作说明
    • 可选字节块说明
      • 功能生效条件
      • 安全保护功能说明
    • 代码实现
      • 保护功能开启
      • 测试方法
  • 现象说明
  • 整体分析
  • 进一步测试

更新历史

  1. 20220227
    首次编辑和发布,描述了 GD32F303 MCU 的安全保护功能和初步测试结果;
  2. 20220303
    添加了进一步测试的结果;

引言

公司产品换料,使用了 GD32F3 系列的 MCU,客户要求对代码进行读保护,再查看用户手册时,看到了其提供的“安全保护”,就想通过实验来看下实际效果;

手册介绍

这里从 GD32F303 的用户手册摘录关键信息:

芯片内存结构


图1 内存基本分配表

这里我们需要注意的是,这里的主存分为了 bank0, bank1. bank0 的页大小为 2KB 每页,bank1 的大小为 4KB 每页;
且存在信息块和可选字节块,这个可选字节块也是和我们想要做的读保护息息相关的;

这里我们先明确,启用读保护功能是需要设置 可选字节块的,所以下面我们围绕可选字节块进行展开。

闪存操作说明

我们知道,常规内存编程前需要进行一定的动作,擦除、解锁等操作,这里是通过 两层解锁和先擦除后编程的:

图2 内存控制说明

通过图 2 中,我们可以得知以下关键信息:

  1. 内存操作前需要解锁,解锁的方式是向指定寄存器 FMC_KEY0 中写入键值;
  2. 可选字节的编程,是需要两层解锁的,即 FMC bank0 解锁后,还要对 FMC_OBKEY 寄存器写入相应键值解锁 可选字节寄存器的编程权限;

可选字节块说明

功能生效条件

每次系统复位后,闪存的可选字节块被重加载到FMC_OBSTAT和FMC_WP寄存器,可选字节生效。可选字节的补字节具体为可选字节取反。当可选字节被重装载时,如果可选字节的补字节和可选字节不匹配,FMC_OBSTAT寄存器的OBERR位将被置1,可选字节被强制设置为0xFF。若可选字节和其补字节同为0xFF,则OBERR位不置位。

上述我们可提取到关键信息:

  1. 开启读保护后,至少需要系统复位;
  2. 复位后检测信息不匹配后,可选字节会被强制擦除;

可选字节的具体含义见下图:

图3 可选字节块说明

安全保护功能说明


图4 安全保护功能说明

从图 4 的说明中我们可知:

  1. 从未保护模式下修改 SPC 字节后,需要复位后生效读保护功能:若是用户代码修改,则需要系统复位使其生效;若是调试模式下修改,则需要上电复位。
  2. 安全模式下,想要关闭保护态,仅能从用户代码从修改;
  3. 安全模式下,主存的前 4KB 不可擦除,也就是 bank0 的前两页;【如果 IAP 这里的话,是会失效的】。
  4. 安全模式下,任何启动方式下的读主存都失效;
  5. 安全模式下,可修改 SPC 字节以退出读保护,但是会擦除整个主存

代码实现

保护功能开启

经过上述的分析,结合库函数,我们确定了驱动函数为:

#include "gd32fmc.h"
fmc_state_enum GD32FMC_OB_Toggle(uint8_t ob_spc)
{fmc_state_enum res = FMC_BUSY;fmc_unlock();   // 解除 bank0 的编程限制ob_unlock();   //  解除 可选字节 的编程限制ob_erase();        // 可选字节擦除 这里上电默认为 A5 5A FF FF FF ... 所以这里直接整个擦除了res = ob_security_protection_config(ob_spc);   // 启停保护功能ob_lock();     // 退出 可选字节 编辑态fmc_lock();       // 退出 bank0 编辑态return res;
}

测试方法

测试过程中,由于 SPC 字节仅支持用户代码修改,所以在代码中加入了某一 IO 电平检测,并修改 SPC 字节的代码,这里简单分享下:

 static uint8_t time1 = 0, time2 = 0;if(GetInputStatus(oneIO) > 0){time2 = 0;if(time1 == 0){time1++;ob_security_protection_config(FMC_USPC);}}else{time1 = 0;if(time2 == 0){time2++;ob_security_protection_config(FMC_NSPC);}}

现象说明

  1. 在开启读保护后,jflash工具可连接,但是无法读取主存,最终会提示超时:


2. 可通过 Jlink Commander 来查看 SPC 字节内容:

这里的是为开启读保护时方位到的可选字节的数据,当加锁后,读取的值会变为:

BB 44 FF FF FF FF FF FF FF FF FF FF FF FF FF FF

此时需要重启生效;
3. 运行过程中,触发解锁信号,会立即导致整片立马被擦除,产品看起来是卡死,但是此时 MCU 是支持读写的,类似于恢复出厂设置了;

整体分析

  1. 由于关闭读保护后会立马擦除整片数据,所以此功能风险过大,考虑其它防复制方案。
  2. 在开启读保护情况下,进行 IAP 的话,会导致芯片在读保护的状态下是会自锁且无法退出读保护的,只能通过联系原厂支援以退出芯片读保护,这里也可以参考《嵌入式 - GD32读保护解除》;

进一步测试

后面尝试了将 SWJ 重映射来实现防复制的目的,参考《GD32 SWJ调试接口关闭》添加链接描述。

嵌入式 -固件防复制系列【1】GD32代码读保护相关推荐

  1. 嵌入式 - 固件防复制系列【3】GD32读保护解除

    GD32读保护解除 引言 解除读保护 可以通信的情况下 现象描述 jlinkCommander 结果 无法通信的情况下 核心代码 辅助脚本代码 执行结果 总结 更新历史 20220303: 首次编辑并 ...

  2. 嵌入式linux防复制,嵌入式linux /dev 下的文件无法复制

    嵌入式linux /dev 下的文件无法复制 关注:234  答案:4  mip版 解决时间 2021-02-06 06:27 提问者一段小時光 2021-02-06 00:38 root下也有文件不 ...

  3. 嵌入式linux防复制,嵌入式linux中DFB+GTK的移植

    这个模块编译下面的编译基本都需要以下三个 export LDFLAGS=-L$PREFIX/lib export CFLAGS="-g -I$PREFIX/include" exp ...

  4. 个人收藏系列之360个人图书馆 轻松解除网页防复制难题

    关于360个人图书馆,解除网页防复制难题 1.前言 博主有的时候经常被人问,360个人图书馆里面的那些比较好的文章,不能直接复制某些段落来使用,经常需要登录,好麻烦. 想必用过360个人图书馆的人都知 ...

  5. php防复制代码,WordPress文章防复制代码

    通过下面的JS代码,可以有效地防止别人直接复制拷贝你的文章,用frame标签引用你的文章时,会自动跳转到文章正常链接,同时禁止右键菜单. 使用方法一: 打开当前主题头部模板header.php找到:& ...

  6. 防复制html,代码实现网站防复制,防采集

    自己建好了网站,但是如果不做处理,自己网站上的内容很容易被别人复制到其它网站上,对于自己网站的SEO优化不利. 更有甚者,很多人采用采集软件疯狂的采集我们网站内容,不但窃取了我们网站的内容,而且还严重 ...

  7. 【嵌入式】工程模板的编写以及工程代码的理解

    [嵌入式]工程模板的编写以及工程代码的理解 21/100 保存草稿 发布文章 weixin_52621323 未选择文件 文章目录 1)前言 2)STM32工程模板(基于标准库) -- 野火版本 2. ...

  8. 虹科方案 | 虹科Vdoo安全平台:CVE-2020-25860 - 在 RAUC 嵌入式固件更新框架中发现的重大漏洞

    虹科Vdoo安全研究团队不断研究领先的嵌入式设备及其供应链,在RAUC 嵌入式固件更新框架中发现的重大漏洞. CVE-2020-25860是一个潜在的严重漏洞,其在RAUC (一个用于固件更新的开源框 ...

  9. 最佳实践系列:前端代码标准和最佳实践

    最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...

最新文章

  1. linux centos7 createrepo 创建本地 yum 仓库
  2. iptables nat实验_【零基础学云计算】LVS负载均衡群集之NAT模式搭建 (实践篇)...
  3. 最近公共祖先_leetcode No.236 二叉树的最近公共祖先
  4. 语言五子棋无ai程序框图_2020输入法报告 如何选择更好的AI语音输入法?
  5. mysql 社区版密码如何修改_如何用优雅的方法修改MySQL root密码
  6. prototype.js 源码解读v1.3.1版本
  7. 大并发下Timeout waiting for connection from pool 解决方案
  8. 实体经济不改变经营思路和销售模式
  9. I.MX6 U-boot Kernel backlight setting
  10. 文件——rstrip() 、lstrip()和 strip()、zip() 函数
  11. time(null)的用法
  12. Executors 工具类,三大方法
  13. 工作基本功:问题解决不了或不满意,不要重复,应该向上级反映或投诉
  14. ESP8285调试记录
  15. 【Simscape】用Simscape实现三维物理仿真(二)——创建一个斜坡滚球系统
  16. 怎样提高计算机内存,电脑物理内存不足怎么提高 电脑物理内存占用过高的解决方法...
  17. Winform VS2022解决:自定义控件类库没在工具箱出现问题
  18. Win10远程桌面,用户账户无效的解决方法
  19. 【Linux】ubuntu16.04/18.04安装I219-V有线网卡驱动
  20. 软件测试流程(萌新专属)【超详细】-酸奶公园

热门文章

  1. Vulkan再探(12):输入附件
  2. php快手开发平台api签名
  3. OJ每日一练——人口增长问题
  4. 生成学习算法.高斯判别分析(GDA).GDA与Logistic模型
  5. 计算机排名次怎么操作,Excel表格怎么排名次?
  6. 利用 Itchat 实现微信群发和关键词自动回复
  7. Head First Python(定制数据对象)
  8. 算法第四版学习(chapter1.3)
  9. windows定时运行exe文件
  10. 今日金融词汇---仓位,是什么?