对运行于STM32的嵌入式代码程序进行加密

发布者:Tiger8最新更新时间:2016-10-18 来源: eefocus关键字:STM32  代码程序  加密 手机看文章 扫描二维码
随时随地手机看文章
目的:对运行于STM32的嵌入式代码程序进行加密

编译环境:IAR Embedded System for ARM5.5

一.STM32Flash组织

STM32的Flash包括主存储器(HD版本,512KB)+信息块。信息块包括2KB的系统存储器(用于系统自举启动代码)和16字节的选项字节(8个字节数据+8个字节数据的反码)。

 二、STM32读保护

STM32读保护是通过设置RDP选项字节,然后在系统重新复位加载了新的RDP选项字节后启动的。当保护字节被写入相应的值以后:

●通过从内置SRAM或FSMC执行代码访问主闪存存储器的操作,通过DMA1、DMA2、JTAG、SWV(串行线观察器)、SWD(串行线调试)、ETM和边界扫描方式对闪存的访问都将被禁止。

●只允许从用户代码中对主闪存存储器的读操作(以非调试方式从主闪存存储器启动)。

●第0~3页(小容量和中容量产品),或第0~1页(大容量和互联型产品)被自动加上了写保护,其它部分的存储器可以通过在主闪存存储器中执行的代码进行编程(实现IAP或数据存储等功能),但不允许在调试模式下或在从内部SRAM启动后执行写或擦除操作(整片擦除除外)。

●所有通过JTAG/SWD向内置SRAM装载代码并执行代码的功能依然有效,亦可以通过JTAG/SWD从内置SRAM启动,这个功能可以用来解除读保护。当读保护的选项字节转变为存储器未保护的数值时,将会执行整片擦除过程。

●可以使用系统启动程序解除读保护(此时只需执行系统复位即可重新加载选项字节),芯片自动擦除Flash所有内容。

 三.STM32的加密

1.使用系统启动程序STM32 Flash Loader demonstrator将Flash设置为读保护。

所有以调试工具、内置SRAM或FSMC执行代码等方式对主存储器访问的操作将被禁止,只允许用户代码对主Flash存储器的读操作和编程操作(除了Flash开始的4KB区域不能编程)。用户代码允许自主编程可以实现IAP或者数据存储等功能。

这样破解者将不能用调试工具、内置SRAM或者FSMC执行代码等方式读出Flash中的代码。破解者也不能使用系统启动程序读取代码,因为要解除读保护,将执行整个芯片的擦除操作。

2.主程序中使用设备ID保护

    即使将Flash设置为读保护,破解者也可以通过IAP下载自己的一段小程序,从而读出Flash中的内容。因此,还需要利用设备的唯一ID进行加密保护。在主程序中,加入对设备唯一ID的检测,这样即使破解者读出了芯片中的二进制码,也不能用这个二进制码去复制新的器件。具体实现方法:

    (1)在应用程序中定义1个(32位甚至更多)const变量,变量值全为0xFF。每次启动程序时,检查const变量值如果全为0xFF,就读器件的唯一ID,通过Flash编程写入该const变量中(因为全是0xFF,所以可以编程写入)。

    (2)在程序中多个地方检查const变量,如果变量值不为0xFF并且与设备ID不一致,就执行与功能无关代码(比如自擦除)。

    这样,即使破解者读出了芯片中的二进制码,因为这份二进制码包含了设备唯一ID,具有唯一性,所以不能复制到其他芯片中。

    为了避免破解者利用反汇编,根据芯片ID数据在二进制文件中查找对应相同数据的位置从而破解,可以将ID拆散成不同的组合,并且写到不同且不连续的地方。更进一步,可在程序中检测多份这样的分散ID,以增加反汇编的难度。或者将CPUID进行加密,Flash中存储加密后的结果。

 四.程序加密的实现

01.//加密后的CPUID  
02.volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;  
03.  
04.//写入加密数据  
05.void WriteEncrypt(void)  
06.{   
07.    //第一次烧写:将UID写入到Flash中  
08.    if(CPUIDEncrypt==0xFFFFFFFF)  
09.   {  
10.        uint32_t CpuID[3];         
11.        //获取CPU唯一的ID  
12.        CpuID[0]=*(vu32*)(UID_BASE);  
13.        CpuID[1]=*(vu32*)(UID_BASE+4);  
14.        CpuID[2]=*(vu32*)(UID_BASE+8);          
15.  
16.        //加密算法,很简单的加密算法  
17.        uint32_t EncryptCode=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);     
18.        FLASH_Unlock();  
19.        FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);  
20.        FLASH_ProgramWord((uint32_t)&CPUIDEncrypt, EncryptCode);  
21.        FLASH_Lock();  
22.    }  
23.}  
24.//判断加密  
25.bool JudgeEncrypt(void)  
26.{         
27.    uint32_t CpuID[4];         
28.    //获取CPU唯一的ID  
29.    CpuID[0]=*(vu32*)(UID_BASE);  
30.    CpuID[1]=*(vu32*)(UID_BASE+4);  
31.    CpuID[2]=*(vu32*)(UID_BASE+8);      
32.    //加密算法,很简单的加密算法  
33.    CpuID[3]=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);     
34.    //检查Flash中的UID是否合法   
35.    return (CPUIDEncrypt == CpuID[3]);  
36.} 


1、将写入加密数据和判断加密两个功能分开。写入加密在PrsCtrlTask开始的地方;而判断加密分布到程序的各个角落。

2、非常重要的是CPUID加密值的定义一定要加“volatile”类型:

volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;

