打印
[G32A]

G32A FLASH后门密钥使用介绍

[复制链接]
97|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lengrudie|  楼主 | 2024-11-11 17:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lengrudie 于 2024-11-11 17:18 编辑

       在使用芯片做产品的时候,都希望能够保护自己的代码不被人恶意读取和更改,这就需要使能芯片的安全模式。0x400-0x40F地址区域是一个专门的16字节配置区域用来存储安全、保护及MCU启动的一些配置信息,如果使能安全模式下禁用了大规模擦除功能,就等于是禁用了调试仿真功能。但后门密钥用来临时解除安全性,这里只是为了讲解后门密钥的使用,测试过程中不禁用大规模擦除,以防误锁芯片。
       如果要启动安全模式并且禁用大规模擦除,此时调试接口禁用,只能用我之前介绍的方法了,感兴趣的可以看一下解密偏方:
       https://bbs.21ic.com/icview-3397496-1-1.html


       下面进入正题。

一、加密相关配置字
G32A1xx的配置字,以G32A1445为例,如下:

       BackDoorKey0-BackDoorKey7是后门秘钥字节
       PFPRO0-PFPRO3是四字节程序闪存保护字节
       DFPRO是DFLASH保护字节
       EEPRO是EEPROM保护字节
       NOPT是非易失性选项字节
       SEC是加密字节


1、加密字节SEC写入 0xEC
     禁用后门秘钥访问b11;禁止大规模擦除b10;使能内存内容访问b11;为加密状态b00
2、执行指令擦除
     FLASH_EraseAllBlock(&flashSSDConfig);


二、 后门加解密
1、 加密字节SEC写入 0x8C
     启用后门秘钥访问;启用大规模擦除b00;使能内存内容访问;为加密状态

2、后门秘钥设置
     如写 0xFEDCBA9876543210 作为解密秘钥
BackDoorKey0    EQU    0x10
BackDoorKey1    EQU    0x32
BackDoorKey2    EQU    0x54
BackDoorKey3    EQU    0x76
BackDoorKey4    EQU    0x98
BackDoorKey5    EQU    0xBA
BackDoorKey6    EQU    0xDC
BackDoorKey7    EQU    0xFE


3、用后门秘钥解密
     芯片复位后, 进入加密模式,可通过后门秘钥临时退出安全模式,SDK函数如下:

STATUS_T FLASH_SecurityByPass(constFLASH_SSD_CONFIG_T *ssdCfg, const uint8_t *keyBuffer)
{
   STATUS_T returnValue;
   uint32_t temp;   /* Temporaryvariable */
   uint8_t i;

   /* Check OCI** to verify the previous command is completed */
   if(0U != (FLASH->STS.reg & 0x80U)>>7U)
   {
       /* Clear COLE** & ACCE** & PROV** flag in flash statusregister. Write 1 to clear */
       FLASH->STS.reg = (uint8_t)0x70U;

       /* Passing parameter to thecommand */
       FLASH->CCMDDATA0.reg = FTFx_SECURITY_BY_PASS;
       for (i = 0U; i < 8U; i++)
       {
            temp = FLASH_BASE + i + 0x08U;
            *(uint8_t *)temp = keyBuffer;
       }

       returnValue = FLASH_CommandSequence(ssdCfg);
   }
   else
   {
       returnValue = STATUS_BUSY;
   }

   return returnValue;
}
       在代码上增加一个功能,要在程序里有一个隐藏的串口或其它通信接口指令可以执行,通过其它通信控制执行如下:
       const uint8_t backdoor_key[8] = {0x10,0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE};
       FLASH_SecurityByPass(&flashSSDConfig,backdoor_key);

      此时加密字节SEC写入的0x8C变为0x8E,释放安全性,芯片复位后SEC字节又为0x8C。


这里只是介绍方法,使用场景千千万,各有各的使用方式,这里就不举例了!欢迎大家讨论!

使用特权

评论回复
沙发
问天少年| | 2024-11-12 21:49 | 只看该作者
芯片的安全模式用起来感觉好麻烦,是不是有函数可以直接调用啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

49

帖子

1

粉丝