众所周知,单片机应用系统由硬件电路和控制程序组成。虽然硬件电路部分也体现了设计师的努力和创造性劳动成果,但没有保密性。唯一可能保密的是控制程序部分。如何改进控制程序的加密功能,防止他人破解、盗窃、 ** 单片机应用系统中的控制程序代码已成为单片机应用系统开发人员和制造商保护其知识产权不受侵犯的关键措施之一。
在分析传统单片机控制程序软件加密技术和硬件加密技术的基础上,探索如何充分利用单片机芯片的新硬件功能,并提出了基于单片机芯片的识别码(即芯片中唯一的芯片) ID号)、RC振荡器频率离散、上电标志等单片机控制程序的加密策略。
1、新型MCU芯片的特性和传统软件加密方法的局限性
1、新型MCIJ芯片的特点
近年来,单片机技术取得了长足的进步,实现了真正的单片化,主要体现在支持ISP、ICP、FlashIAP编程模式 对于MCS-51兼容芯片,ROM存储器已逐渐成为单片机芯片内部程序存储器的主流,外部程序存储器不需要通过总线扩展:内置112个RC振荡器(作为看门狗计数器时钟或系统主时钟)。为了保护芯片中控制程序代码的安全,除了进一步加强加密锁定位功能外,一些制造商的MCU芯片,如STCMCS-51兼容芯片、STCortex-M3核STM32系列芯片,还增加了芯片身份识别码。
2、传统软件加密原理及其局限性
传统的软件加密方法主要有以下几种;
(1)指令伪装法
指令伪装的策略是在不影响控制程序运行的情况下,改变汇编语言源程序中个别指令的形式,增加反汇编代码阅读的难度。总结如下:
a、对于使用CISC指令系统的MCU芯片,在两个模块之间插入多字节指令(双字节或3字节)的操作代码,将反汇编后插入的操作代码字节与下一个模块的第一个指令组合形成新的指令(甚至在源程序中继续拆分第二个指令),使反汇编后看不到真实的汇编指令。
b、将长跳转指令中的目标地址压入堆栈,然后用RET指令代替无条件长跳转指令LJMP。
c、将长跳转指令中的目标地址发送到DPTR,然后使用散转指令JMP @A DPTR取代无条件长跳指令LJMP。
然而,上述伪装指令最多只能增加反汇编程序的阅读难度,破解后直接 ** 盗窃没有任何预防作用,严格地说,指令伪装法不属于软件加密的范畴。
(2)破坏单片机芯片特定硬件资源加密法
法洲对单片机芯片特定硬件资源的破坏主要有以下几点:
a、故意烧毁数据总线。对于MCS-51兼容芯片,程序代码总是从数据总线(PO端口)读取。因此,12V高压被人为地引导到PO端口的I/O引脚,使其下拉N沟MOS管破裂-接地短路。
该方法有效防止非法读取芯片中的代码,但其局限性也非常明显:一方面,不能通过总线扩展并行I/O端口(破坏芯片内部数据总线接口电路);另外,电影中的程序代码不能再通过并行编程来更新;第三,它占用了芯片I/O引脚资源。
b、破坏芯片的加密锁定位。由于Fla ** ROM擦写次数仅为10K左右,因此芯片加密位置在运行过程中通过IAP编程多次擦写,使Flash ROM不能再擦除了。这种方法的潜在危险是,如果加密位擦除失效后不能再写入,则电影中的代码很容易读取;此外,该方法不能阻止探针攻击。另外,软件设计者也无法更新电影中的程序代码。
c、破坏MCS.51EA引脚。对于MCS-51兼容芯片,当EA引脚为低功率时,将从外部ROM执行程序。因此,一些设计师尝试FLJ破坏E引脚,使MCS-51芯片在复位后始终从芯片中执行程序,但这种方法不能阻止通过擦除芯片加密的琐碎定位来读取芯片中的代码。
(3)总线加密法
早期MCS-51芯片内部程序存储容量小,甚至没有内部ROM,一般需要通过总线扩展外部程序存储,因此出现了所谓的总线加密方法。
总线加密法主要包括地址总线乱序法、数据总线乱序法,或在MCU芯片地址总线与存储器地址总线之间增加可编程芯片(如GAL)、FPGA等)利,使MCU芯片地址与存储器地址形成新的映射关系。这些加密方法可能对早期的MCS-51应用系统有一定的作用,但几乎所有的单片机应用系统都不再使用外部程序存储器。
经过长期实践,针对主流单片机芯片硬件的特点,本文提出了三种实用的单片机控制程序加密方法,如芯片识别码、芯片中RC振荡器频率离散、上电标志等。
二、基于芯片识别码的加密方法
为了提高电影中程序代码的安全性,最近上市的一些MCU芯片,如2009年后推出的MCS-51兼容芯片、STSTM32系列芯片,都有唯一的芯片ID号。因此,该功能可以充分利用控制程序来改善控制程序代码的保护,加密步骤可以如图1所示。
设置第一次上电标志的目的是确定编程后是否启动,并在第一次上电时读取并保存芯片的ID号。为了防止攻击者通过模拟找到芯片ID号信息,ID号的原码一般不应直接存储,而应经过相应的加密处理后存储在不同的Flash中 ROM存储单元;验证方法不应采用常见、简单的验证规则,如验证等,应尽可能采用一些特殊的验证方法,使攻击者无法快速确定验证算法。
为了防止攻击者在控制程序片段中获得有用的代码,一旦发现ID号不一致,最简单的方法就是在IAP编程的帮助下删除控制程序代码。当然,控制程序代码中的1~2K字节也可以随机重写,如图1所示。
三、基于片内RC振荡器频率离散的加密方法
MCU芯片具有唯一的ID号,易于加密,破解成功率很低。然而,由于生产成本和专利限制,许多中低档MCU芯片,如大多数制造商的MCS-51兼容芯片、PIC系列芯片,甚至最近上市的STM8S系列芯片,都没有唯一的芯片ID功能。对于这类芯片,如果包含RC振荡器作为看门狗计数器时钟或唤醒时钟,如P89LPC900系列MCS-51兼容芯片、STM8S系列芯片、PIC16/18系列芯片等,则内置一定数量的RC振荡器。为了提高片内控制程序代码的安全性,设计者可以充分利用RC振荡器的频率离散来生成芯片ID号。
1、使用RC振荡器频率作为芯片ID号
该加密方法的加密原理大致如下:
(1)复位后启动MCU芯片的某个定时器测量RC振荡器的频率。只要定时器计数脉冲来自高精度和稳定性的外部石英晶体振荡器,频率测量误差是可控的,不会很大。
(2)考虑到RC振荡器输出信号频率受环境温度影响较大,应考虑温度变化、晶体振荡频率误差等对测量结果的影响。例如,STM8S系列MCU芯片中低速RC振荡器的标称频率为128KHz~12.5%,特定芯片中的RC振荡器频率为OxID4ED(即120 045 Hz),OxOID4ED可以用作芯片的ID号。大量实验统计数据显示,同一芯片的频率测量误差在1%以内(通电延迟一定时间后测量的目的是等待MCU芯片内部温度稳定,即尽量减少环境温度对结果的影响)(不同芯片在不同环境下的频率误差可能略有不同,可通过多次实验确定。确定频率误差范围的原则是确保每次上电复位后测量的数据在误差允许范围内,因此允许误差不应太小;另一方面,不同芯片频率相同的可能性应尽可能小,因此频率误差的允许范围不应太大)。因此,只要RC振荡器的频率与ID号相比,误差在1%以内是合法的,反之亦然。
加密过程大致如图2所示。虽然不能排除两个芯片频率接近的情况,但如果破解后的程序代码有50%以上无法运行,盗版者会非常担心,知道困难就退缩。
以STM8S207RB单片机芯片为控制核心的某型防盗报警器的实验统计结果如表l所示。可以看出,只要频率误差在1-2%之间,代码 ** 超过50%的芯片无法正确运行。
(2)用RC振荡器频率校正值作为芯片ID号
MCU芯片的内置RC振荡器,如Microchip公司的PIC16/18系列、P89LPC900系列等,有频率校正值(保存在相应的寄存器或片内程序存储器的特定单元中)。在实践中,不同芯片的频率校正值存在差异。对于具有此功能的芯片,可以校正RC振荡器频率作为芯片的ID号,改进控制程序代码的加密功能(操作流程与图1相似)。
虽然频率校正值一般在8位以内,但超过50%的破解控制程序代码无法运行。加密方法的实验统计结果如表2所示。可以看出,频率校正值越长,代码就越大 ** 成功率越低。
四、基于上电标志的加密方法
基于上电标志的加密方法可概括为“设置上电标志,检查芯片加密状态,检查上电标志,随机重写控制程序代码”,主要用于保护既没有芯片 ID号,片中RC振荡器中没有低档MCU芯片的控制程序代码 ** 。
1、加密过程
基于上电标志的加密过程如下。
(1)上电复位后,打开中断前先读出Falsh ROM状态寄存器,确认芯片的加密状态。
(2)如果芯片加密状态正确,检查是否存在第一个通电标志(为了防止误判,通常选择具有一定特征的字符串作为第一个通电标志):如果第一个通电标志不存在,则确定为第一个通电标志,并在设置第一个通电标志后进入正常运行状态。
相反,如果芯片加密状态不正确,可以根据是否存在第一个通电标志进行相应的处理:如果第一个通电标志不存在,则表明芯片从未通电。芯片未加密的原因可能是编程过程中加密锁定位丢失,应进入IAP编程状态对芯片进行加密。如果加密成功,设置第一个电源标志,进入正常运行状态;如果存在第一个电源标志,芯片电源运行,加密位置状态不正确,加密位置可能被人为损坏,应立即启动某个时间器(目的是获得随机数量),然后进入IAP编程状态,随机重写指定程序段的数十到数百字节(无需擦除重写字节的风扇区域,将待改写字节中的“1”改为“01”,破坏应用程序代码的完整性,然后关闭中断进入死循环或复位退出。
加密方法的具体加密过程如图3所示。
这种随机重写程序代码的加密方法非常令人困惑;一方面,无法通过反汇编获得完整的源程序;另一方面,如果随机重写的代码属于非主功能模块,破解的程序运行似乎正常,但它确实是一个不完整、不可预测的程序。
(2)代码检查和生成
为防止犯罪分子通过反汇编和跟踪执行找到并删除随机重写程序段中的指令系列,可以读取重写程序代码段中的指令机器代码,并以数表的形式存储在主程序中。然后在主程序中的适当位置检查随机重写程序段代码的有效性。一旦发现代码无效,进入IAP编程模式,重新生成重写程序段代码。
单片机应用程序加密和解密技术都在进步,可以说几乎没有一种加密技术是绝对安全可靠的。在实践中,为了提高解密难度,尽可能破坏解密代码的完整性,只能根据所选单片机芯片的硬件特性,有选择地交叉组合使用两种或两种以上的加密方法。但是,无论采用何种加密方法,都应尽量避免增加系统的硬件成本,占用MCU芯片的硬件资源,同时也不能显著降低系统的运行效率。本文介绍了三种加密方法,虽然不能完全避免盗版攻击,但多年的实践表明,交叉组合使用这些加密方法可以有效提高MCU芯片控制程序代码的安全性,控制程序代码成功盗窃的机会很小,不占用任何硬件资源,也不增加MCU应用程序系统的硬件成本。
微信