嵌入式 您所在的位置:网站首页 esp32防止破解 嵌入式

嵌入式

2023-08-10 12:05| 来源: 网络整理| 查看: 265

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调试接口关闭》添加链接描述。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有