针对黑客非法获取ARM芯片程序的问题,提出了防止ARM芯片程序被非法复制和源代码窃取的方法。该方法以分散种植的方式规划存储器,并以ARM芯片中世界上唯一的序列号为密钥加密核心程序。
一、分散加载技术介绍。
1.分散加载的基本原理。
在嵌入式系统中,其存储系统通常由FLASH.ROM.RAM和其他存储器组成,它们被定位在不同的物理地址范围内。为了使软件更好地访问和使用这些存储器,并使系统高效运行,ARM链接器提供了一个分散的加载机制。在链接过程中,可执行的镜像文件可以根据分散加载文件中指定的存储分配方案分为指定的分区和指定的存储物理地址。当嵌入式系统重新启动或复位时,首先初始化处理器内部的存储器,然后执行ROM存储器的自提代码,根据链接中的存储器分配方案将相应的代码和数据从加载地址复制到运行地址。这样,RAM存储器中定位的代码和数据就在RAM中执行,而不是从ROM存储器中执行。利用分散加载的特性,可以在加载域指定的ROM中存储加密=进制程序,并在相应的运行域RAM中恢复,使源程序不再暴露。
2.存储规划。
ARMCortex-M3芯片有32KB本地静态RAM和512KBFLASH,其地址映射如图1所示。
由于ARM芯片程序中有大量的公共数据库程序和简单的流程控制程序,只要加密核心代码,就不需要加密所有程序。本文将ARM程序抽象成三个部分:预处理部分、核心程序部分和其他程序部分。预处理部分首先执行,负责与上位机软件交互。解密加载域并写入相应的操作域。核心程序是芯片代码中需要加密的部分,其加载域存储其密文。其他程序是芯片代码中的公共数据库程序或简单流程序,其加载域直接存储其明文。本文对存储器的规划如表1所列。值得注意的是,核心程序的操作区域在RAM上。根据分散加载文件的编写规则和表1,编写相应的分散加载文件后,使用集成开发环境编译和下载程序,预处理程序。核心程序。其他程序将被烧毁到相应的加载区域,并获得三个相应的二进制文件。
二、具体实现加密方案。
软件加密的目的是尽一切可能导致机器代码错误的反汇编或反汇编程序不可读,所以你可以考虑加密程序,然后烧写到FLASH,以完全扰乱FLASH程序的顺序。这样,罪犯从FLASH中提取的程序,反汇编的结果将是完全不可分析的。在加密程序运行前,将其解密到分散加载文件指定的RAM运行区域。由于RAM的失电,正确的二进制程序将被隐藏起来。到目前为止,它已经可以防止罪犯通过反汇编获得程序的源代码。然而,仍然没有防止模仿者通过非法手段将芯片程序复制到同一型号的其他芯片,从而快速生产类似的电子产品。通过对ARM芯片的分析,发现所有ARM芯片内部存储器中都有一组128个世界上唯一的芯片序列号。而且这个序列号只能读取,不能修改。这个序列号可以作为加密算法的密钥。这样,由于所有ARM设备的密钥不同,犯罪分子将芯片程序简单复制给其他同类型芯片,由于密钥不匹配,无法获得正确的操作域程序,导致整个复制芯片程序的窃取失败。
本文加密方案的总体思路如图2所示。首先,通过分散加载规划存储器和正常加载程序。然后将核心程序以ARM序列号为密钥,加密后烧写在分散加载文件指定的加载区域,以密文的形式覆盖原始明文。最后,在预处理程序中提取设备序列号作为密钥解密,并将结果复制到分散加载文件指定的操作区域。
1.选择加密算法。
在数据加密认证过程中,R&D工程师首先要考虑选择合适的加密算法。在选择加密算法时,要根据自己的需要综合考虑算法的执行速度、安全性和资源占用性。对称加密算法是嵌入式设备加密的主要方法,广泛应用的对称加密算法包括AES算法和DES算法。DES算法是否能对抗差分和线性密码分析。对系统资源要求高的缺点:2000年,美国国家标准局正式宣布AES算法为新的高级加密标准。AES的优点如下:操作速度快,内存要求低,安全性高。由于AES算法可以提供128个密钥,世界上唯一的128个ARM芯片序列号可以作为AES算法密钥,无需任何处理。本文选择AES算法作为核心程序加密算法。
2.核心程序加密实现过程。
根据表l的分散加载方案,将程序下载到存储器芯片中,所有程序,包括核心程序,都存储在FLASH上。为了防止核心程序被盗,必须对其进行加密,并用密文覆盖原始明文。实现时,应设计一个简单的上位机软件,配合芯片中的预处理程序完成芯片加密。上位机可以由MFC或C#开发,如图3所示。
上位机可以通过无线、串口、USB接口等方式与ARM微处理器通信。上位机首先判断是否与ARM设备连接。作者采用的方法是上位机向微处理器发送CONNECT宏命令。如果从ARM设备中收到相同的CON-NECT宏命令,则可以判断ARM设备与上位机的成功连接。之后,上位机自动发送GET;二SERIAL-NUMBER宏命令允许微处理器调用内置函数读取世界上唯一的芯片序列号,并将其发送给上位机。选择与核心程序相对应的二进制文件进行加密。上位机会调用AES算法,以世界上唯一的芯片序列号为密钥生成加密的核心程序文件。选择生成的加密核心程序文件,将分散加载文件中核心程序的加载地址和运行地址分别填写上位机软件的相应控制,最后,上位机会将加密的核心程序文件发送到ARM设备中。芯片中的预处理程序接收到加密核心程序后,通过应用程序编程(IAP)覆盖未加密核心程序的加载区域。此外,在发送加密核心程序时,烧写地址(ROMCORE_ADDR)、执行地址(RAM_RUNADR)和核心程序代码大小(CORE_SIZE)一起发送给ARM设备,预处理程序解密时使用上述三个参数。核心程序加密过程如图4所示,执行每一步的结果将显示在上位机上。
3.操作时解密的实现过程。
为了使加密方案更加通用,将与上位机通信的所有程序和解密程序都放在预处理程序中。只要在ARM程序的开始部分添加预处理程序,所有ARM系列微处理器都可以应用这个加密方案。执行预处理程序时,首先检查ARM设备是否与上位机连接。如果连接,执行与上位机交互的相关程序,如上述接收核心程序密文,以IAP的形式覆盖核心程序加载域明文。ARM序列号发送等。如果ARM设备没有与上位机连接进行操作域解密,首先调用ARM芯片提供的API提取世界上唯一的内部序列号(SER-IAL_NUMBER),然后以此为密钥对核心程序加载域(ROM_CORE_ADR)上的程序进行AES解密,最后将结果复制到核心程序运行域(RAM_RUN)。
采用迭代的方法,每次从核心代码加载域提取128位,将其解密后复制到核心代码运行域,迭代的次数由核心程序代码大小决定。无论要解密的核心程序有多大,此方案只需32字节的额外存储空间。另外,应用ARM处理器特有的32位指令集,可以大幅加快AES解密算法的执行速度。将解密后的核心程序复制到相应运行域后,就可以跳转出预处理程序,执行正常的功能程序。运行时解密过程如图5所示。
小知识之ARM处理器
ARM处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器。更早称作Acorn RISC Machine。ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。