CN112100624A - 一种固件保护方法、装置及终端设备 - Google Patents
一种固件保护方法、装置及终端设备 Download PDFInfo
- Publication number
- CN112100624A CN112100624A CN202010858420.9A CN202010858420A CN112100624A CN 112100624 A CN112100624 A CN 112100624A CN 202010858420 A CN202010858420 A CN 202010858420A CN 112100624 A CN112100624 A CN 112100624A
- Authority
- CN
- China
- Prior art keywords
- file
- firmware
- area
- encrypted
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/572—Secure firmware programming, e.g. of basic input output system [BIOS]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/602—Providing cryptographic facilities or services
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/606—Protecting data by securing the transmission between two devices or processes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/654—Updates using techniques specially adapted for alterable solid state memories, e.g. for EEPROM or flash memories
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/21—Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/2107—File encryption
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Storage Device Security (AREA)
Abstract
本申请实施例适用于芯片技术领域,提供了一种固件保护方法、装置及终端设备,所述方法包括:对固件代码进行编译,得到第一文件和待加密文件,并对所述待加密文件进行加密,得到第二文件;将所述第一文件和所述第二文件合并为固件升级包,并将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。采用上述方法,可以提高固件的安全性,保障芯片安全。
Description
技术领域
本申请属于芯片技术领域,特别是涉及一种固件保护方法、装置及终端设备。
背景技术
目前,针对微控制单元(microcontroller unit,MCU)的加密保护方式大多依赖于硬件的保护。这种保护方式主要是读写保护,比较依赖芯片厂商的设计能力,可以防止攻击者从MCU内部将固件读取出来。但是,随着技术的进步,各种芯片破解方法层出不穷,越来越多的芯片被破解。虽然这种保护方式操作简便,但对于开发者来说,并没有什么发挥的空间,一旦芯片被破解,那么用户的固件就完全暴露了。
除读写保护外,也有一些保护方式是在升级固件之前,先对固件进行加密,并在升级的过程中使用密文传输,MCU接收到固件后再进行解密。这种保护方式主要是针对传输过程的保护,但最终保存在存储中的内容仍然是明文的。攻击者可以通过破解芯片拿到固件数据,或者在升级过程中截取加密的固件,在破解后,通过逆向工程得到用户的源码。因此,这种保护方式的实际保护效果也并不理想。
发明内容
有鉴于此,本申请实施例提供了一种固件保护方法、装置及终端设备,以解决现有技术中针对MCU的保护,保护效果不佳的问题。
本申请实施例的第一方面提供了一种固件保护方法,包括:
对固件代码进行编译,得到第一文件和待加密文件,并对所述待加密文件进行加密,得到第二文件;
将所述第一文件和所述第二文件合并为固件升级包,并将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
本申请实施例的第二方面提供了一种固件保护装置,包括:
编译模块,用于对固件代码进行编译,得到第一文件和待加密文件;
加密模块,用于对所述待加密文件进行加密,得到第二文件;
合并模块,用于将所述第一文件和所述第二文件合并为固件升级包;
烧录模块,用于将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
升级模块,用于在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
本申请实施例的第三方面提供了一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述第一方面所述的固件保护方法。
本申请实施例的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上述第一方面所述的固件保护方法。
本申请实施例的第五方面提供了一种计算机程序产品,当所述计算机程序产品在终端设备上运行时,使得所述终端设备执行上述第一方面所述的固件保护方法。
与现有技术相比,本申请实施例包括以下优点:
本申请实施例,通过对固件代码进行编译,可以得到第一文件和待加密文件,在对待加密文件进行加密得到第二文件后,可以将第一文件和第二文件合并为固件升级包。上述固件升级包被烧录至微控制单元后,通过运行固件升级包,可以实现对芯片的升级。具体地,在采用固件升级包对芯片进行升级时,可以在闪存中运行第一文件,在随机存取存储器中运行第二文件。本申请实施例的升级过程采用密文传输,能够有效降低传输过程中固件被盗取的可能性;此外,通过将固件中的未加密文件和加密文件分别放入闪存和随机存取存储器中运行,保证加密文件在闪存中始终处于加密状态,只有在随机存取存储器中运行时才解密,进一步提高了固件升级包的安全性,保证了芯片安全。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种固件保护方法的步骤流程示意图;
图2是本申请实施例提供的一种固件升级包合并过程示意图;
图3是本申请实施例提供的一种固件升级包烧录过程示意图;
图4是本申请实施例提供的一种固件升级包解密过程示意图;
图5是本申请实施例提供的一种固件保护装置的示意图;
图6是本申请实施例提供的一种终端设备的示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定***结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域技术人员应当清楚,在没有这些具体细节的其他实施例中也可以实现本申请。在其他情况中,省略对众所周知的***、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。
为了便于理解,首先对几种可能的固件保护方式作一说明。
1、利用硬件读写保护功能对固件进行保护
在选项字节(option byte)里有读保护和写保护的相关设置位,通过对不同的设置位进行设置,可以利用硬件本身提供的读写保护功能,对固件进行保护。
通常,读保护分为三个不同的等级,即Level 0、Level1和Level2。其中,Level 0是没有保护;Level 1是读保护,通过设置Level 1等级的保护,可以禁止使用调试功能,防止攻击者通过调试工具读取片内存储器的数据;Level 2是全芯片保护,在设置Level 2等级的保护后,可以禁止调试功能,同时禁止从随机存取存储器(Random Access Memory,RAM)启动,不仅可以防止攻击者通过调试工具读取片内存储器的数据,还可以防止攻击者通过将攻击代码写入RAM来执行反向读取闪存(FLASH)的代码。其中的写保护可以分扇区进行设置,如果某个扇区开启了写保护,则攻击者无法将数据写入相应的扇区。
由于写保护对读取固件是没有影响的,要保护固件的安全,就必须要设置读保护。但是如果只设置读保护,那么攻击者就可以通过写入攻击代码来读取已有的固件。因此,必须要同时设置读写保护才能真正地对固件起到保护的作用。如前所述,通过设置读写保护功能来保护固件的安全主要依赖芯片厂商的设计能力,但随着技术的进步,各种芯片破解方法层出不穷,越来越多的芯片被破解。虽然利用硬件读写保护功能对固件进行保护操作简便,但该方式无法有效地对固件进行保护。
2、利用引导加载程序(bootloader)引导加密的方式对固件进行保护
采用这种方式对固件进行加密需要将固件划分为bootloader和应用程序(app)两部分。其中,bootloader是引导程序,用于下载更新app,产品的功能主要通过app来实现。若采用这种方式对固件进行加密,可以首先使用app程序编译产生app固件,再通过个人计算机(personal computer,PC)上的加密工具对app固件进行加密,然后将密文传输给MCU。MCU接收到加密后的固件后,可以通过bootloader对密文进行解密,并烧录到app区。
如前所述,这种保护方式主要是在升级过程中起到保护的作用,升级完成后,固件仍然是以明文的方式保存在片内FLASH中。攻击者可以通过破解芯片拿到固件数据,或者在升级过程中截取经过加密的固件并破解,从而可以通过逆向工程得到用户的源码。该方式的实际保护效果并不理想。
因此,针对上述问题,本申请实施例提供了一种针对固件的全方位的保护方案。由于对于需要长期维护的产品,在该产品投放市场后难免需要不定期地更新升级,特别是在现今万物互联的时代,通过云升级的方式更是一种非常方便、高效且常见的升级解决方案。既然需要升级那就需要传输固件数据,因此本申请实施例提供的保护方案可以从固件升级开始,升级过程传输的数据经过加密被传输至MCU内部后,除了依赖MCU本身的安全保护机制,还可以针对固件本身进行防护,将固件的执行空间划分成FLASH空间和RAM空间,使得加密代码在FLASH中始终保持加密状态,只有在执行时,才对加密代码进行解密并将其放在RAM中执行。
需要说明的是,由于MCU本身的安全机制是由芯片厂商所决定的,开发者除了设置开启或者不开启相应的保护功能外,并没有更多的操作空间。因此本申请实施例提供的保护方案不讨论芯片的读写保护功能的设置问题,而是从软件层面讨论如何加强在升级传输过程中,以及最终的固件在芯片内部的安全机制,防止攻击者窃取到固件数据后直接进行逆向工程。
下面通过具体实施例来说明本申请的技术方案。
参照图1,示出了本申请实施例提供的一种固件保护方法的步骤流程示意图,具体可以包括如下步骤:
S101、对固件代码进行编译,得到第一文件和待加密文件,并对所述待加密文件进行加密,得到第二文件;
在软件开发领域,用于对产品进行升级的固件,通常都是通过对相应的软件代码进行编译得到的。因此,本申请实施例中的固件代码可以是指由开发人员编写的,在编译得到相应的固件后,通过上述固件可以对芯片进行升级的一系列的软件代码。
在本申请实施例中,为了提高固件以及芯片的安全性,可以将固件代码划分为无需保密处理的第一代码段和需要进行保密处理的第二代码段。上述第一代码段和第二代码段经过编译处理后,分别可以得到相应的固件文件。
在具体实现中,可以通过对编译器进行配置,使得上述第一代码段和第二代码段分别存储于不同的存储区。例如,第一代码段存储于预设的第一存储区,第二代码段存储于预设的第二代码区。第一代码区和第二代码区分别与不同的执行区对应。从而在对固件代码进行编译时,可以在与第一存储区对应的第一执行区内执行第一代码段,得到第一文件;在与第二存储区对应的第二执行区内执行第二代码段,得到待加密文件。
需要说明的是,针对不同类型的芯片以及开发平台,将固件代码划分为不同的代码段并编译得到不同的文件,可以通过多种方式实现,本申请实施例对此不作限定。
由于第二代码段是需要保密处理的,因此在对第二代码段进行编译得到相应的文件后,可以对该文件进行加密,得到第二文件。
在本申请实施例中,对待加密文件进行加密可以根据实际需要选用多种加密方式,本申请实施例对具体的加密过程不作限定。
S102、将所述第一文件和所述第二文件合并为固件升级包,并将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
在完成对固件代码的编译以及相应文件的加密后,可以将第一文件和第二文件合并成一个新的文件,这个新的文件就是用于对芯片进行升级的固件升级包。
在本申请实施例中,可以首先创建目标文件,通过将第一文件和第二文件写入新创建的目标文件中,可以得到相应的固件升级包。
在具体实现中,在将第一文件和第二文件写入新创建的目标文件中时,可以首先确定第一文件的大小和第二文件的大小,并根据第一文件的大小,确定第二文件在目标文件中的偏移位置;然后将文件标识、第一文件的大小、第二文件的大小和上述偏移位置等信息写入目标文件的起始位置。其中,文件标识可以是自定义的一个数字,将这个数字放在目标文件的开头,可以在后续对目标文件的处理时,初步判断目标文件是否合法。
写入完上述信息后,可以依次读取第一文件和第二文件,并依次将第一文件和第二文件写入目标文件。待读取并写入完第二文件后,可以计算第一文件和第二文件的循环冗余校验码(cyclic redundancy check,CRC),并将CRC写入目标文件,得到固件升级包,该固件升级包便是经过加密的文件。
上述固件升级包被烧录至MCU后,可以用于对该芯片进行升级。
在具体实现中,可以首先将固件升级包写入闪存的升级交换区中,然后解析并校验固件升级包。若固件升级包校验成功,则将第一文件写入应用程序区的第一代码区,将第二文件写入应用程序区的第二代码区。上述第一代码区为普通代码区,第二代码区为加密代码区。
需要说明的是,为了更好的保护固件及芯片,在烧录过程中还可以获取芯片的标识信息即芯片ID,并对芯片ID进行加密,上述加密后的芯片ID可以被写入应用程序区的参数区中。
在将第一文件写入普通代码区,第二文件写入加密代码区,加密后的芯ID写入参数区后,可以擦除升级交换区中存储的数据。
S103、在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
由于固件升级包中的文件内容已写入应用程序区,因此在采用固件升级包对芯片进行升级时,可以跳转至应用程序区执行。
在具体实现中,可以首先对存储于参数区中的加密后的芯片ID进行校验;若芯片ID校验成功,则在FLASH中运行第一文件;然后,对第二文件进行解密,将解密后的第二文件复制至RAM,并在RAM中运行解密后的第二文件。待第一文件和解密后的第二文件均执行完毕后,便完成了对芯片的升级。
待完成芯片的升级过程后,可以擦除RAM中存储的数据。
在本申请实施例中,通过对固件代码进行编译,可以得到第一文件和待加密文件,在对待加密文件进行加密得到第二文件后,可以将第一文件和第二文件合并为固件升级包。上述固件升级包被烧录至微控制单元后,通过运行固件升级包,可以实现对芯片的升级。具体地,在采用固件升级包对芯片进行升级时,可以在闪存中运行第一文件,在随机存取存储器中运行第二文件。本申请实施例的升级过程采用密文传输,能够有效降低传输过程中固件被盗取的可能性;此外,通过将固件中的未加密文件和加密文件分别放入闪存和随机存取存储器中运行,保证加密文件在闪存中始终处于加密状态,只有在随机存取存储器中运行时才解密,进一步提高了固件升级包的安全性,保证了芯片安全。
需要说明的是,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
为了便于更好地理解本方案,下面结合具体的示例本申请实施例提供的固件保护方法进行介绍。
本申请实施例中所使用的MCU可以是型号为STM32F411CEU6的MCU,它是一款基于CORTEX-M4内核的MCU,其FLASH容量为512k,RAM容量为128k。当然,上述针对MCU型号的介绍仅仅是为了将本方案的实施过程描述得更具体、细致所提供的一种示例,本申请实施例针对其他型号的MCU同样使用。例如,本申请实施例也适用于CORTEX-M3内核的其他型号MCU。
本申请实施例中所使用的软件开发工具可以是KeilMDK v5。介绍具体型号的软件开发工具同样是为了将本方案的实施过程描述得更加具体、细致,对于使用其他工具,如IAR、GCC等,只要编译结果一样,也能够达到与本申请实施例所提供的方案同样的效果。本方案的核心点在于对固件加密保护的过程和方式方法。
随着技术的进步,目前MCU的内部存储器密度越来越高,几百kbytes的FLASH和一百多kbytes的RAM已经非常常见,但一般的应用是很少有这么大的代码量的,因此本申请实施例将充分利用FLASH和RAM的空间,在保证运行效率的同时,加强对关键代码的保护。为了防止攻击者从FLASH获取程序后对程序进行逆向工程或者直接使用,本申请实施例对部分FLASH数据进行加密,将程序划分成FLASH和RAM两部分,把需要加密的函数的执行空间映射到RAM空间,同时将程序和芯片进行绑定,以此来达到对固件及芯片进行保护的目的。下面具体介绍。
一、加密过程。
1、存储空间规划。
如表一所示,是一种针对FLASH的描述信息。
表一:FLASH描述信息
其中:
Block,表示存储块,是一种存储器的分区大小单位,MCU内部存储器由许多个存储块组成。
Block base address,表示存储块的地址范围。
Sector,表示存储扇区,是一种比存储块更小的存储单位。一般地,存储块由多个扇区组成。
Main memory,表示主存储区,是MCU内部存储器中保存用户代码、常量数据的地方。
System memory,表示***存储区,是MCU内部存储器中保存厂家预设参数,厂家内置代码的地方。
OTP area,表示OTP存储区,OTP是一种特殊的存储器功能,即OneTimeProgram,表示只能编程一次,也就是说只能写一次数据,第二次就无法写入了。
Option bytes,表示选项字段存储区,是MCU内部提供的一种配置MCU工作参数的方法。例如,配置FLASH的读写保护等。
由于用户程序保存在上述主存储区(Main memory),因此为了实现本申请实施例提供的方法,首先可以将Main memory划分为四个区域,即:Bootloader区、应用程序区、升级交换区和用户数据区。其中:
Bootloader区的主要职责是将升级交换区的内容复制到运行区(应用程序区),因该区域涉及的代码量不大,不需要很大的空间,可以选择扇区Sector0作为bootloader区。
应用程序区是程序正常执行的时候所在的区域,在空间允许的范围内,应用程序区应尽可能大,可以选择Sector4、Sector5作为应用程序区。
升级交换区是在应用编程(in application programming,IAP)的时候临时存放固件数据的地方,可以选择Sector6、Sector7作为升级交换区。
用户数据区主要是用来保存用户配置参数,除了前面几个区域之外都可以作为用户数据区,可以选择Sector2、Sector3作为用户数据区。
最终的分配结果可以参见表二所示。
表二:FLASH分配结果
需要说明的是,普通代码区(第一代码区)最大容量为175kbytes,表示在应用程序区前面的175kbytes的空间都是供给普通代码使用的,如果实际的代码没有这么大,那么就会有一部分是空着的;相应地,加密代码区(第二代码区)最大容量为16kbytes,表示从应用程序区175kbytes空间后开始的16kbytes范围是留给加密代码使用的,如果加密代码没有这么大,那么也会有一部分空间是空着的。
除了FLASH之外,本申请实施例还需要将一部分程序的执行地址映射到RAM空间,因此还需要对RAM空间进行划分。由于相较于FLASH的空间,RAM空间是比较小的,所以可以只对核心算法、包含关键信息的函数进行加密,并将其映射到RAM空间。在本申请实施例中,可以在RAM空间开头预留16kbytes空间作为RAM运行空间。针对RAM空间的规划如表三所示。
表三:RAM分配结果
其中,堆栈区(Heap和Stack)的大小可以根据实际需求进行调整,与本申请实施例的加密功能没有关系。
2、修改分散加载文件。
在本申请实施例中,可以将程序划分成bootloader和app两个工程,bootloader的工程配置可以采用默认配置即可,无需特殊修改。本申请实施例的加密过程主要是针对app工程而言。为了使app编译后的固件能按前述规划的地址来分布,需要修改分散加载文件。
默认情况下,固件代码保存在FLASH中,也在FLASH执行,而代码执行过程中的变量则保存在RAM中。现在,本申请实施例需要将加密代码放在RAM中执行,因此需要在RAM中增加一个代码执行区。修改后的分散加载文件可以如下所示:
在上述代码中,LR_IROM1 0x08010000 0x00030000表示代码加载区,也就是代码保存在从0x08010000开始,长度为0x00030000的存储空间里。ER_IROM1 0x080100000x00030000表示代码在从0x08010000开始,长度为0x00030000的存储空间里执行。可以看到,这个执行地址和存储地址是在Main memory的地址空间里的,这就是用来保存和执行普通代码的区域。
RW_IRAM1 0x20004000 0x0001C000表示堆栈和变量区,代码执行过程中的变量和临时数据就存放在这个区域。从LR_IRAM1开始的部分是本申请实施例新增加的内容,LR_IRAM1 0x0803BC00 0x00004000表示这也是一个代码加载区,从0x0803BC00开始,长度是0x00004000,这是用来存放加密代码的区域;ER_IRAM1 0x20000000 0x00004000表示代码执行区,从0x20000000开始,长度是0x00004000,这是用来执行加密代码的区域。
按照前述操作过程,已经代码存储和执行空间划分好了。还需要让代码存储在正确的位置,并在正确的地址空间执行,
首先,存储空间分成了第一存储区(LR_IROM1)和第二存储区(LR_IRAM1),根据工程配置,代码默认就是保存在LR_IROM1中的,如果需要将其保存在LR_IRAM1中,就需要使用关键字(如attribute)进行显式说明。所以,在需要对某个代码段进行加密的时候,可以在代码开始的地方用attribute关键字将代码存储区域指定到加密代码存储区;而保存在LR_IROM1的代码会自然的放到对应的第一执行区(ER_IROM1)去执行,保存在LR_IRAM1的代码会放到第二执行区(ER_IRAM1)去执行。把代码从保存区复制到执行区的过程称为代码加载,这是在整个***启动的时候自动完成,无需用户软件干涉。
3、修改工程配置选项。
修改工程配置选项主要是针对app工程的配置,使用开发工具设置默认的代码存储和执行空间,需要和前一步骤中的存储区、执行区保持一致。
此外,通过配置,还应能够让编译器产生相应的bin文件(目标文件),然后调用加密脚本(encryt.bat)来对bin文件进行加密处理。同时,还应配置编译器使用的分散加载文件为前述修改后的加载文件。
4、对固件进行加密。
经过前述处理之后,在对固件代码进行编译后将会产生两个文件,一个是第一文件(ER_IROM1),一个是待加密的文件(ER_IRAM1)。这两个文件的名字是根据分散加载文件内容产生的,ER_IROM1和ER_IRAM1分别对应分散加载文件里的两个代码执行区的名字。在将固件烧录到MCU后,ER_IROM1在普通代码区,ER_IRAM1在加密代码区。但此时的ER_IRAM1是没有经过任何处理的,即此时的ER_IRAM1是未加密的。
为了达到加密的目的,可以使用开发工具对ER_IRAM1的数据进行加密处理,同时把这两个文件合并成一个新的文件,即固件升级包。
如图2所示,是本申请实施例提供的一种固件升级包合并过程示意图。按照图2所示的合并过程,可以依次打开ER_IROM1和ER_IRAM1,并新建目标文件target.bin。然后,可以根据ER_IROM1文件的大小,计算ER_IRAM1文件在target.bin中的偏移位置,并将文件标识、ER_IROM1文件的文件大小、ER_IRAM1文件的文件大小、ER_IRAM1文件的偏移地址等信息写入target.bin的起始位置。在此之后,可以读取ER_IROM1文件的文件内容并写入target.bin。待完成对ER_IROM1文件的写入后,可以读取ER_IRAM1文件的文件内容并对其进行加密,然后将加密后的数据写入target.bin。当ER_IROM1文件和ER_IRAM1文件的文件内容均写入至target.bin后,还可以计算相应的CRC,并将其写入target.bin,从而得到升级固件包。
需要说明的是,为了减少升级固件包的文件大小,ER_IRAM1在target.bin的偏移地址和实际烧录到MCU后的偏移地址是不一样的。对ER_IRAM1文件的加密,可以在文件合并过程中进行,也可以预先对其进行加密后,直接对ER_IROM1文件和ER_IRAM1文件进行合并。此外,对ER_IRAM1文件的加密可以采用任意加密方式,如AES、DES、RSA等等,只要解密的时候采用对应的解密方式即可。
经过上面的步骤,可以得到一个经过加密的升级固件包,现在需要将升级固件包烧录到MCU内部的升级交换区。有两个方法可以实现烧录功能,第一个是在bootloader实现IAP的功能,然后通过串口将升级固件包发送给MCU,MCU收到升级固件包之后将文件写到升级交换区;第二个方法是使用在线编程工具(in-system programming,ISP)提供的FlashLoader Demonstrator.exe程序把升级固件包烧录到指定的位置。
在本申请实施例中,为了使加密方法更加通用,可以采用第一种烧录方法。在bootloader实现一个YModem协议来实现文件的传输,文件传输的过程不对文件内容进行解析,只要保证数据传输的准确性即可。MCU收到文件内容后将其写入升级交换区。接收完成之后,bootloader对所接收的文件进行检查,包括检查CRC、文件长度、加密后的第二文件(ER_IRAM1')的偏移地址、堆栈地址等参数,如果参数都没有问题,就擦除应用程序区,然后将新的文件内容写到应用程序区的相应位置,然后跳转到应用程序区执行新的代码。下面结合图3具体说明。
如图3所示,是本申请实施例提供的一种固件升级包烧录过程示意图。按照图3所示的烧录过程,在接收到升级指令后,可以初始化IAP数据结构,然后接收升级固件包。若升级固件包接收完毕,可以将其写入FLASH的升级交换区,并在对升级固件包校验成功后,擦除应用程序区,将第一文件ER_IROM1写入普通代码区,将第二文件ER_IRAM1'写入加密代码区。然后,读取芯片ID,调用加密函数对芯片ID进行加密,将加密后的芯片ID写入参数区。此后,可以擦除升级交换区中存储的数据。至此,整个加密过程便完成了,后续的解密过程在应用程序执行时实现。
从上述加密过程可以看到,需要加密的代码经过加密处理后在target.bin中的数据已经不是原始数据,最后烧写到FLASH的内容与target.bin的内容一致,就算攻击者破解了MCU,从FLASH读取到target.bin,只要不知道加密方法,那就无法解密获得正确的固件数据;又因为应用程序在执行的时候需要比较芯片ID,因此直接复制整套代码到另外一个MCU也是无法执行的。这样就达到了对核心算法和关键信息的加密保护作用。
二、解密过程。
在本申请实施例中,加密的功能主要是针对关键信息和核心算法,这些加密内容是被放到RAM上执行的,MCU对RAM的读写速度是很快的,因此可以在需要用到的时候(例如,需要执行上述关键信息或核心算法时)再对被加密的内容进行解密。
图4所示,是本申请实施例提供的一种固件升级包解密过程示意图。按照图4所示的解密过程,可以首先读取芯片ID,并从参数区读取经过加密的芯片ID,若二者匹配成功,则可以继续进行应用程序的执行步骤,读取普通代码区中的第一文件,在FLASH中执行上述第一文件。对于加密代码(如第二文件),可以在对其进行解密后,将解密后的文件复制到RAM,并在RAM中执行。待完成后,可以删除RAM存储的数据。
需要说明的是,图4中while(1)步骤表示当代码执行到该步骤时,就循环去擦除代码存储区,这个循环是无限循环,最终会因为当前执行的代码被擦除而导致***崩溃。
由上述处理过程可知,加密代码只有在执行的时候才会被解密并复制到RAM中的执行地址,执行完毕之后执行空间里的内容又被清除了,这样能够有效防止攻击者读取到原始的代码数据。
本申请实施例通过对MCU固件的关键信息和核心算法进行加密,升级固件传输的固件数据是经过加密的,固件烧录到MCU内部之后并没有马上进行解密,只有在需要使用时才进行解密,这样即使攻击者破解了芯片,从芯片内读取到的固件数据的核心部分仍然是密文数据,从而无法进行逆向工程;又因为应用程序是和芯片ID绑定的,所以如果直接将整个固件拷贝到其他芯片也是无法执行的。本申请实施例提供的保护方案,从固件升级开始,一直到程序的整个运行周期都进行了保护,大大增加了攻击者对固件进行逆向工程的成本,从而有效地保护了固件的安全,在芯片硬件保护的基础上增加了一道软件安全防线。
参照图5,示出了本申请实施例提供的一种固件保护装置的示意图,具体可以包括编译模块501、加密模块502、合并模块503、烧录模块504和升级模块505;其中:
编译模块,用于对固件代码进行编译,得到第一文件和待加密文件;
加密模块,用于对所述待加密文件进行加密,得到第二文件;
合并模块,用于将所述第一文件和所述第二文件合并为固件升级包;
烧录模块,用于将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
升级模块,用于在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
在本申请实施例中,所述固件代码包括第一代码段和第二代码段,所述第二代码为待加密的代码段,所述编译模块具体可以包括如下子模块:
配置子模块,用于对编译器进行配置,使所述第一代码段存储于预设的第一存储区,所述第二代码段存储于预设的第二存储区;
第一执行子模块,用于在与所述第一存储区对应的第一执行区内执行所述第一代码段,得到所述第一文件;
第二执行子模块,用于在与所述第二存储区对应的第二执行区内执行所述第二代码段,得到所述待加密文件。
在本申请实施例中,所述合并模块具体可以包括如下子模块:
创建子模块,用于创建目标文件;
写入子模块,用于将所述第一文件和所述第二文件写入所述目标文件中,得到所述固件升级包。
在本申请实施例中,所述写入子模块具体可以包括如下单元:
文件大小确定单元,用于确定所述第一文件的大小和所述第二文件的大小;
偏移位置确定单元,用于根据所述第一文件的大小,确定所述第二文件在所述目标文件中的偏移位置;
起始信息写入单元,用于将所述第一文件的大小、所述第二文件的大小和所述偏移位置写入所述目标文件的起始位置;
文件写入单元,用于依次读取所述第一文件和所述第二文件,并依次将所述第一文件和所述第二文件写入所述目标文件;
校验码写入单元,用于计算所述第一文件和所述第二文件的循环冗余校验码,并将所述循环冗余校验码写入所述目标文件,得到所述固件升级包。
在本申请实施例中,所述烧录模块具体可以包括如下子模块:
升级包写入子模块,用于将所述固件升级包写入所述闪存的升级交换区中,所述闪存还包括应用程序区,所述应用程序区包括第一代码区和第二代码区;
升级包校验子模块,用于解析并校验所述固件升级包;
第一文件写入子模块,用于若所述固件升级包校验成功,则将所述第一文件写入所述第一代码区;
第二文件写入子模块,用于将所述第二文件写入所述第二代码区。
在本申请实施例中,所述应用程序区还包括参数区,所述烧录模块还可以包括如下子模块:
标识信息加密子模块,用于获取所述芯片的标识信息,并对所述标识信息进行加密;
标识信息写入子模块,用于将加密后的标识信息写入所述参数区;
升级交换区擦除子模块,用于擦除所述升级交换区中存储的数据。
在本申请实施例中,所述升级模块具体可以包括如下子模块:
标识信息校验子模块,用于在采用所述固件升级包对芯片进行升级时,对所述加密后的标识信息进行校验;
第一文件运行子模块,用于若所述加密后的标识信息校验成功,则在所述闪存中运行所述第一文件;
第二文件解密子模块,用于对所述第二文件进行解密,将解密后的第二文件复制至所述随机存取存储器中;
第二文件运行子模块,用于在所述随机存取存储器中运行所述解密后的第二文件;
存储器擦除子模块,用于擦除所述随机存取存储器中存储的数据。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述得比较简单,相关之处参见方法实施例部分的说明即可。
参照图6,示出了本申请实施例提供的一种终端设备的示意图。如图6所示,本实施例的终端设备600包括:处理器610、存储器620以及存储在所述存储器620中并可在所述处理器610上运行的计算机程序621。所述处理器610执行所述计算机程序621时实现上述固件保护方法各个实施例中的步骤,例如图1所示的步骤S101至S103。或者,所述处理器610执行所述计算机程序621时实现上述各装置实施例中各模块/单元的功能,例如图5所示模块501至505的功能。
示例性的,所述计算机程序621可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器620中,并由所述处理器610执行,以完成本申请。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段可以用于描述所述计算机程序621在所述终端设备600中的执行过程。例如,所述计算机程序621可以被分割成编译模块、加密模块、合并模块、烧录模块和升级模块,各模块具体功能如下:
编译模块,用于对固件代码进行编译,得到第一文件和待加密文件;
加密模块,用于对所述待加密文件进行加密,得到第二文件;
合并模块,用于将所述第一文件和所述第二文件合并为固件升级包;
烧录模块,用于将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
升级模块,用于在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
所述终端设备600可包括,但不仅限于,处理器610、存储器620。本领域技术人员可以理解,图6仅仅是终端设备600的一种示例,并不构成对终端设备600的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备600还可以包括输入输出设备、网络接入设备、总线等。
所述处理器610可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器620可以是所述终端设备600的内部存储单元,例如终端设备600的硬盘或内存。所述存储器620也可以是所述终端设备600的外部存储设备,例如所述终端设备600上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)等等。进一步地,所述存储器620还可以既包括所述终端设备600的内部存储单元也包括外部存储设备。所述存储器620用于存储所述计算机程序621以及所述终端设备600所需的其他程序和数据。所述存储器620还可以用于暂时地存储已经输出或者将要输出的数据。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制。尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (10)
1.一种固件保护方法,其特征在于,包括:
对固件代码进行编译,得到第一文件和待加密文件,并对所述待加密文件进行加密,得到第二文件;
将所述第一文件和所述第二文件合并为固件升级包,并将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
2.根据权利要求1所述的方法,其特征在于,所述固件代码包括第一代码段和第二代码段,所述第二代码为待加密的代码段,所述对固件代码进行编译,得到第一文件和待加密文件,包括:
对编译器进行配置,使所述第一代码段存储于预设的第一存储区,所述第二代码段存储于预设的第二存储区;
在与所述第一存储区对应的第一执行区内执行所述第一代码段,得到所述第一文件;
在与所述第二存储区对应的第二执行区内执行所述第二代码段,得到所述待加密文件。
3.根据权利要求1或2所述的方法,其特征在于,所述将所述第一文件和所述第二文件合并为固件升级包,包括:
创建目标文件;
将所述第一文件和所述第二文件写入所述目标文件中,得到所述固件升级包。
4.根据权利要求3所述的方法,其特征在于,所述第一文件和所述第二文件写入所述目标文件中,得到所述固件升级包,包括:
确定所述第一文件的大小和所述第二文件的大小,并根据所述第一文件的大小,确定所述第二文件在所述目标文件中的偏移位置;
将所述第一文件的大小、所述第二文件的大小和所述偏移位置写入所述目标文件的起始位置;
依次读取所述第一文件和所述第二文件,并依次将所述第一文件和所述第二文件写入所述目标文件;
计算所述第一文件和所述第二文件的循环冗余校验码,并将所述循环冗余校验码写入所述目标文件,得到所述固件升级包。
5.根据权利要求1或2或4所述的方法,其特征在于,所述将所述固件升级包烧录至微控制单元中,包括:
将所述固件升级包写入所述闪存的升级交换区中,所述闪存还包括应用程序区,所述应用程序区包括第一代码区和第二代码区;
解析并校验所述固件升级包;
若所述固件升级包校验成功,则将所述第一文件写入所述第一代码区,将所述第二文件写入所述第二代码区。
6.根据权利要求5所述的方法,其特征在于,所述应用程序区还包括参数区,所述方法还包括:
获取所述芯片的标识信息,并对所述标识信息进行加密;
将加密后的标识信息写入所述参数区;
擦除所述升级交换区中存储的数据。
7.根据权利要求6所述的方法,其特征在于,所述在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件,包括:
在采用所述固件升级包对芯片进行升级时,对所述加密后的标识信息进行校验;
若所述加密后的标识信息校验成功,则在所述闪存中运行所述第一文件;
对所述第二文件进行解密,将解密后的第二文件复制至所述随机存取存储器中,并在所述随机存取存储器中运行所述解密后的第二文件;
擦除所述随机存取存储器中存储的数据。
8.一种固件保护装置,其特征在于,包括:
编译模块,用于对固件代码进行编译,得到第一文件和待加密文件;
加密模块,用于对所述待加密文件进行加密,得到第二文件;
合并模块,用于将所述第一文件和所述第二文件合并为固件升级包;
烧录模块,用于将所述固件升级包烧录至微控制单元中,所述微控制单元包括闪存和随机存取存储器;
升级模块,用于在采用所述固件升级包对芯片进行升级时,在所述闪存中运行所述第一文件,在所述随机存取存储器中运行所述第二文件。
9.一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述的固件保护方法。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的固件保护方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010858420.9A CN112100624A (zh) | 2020-08-24 | 2020-08-24 | 一种固件保护方法、装置及终端设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010858420.9A CN112100624A (zh) | 2020-08-24 | 2020-08-24 | 一种固件保护方法、装置及终端设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112100624A true CN112100624A (zh) | 2020-12-18 |
Family
ID=73754282
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010858420.9A Pending CN112100624A (zh) | 2020-08-24 | 2020-08-24 | 一种固件保护方法、装置及终端设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112100624A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112764379A (zh) * | 2021-01-18 | 2021-05-07 | 四川长虹电器股份有限公司 | 一种基于dsp***的iap控制方法 |
CN113221149A (zh) * | 2021-05-27 | 2021-08-06 | 深圳市共进电子股份有限公司 | 固件加密方法、装置、固件解密方法和计算机设备 |
CN114237514A (zh) * | 2021-12-24 | 2022-03-25 | 深圳市宝佳乐电子科技有限公司 | 区块管理方法、存储器控制器和存储器存储装置 |
CN115242492A (zh) * | 2022-07-19 | 2022-10-25 | 中国电信股份有限公司 | 固件硬编码的加密方法、装置、电子设备及存储介质 |
CN117193831A (zh) * | 2023-11-07 | 2023-12-08 | 上海灵动微电子股份有限公司 | 支持在线升级的电路 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101710307A (zh) * | 2009-10-16 | 2010-05-19 | 上海闻泰电子科技有限公司 | 一种数码设备的数据安全保护方法 |
CN103051963A (zh) * | 2012-11-30 | 2013-04-17 | 北京视博数字电视科技有限公司 | 一种数字电视终端设备的安全控制方法 |
CN106503494A (zh) * | 2016-11-05 | 2017-03-15 | 福建省北峰电讯科技有限公司 | 一种带有片上闪存微控制器的固件保护单元及保护方法 |
CN111262910A (zh) * | 2020-01-09 | 2020-06-09 | 杭州涂鸦信息技术有限公司 | 一种无线设备固件保护方法及*** |
-
2020
- 2020-08-24 CN CN202010858420.9A patent/CN112100624A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101710307A (zh) * | 2009-10-16 | 2010-05-19 | 上海闻泰电子科技有限公司 | 一种数码设备的数据安全保护方法 |
CN103051963A (zh) * | 2012-11-30 | 2013-04-17 | 北京视博数字电视科技有限公司 | 一种数字电视终端设备的安全控制方法 |
CN106503494A (zh) * | 2016-11-05 | 2017-03-15 | 福建省北峰电讯科技有限公司 | 一种带有片上闪存微控制器的固件保护单元及保护方法 |
CN111262910A (zh) * | 2020-01-09 | 2020-06-09 | 杭州涂鸦信息技术有限公司 | 一种无线设备固件保护方法及*** |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112764379A (zh) * | 2021-01-18 | 2021-05-07 | 四川长虹电器股份有限公司 | 一种基于dsp***的iap控制方法 |
CN112764379B (zh) * | 2021-01-18 | 2022-05-03 | 四川长虹电器股份有限公司 | 一种基于dsp***的iap控制方法 |
CN113221149A (zh) * | 2021-05-27 | 2021-08-06 | 深圳市共进电子股份有限公司 | 固件加密方法、装置、固件解密方法和计算机设备 |
CN113221149B (zh) * | 2021-05-27 | 2024-02-09 | 深圳市共进电子股份有限公司 | 固件加密方法、装置、固件解密方法和计算机设备 |
CN114237514A (zh) * | 2021-12-24 | 2022-03-25 | 深圳市宝佳乐电子科技有限公司 | 区块管理方法、存储器控制器和存储器存储装置 |
CN115242492A (zh) * | 2022-07-19 | 2022-10-25 | 中国电信股份有限公司 | 固件硬编码的加密方法、装置、电子设备及存储介质 |
CN115242492B (zh) * | 2022-07-19 | 2024-01-30 | 中国电信股份有限公司 | 固件硬编码的加密方法、装置、电子设备及存储介质 |
CN117193831A (zh) * | 2023-11-07 | 2023-12-08 | 上海灵动微电子股份有限公司 | 支持在线升级的电路 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100624A (zh) | 一种固件保护方法、装置及终端设备 | |
KR100294829B1 (ko) | 플래시 메모리를 보호하는 방법 및 장치 | |
US10360411B2 (en) | Secure processing unit systems and methods | |
US7831841B2 (en) | Semiconductor device including encryption section, semiconductor device including external interface, and content reproduction method | |
KR101014179B1 (ko) | 플래시 대용량 저장 메모리를 가진 보안 장치를 위한 보안 및 적응형 시스템 구조 | |
US20050021944A1 (en) | Security architecture for system on chip | |
US20130156195A1 (en) | Method of obtaining a main key from a memory device, method of generating authentication information for a memory device, an external device and system icluding the external device | |
US20030126451A1 (en) | Data processing | |
WO2009107330A1 (ja) | 情報処理装置及びその制御方法 | |
CN111201553B (zh) | 一种安全元件及相关设备 | |
US20020069316A1 (en) | Method and apparatus for protecting flash memory | |
JP4347582B2 (ja) | 情報処理装置 | |
CN103282913A (zh) | 用于加载至少一个软件模块的代码的方法 | |
CN112384922A (zh) | 加密密钥分布 | |
EP2163963A2 (en) | Information processing apparatus for installing an encrypted program in a key implemented system | |
US20020169976A1 (en) | Enabling optional system features | |
CN111931190B (zh) | 一种基于xip处理器***的启动方法 | |
KR20050086782A (ko) | 컨텐츠 처리 칩, 장치 및 방법 | |
US20130275688A1 (en) | Data processing device and method | |
EP3292504B1 (en) | Secure element with shared memories, for a multi-image owner device | |
CN114237492A (zh) | 非易失性存储器保护方法及装置 | |
CN117272377A (zh) | 权限数据处理方法、装置及电子设备 | |
CN115587370A (zh) | 一种固件导入方法、固件导入***及安全芯片 | |
JP5055487B2 (ja) | 半導体メモリおよび情報処理システム | |
GB2353120A (en) | Protecting flash memory |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |