嵌入式 -固件防复制系列【1】GD32代码读保护
GD32代码读保护
- 引言
- 手册介绍
- 芯片内存结构
- 闪存操作说明
- 可选字节块说明
- 功能生效条件
- 安全保护功能说明
- 代码实现
- 保护功能开启
- 测试方法
- 现象说明
- 整体分析
- 进一步测试
更新历史
- 20220227
首次编辑和发布,描述了 GD32F303 MCU 的安全保护功能和初步测试结果;- 20220303
添加了进一步测试的结果;
引言
公司产品换料,使用了 GD32F3 系列的 MCU,客户要求对代码进行读保护,再查看用户手册时,看到了其提供的“安全保护”,就想通过实验来看下实际效果;
手册介绍
这里从 GD32F303 的用户手册摘录关键信息:
芯片内存结构
图1 内存基本分配表
这里我们需要注意的是,这里的主存分为了 bank0, bank1. bank0 的页大小为 2KB 每页,bank1 的大小为 4KB 每页;
且存在信息块和可选字节块,这个可选字节块也是和我们想要做的读保护息息相关的;
这里我们先明确,启用读保护功能是需要设置 可选字节块的,所以下面我们围绕可选字节块进行展开。
闪存操作说明
我们知道,常规内存编程前需要进行一定的动作,擦除、解锁等操作,这里是通过 两层解锁和先擦除后编程的:
图2 内存控制说明
通过图 2 中,我们可以得知以下关键信息:
- 内存操作前需要解锁,解锁的方式是向指定寄存器 FMC_KEY0 中写入键值;
- 可选字节的编程,是需要两层解锁的,即 FMC bank0 解锁后,还要对 FMC_OBKEY 寄存器写入相应键值解锁 可选字节寄存器的编程权限;
可选字节块说明
功能生效条件
每次系统复位后,闪存的可选字节块被重加载到FMC_OBSTAT和FMC_WP寄存器,可选字节生效。可选字节的补字节具体为可选字节取反。当可选字节被重装载时,如果可选字节的补字节和可选字节不匹配,FMC_OBSTAT寄存器的OBERR位将被置1,可选字节被强制设置为0xFF。若可选字节和其补字节同为0xFF,则OBERR位不置位。
上述我们可提取到关键信息:
- 开启读保护后,至少需要系统复位;
- 复位后检测信息不匹配后,可选字节会被强制擦除;
可选字节的具体含义见下图:
图3 可选字节块说明
安全保护功能说明
图4 安全保护功能说明
从图 4 的说明中我们可知:
- 从未保护模式下修改 SPC 字节后,需要复位后生效读保护功能:若是用户代码修改,则需要系统复位使其生效;若是调试模式下修改,则需要上电复位。
- 安全模式下,想要关闭保护态,仅能从用户代码从修改;
- 安全模式下,主存的前 4KB 不可擦除,也就是 bank0 的前两页;【如果 IAP 这里的话,是会失效的】。
- 安全模式下,任何启动方式下的读主存都失效;
- 安全模式下,可修改 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);}}
现象说明
- 在开启读保护后,jflash工具可连接,但是无法读取主存,最终会提示超时:
2. 可通过 Jlink Commander 来查看 SPC 字节内容:
这里的是为开启读保护时方位到的可选字节的数据,当加锁后,读取的值会变为:
BB 44 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
此时需要重启生效;
3. 运行过程中,触发解锁信号,会立即导致整片立马被擦除,产品看起来是卡死,但是此时 MCU 是支持读写的,类似于恢复出厂设置了;
整体分析
- 由于关闭读保护后会立马擦除整片数据,所以此功能风险过大,考虑其它防复制方案。
- 在开启读保护情况下,进行 IAP 的话,会导致芯片在读保护的状态下是会自锁且无法退出读保护的,只能通过联系原厂支援以退出芯片读保护,这里也可以参考《嵌入式 - GD32读保护解除》;
进一步测试
后面尝试了将 SWJ 重映射来实现防复制的目的,参考《GD32 SWJ调试接口关闭》添加链接描述。
嵌入式 -固件防复制系列【1】GD32代码读保护相关推荐
- 嵌入式 - 固件防复制系列【3】GD32读保护解除
GD32读保护解除 引言 解除读保护 可以通信的情况下 现象描述 jlinkCommander 结果 无法通信的情况下 核心代码 辅助脚本代码 执行结果 总结 更新历史 20220303: 首次编辑并 ...
- 嵌入式linux防复制,嵌入式linux /dev 下的文件无法复制
嵌入式linux /dev 下的文件无法复制 关注:234 答案:4 mip版 解决时间 2021-02-06 06:27 提问者一段小時光 2021-02-06 00:38 root下也有文件不 ...
- 嵌入式linux防复制,嵌入式linux中DFB+GTK的移植
这个模块编译下面的编译基本都需要以下三个 export LDFLAGS=-L$PREFIX/lib export CFLAGS="-g -I$PREFIX/include" exp ...
- 个人收藏系列之360个人图书馆 轻松解除网页防复制难题
关于360个人图书馆,解除网页防复制难题 1.前言 博主有的时候经常被人问,360个人图书馆里面的那些比较好的文章,不能直接复制某些段落来使用,经常需要登录,好麻烦. 想必用过360个人图书馆的人都知 ...
- php防复制代码,WordPress文章防复制代码
通过下面的JS代码,可以有效地防止别人直接复制拷贝你的文章,用frame标签引用你的文章时,会自动跳转到文章正常链接,同时禁止右键菜单. 使用方法一: 打开当前主题头部模板header.php找到:& ...
- 防复制html,代码实现网站防复制,防采集
自己建好了网站,但是如果不做处理,自己网站上的内容很容易被别人复制到其它网站上,对于自己网站的SEO优化不利. 更有甚者,很多人采用采集软件疯狂的采集我们网站内容,不但窃取了我们网站的内容,而且还严重 ...
- 【嵌入式】工程模板的编写以及工程代码的理解
[嵌入式]工程模板的编写以及工程代码的理解 21/100 保存草稿 发布文章 weixin_52621323 未选择文件 文章目录 1)前言 2)STM32工程模板(基于标准库) -- 野火版本 2. ...
- 虹科方案 | 虹科Vdoo安全平台:CVE-2020-25860 - 在 RAUC 嵌入式固件更新框架中发现的重大漏洞
虹科Vdoo安全研究团队不断研究领先的嵌入式设备及其供应链,在RAUC 嵌入式固件更新框架中发现的重大漏洞. CVE-2020-25860是一个潜在的严重漏洞,其在RAUC (一个用于固件更新的开源框 ...
- 最佳实践系列:前端代码标准和最佳实践
最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...
最新文章
- linux centos7 createrepo 创建本地 yum 仓库
- iptables nat实验_【零基础学云计算】LVS负载均衡群集之NAT模式搭建 (实践篇)...
- 最近公共祖先_leetcode No.236 二叉树的最近公共祖先
- 语言五子棋无ai程序框图_2020输入法报告 如何选择更好的AI语音输入法?
- mysql 社区版密码如何修改_如何用优雅的方法修改MySQL root密码
- prototype.js 源码解读v1.3.1版本
- 大并发下Timeout waiting for connection from pool 解决方案
- 实体经济不改变经营思路和销售模式
- I.MX6 U-boot Kernel backlight setting
- 文件——rstrip() 、lstrip()和 strip()、zip() 函数
- time(null)的用法
- Executors 工具类,三大方法
- 工作基本功:问题解决不了或不满意,不要重复,应该向上级反映或投诉
- ESP8285调试记录
- 【Simscape】用Simscape实现三维物理仿真(二)——创建一个斜坡滚球系统
- 怎样提高计算机内存,电脑物理内存不足怎么提高 电脑物理内存占用过高的解决方法...
- Winform VS2022解决:自定义控件类库没在工具箱出现问题
- Win10远程桌面,用户账户无效的解决方法
- 【Linux】ubuntu16.04/18.04安装I219-V有线网卡驱动
- 软件测试流程(萌新专属)【超详细】-酸奶公园