否则按速度优化编译,在判断加密值,不会重新读取加密值,导致判断出错。

3、在工程选项Options->Debugger->Download中选择: use flash loader

否则主程序中对Flash编程将不成功。


关键字:STM32  代码程序  加密 引用地址:对运行于STM32的嵌入式代码程序进行加密

上一篇:STM32与LPC1700的应用比较
下一篇:关于STM32定时器16位拓展32位的探讨

推荐阅读最新更新时间:2024-03-16 15:15

stm32学习之五
按键输入的学习(key_polling): 目标:通过按键的输入,实现LED灯的反转等操作。 要实现按键的输入的读取,必须要实现一个key.c和key.h的文件的编写,这里,利用库函数的编写原则(仿照 库函数的编写方法),获取按键的动作。 首先,编写key.h函数: #ifndef _KEY_H #define _KEY_H #include stm32f10x.h #define KEY_ON 0 #define KEY_OFF 1 void key_Init(void); uint8_t key_Scan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin ); void de
[单片机]
STM32开启ADC转换
ADON,第一次设置的时候,可以唤醒ADC。 第二次设置ADON,即可执行ADC转换。 所以 对于开启ADC转换,有两种方法:1,可以通过设置ADON开启;2,通过其他触发条件。
[单片机]
<font color='red'>STM32</font>开启ADC转换
stc单片机自动下载程序原理和代码实现
1/stc单片机下载程序的原理 首先我们要理解stc单片机下载程序的原理。在stc单片机中有两个程序区:用户程序区和ISP监控程序区。 这是stc89c52单片机数据手册中的内容。 根据数据手册,我们可以知道,当冷启动或者对ISP_CONTR寄存器送入60H产生复位以后,单片机会从ISP监控程序区开始执行程序。 如果这时候检测到合法的ISP下载命令流(后面会说什么是ISP的合法下载流),则ISP监控程序开始与ISP下载软件通信(如stc-isp),软件也会进入编程模式,向监控程序发送程序码,监控程序接收程序码,并将其写入用户程序区中。成功后,用户程序立即生效,开始运行用户程序。 如果这时候没有检测到合法的ISP下载命
[单片机]
stc单片机自动下载<font color='red'>程序</font>原理和<font color='red'>代码</font>实现
从零开始一起学stm32(十二)---SPI协议
SPI通信 -- W25Q64 -- flash芯片的使用 1、通信协议 2、SPI通信 3、STM32中SPI控制器的使用 4、W25Q64的操作过程以及软件编程 1.通信协议: 协议:两个相互通信的设备之间,进行数据传输的一种规定! 1.串口通信-- 物理层 所接管脚:TX(发送管脚) RX(接收管脚) GND(接地) 数据链接层---RS232协议 开始位+数据位+奇偶校验位+停止位 1 5~8 1 1 1.总线在发送或接收前应处于空闲状态--没有数据传输时,总线处于高电平状态! 2.开始位:要发送数据时,先发送一个低电平信号,这个信号叫开始信号,表示开
[单片机]
从零开始一起学<font color='red'>stm32</font>(十二)---SPI协议
STM32 ST-LINK Utility安装下载程序配置
一,官方下载地址: http://www.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link004.html 二,ST-LINK Utility简介 STM32 ST-LINK Utility工具在产品开发过程中测试一些其他版本的代码,可以直接下载hex,而不用打开工程再编译去下载。 当你开发完一个STM32产品,需要量产的时候,就可以用这个工具直接下载hex代码,对代码加密(读保护)。 ST-LINK V2两种不同版本接口管脚信息: STM32 ST-LINK Utility软件包含S
[单片机]
<font color='red'>STM32</font> ST-LINK Utility安装下载<font color='red'>程序</font>配置
STM32 休眠模式下如何喂狗?
在STM32开发中经常会用到独立看门狗(IWDG)和低功耗模式,看门狗是为了检测和解决由软件错误引起的故障,低功耗模式是为了在CPU不需要继续运行时进入到休眠模式用以节省电能。其中独立看门狗的时钟由独立的RC振荡器(STM32F10x一般为40kHz)提供,即使在主时钟出现故障时,也仍然有效,因此可以在停止和待机模式下工作。而且独立看门狗一旦启动,除了系统复位,它不能再被停止。但这样引发的一个问题是当MCU进入到低功耗模式后由于CPU停止运行无法喂狗,会导致系统频繁复位。那如何解决这个问题呢,难道独立看门狗和低功耗模式没法同时使用? 一个很好的方式是在休眠模式下通过RTC定时唤醒来喂狗,喂完够在进入继续进入到休眠模式。比如看门狗复
[单片机]
STM32之复位和系统时钟
首先明白复位是一个很重要的部分,复部分设计的好坏关系到整个系统的稳定。一般来说,STM32F10系列芯片都具有系统复位,电源复位和备份区域复位。这里分开说明三种复位的基本知识点。 系统复位中,系统复位将复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器以外的所有寄存器,以下事件中的一件发生都会产生一个复位时钟: 1.NRST管脚上的低电平(外部复位); 2.窗口看门狗计数终止(WWDG复位); 3.独立看门狗记数终止(IWDG复位); 4.软件复位(SW复位); 5.低功耗管理复位。 其他两种复位方式这里不再赘述。 在时钟系统中,以下3种不同的时钟可被用来驱动系统时钟(SYSCLK) 1.HSI振荡器时钟 2.HSE振荡器
[单片机]
stm32定时器优先级
什么是优先级   优先级是具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。   当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 stm32定时器优先级   STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断通道都具备自己
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved