工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->综合电路图->综合电路图->轻松搞定Silicon Labs 8bit MCU 代码加密

轻松搞定Silicon Labs 8bit MCU 代码加密

作者:angelazhang时间:2015-10-11

为了防止未经授权访问或拷贝单片机的机内程序,大部分芯片都带有加密锁定位或者加密字节,以保护片内程序。如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机芯片内的程序。


芯片加密,很好的保护了芯片,防止芯片里面的程序被盗走,保护了程序设计者的专利权。世强代理的Silicon Labs MCU 具有先进的代码加密技术,简单易用,可靠性高。下面就世强代理的Silicon Labs MCU 加密问题,提供几个简单易用的窍门。首先我们介绍Silicon Labs MCU是如何加密的。在芯片例如C8051F350的datasheet中“FLASH存储器”章节中的“安全选项”里会有介绍。


安全选项

CIP-51提供了安全选项以保护FLASH存储器不会被软件意外修改,以及防止产权程序代码和常数被读取。程序存储器写允许(PSCTL寄存器中的PSWE)和程序存储器擦除允许(PSCTL寄存器中的PSEE)位保护FLASH存储器不会被软件意外修改。在用软件修改FLASH存储器的内容之前,PSWE必须被置为逻辑‘1’;在用软件擦除FLASH存储器之前,PSWE位和PSEE位都必须被置为逻辑‘1’。此外,CIP-51还提供了可以防止通过C2接口读取产权程序代码和常数这一安全功能。保存在FLASH 用户空间的最后一个字节中的安全锁定字节保护FLASH 存储器,使其不能被非保护代码或通过C2 接口读、写或擦除。FLASH 安全机制允许用户从0 页(地址0x0000 ~ 0x01FF)开始锁定n 个512 字节的FLASH 页,其中n 是安全锁定字节的反码。注意:当任何一个其他FLASH 页被锁定时,包含FLASH 安全锁定字节的页也被锁定。见下面的例子。

安全锁定字节: 11111101 b

反码:         00000010 b

被锁定的FLASH页: 3(前两个FLASH页 + 锁定字节页)

被锁定的地址: 0x0000 -0x03FF(前两个FLASH页)

0x1C00 - 0x1DFF(锁定字节页)



简单的说,如果需要加密某些flash空间的代码,就对安全锁定字节写数据0,如果需要锁定整个flash空间,就对整个安全锁定字节全部写数据0。那么如何在代码中实现这个加密呢?如何在烧写芯片的时候,就对代码加密?来点实际的,见下面的例程:


方法一:直接修改HEX文件

最简单直接的方法,修改hex文件。如果我们了解hex文件的代码规则,就很简单实现这个加密,这种加密在代码烧录进去的时候,就实现了加密,不管这颗芯片是否被使用或被运行过,都已经加密。绝对保护你的代码。首先介绍hex文件的代码规则:

HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:

每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:

: 每个Intel HEX记录都由冒号开头.

ll 是数据长度域,它代表记录当中数据字节(dd...)的数量.

aaaa 是地址域,它代表记录当中数据的起始地址.

tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:

00 – 数据记录

01 – 文件结束记录

02 – 扩展段地址记录

04 – 扩展线性地址记录

dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.

cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行补足.

以上是介绍了HEX代码规则,知道了这个规则就很容易实现我们的代码加密。看看下面的实例:C8051F02x


用户代码

:02FDFE00000003

:00000001FF

说明:

02 – 需要写入的字节数

FDFE – 需要写入数据的flash起始地址

00 – 记录类型 (normaldata)

0000 – 需要写入的数据

03 – 校验码

00000001FF – hex文件结束行


这个例程说明,只需要在hex文件的结束行前面加入一行代码,这行代码在烧录的时候,就会把值写入安全选项字节,实现加密。下面再看一个C8051F350的例程:


用户代码

:011DFF0000E3

:00000001FF

说明:

01 – 需要写入的字节数

1DFF – 需要写入数据的flash起始地址

00 – 记录类型 (normal data)

00 – 需要写入的数据

E3 – 校验码

00000001FF – hex文件结束行


仔细阅读会发现和F02x有点不一样,因为C8051F02x的安全选项字节是2个字节,而F350只有1个字节。所以具体要看芯片的不同而定义。

文件夹中有一个HEX文件校验码计算工具可以试试。


方法二:在编程的时候添加代码实现 ASM

对于以上方法是比较容易,只要修改hex文件,但是如果不熟hex代码规则,或者不放心这么做,是不是可以在编程的时候添加代码,让编译器来实现这个加密的过程。答案是完全可以的。来看看下面的实例:

1、在keil51中新建工程,芯片选择C8051F350。添加好main函数。编译一下。

2、新建一个汇编文件,文件名后缀是“asm”。在这个文件中添加一下代码:

CSEG AT 0x1dff ;定义安全选项字节的起始地址

DB 00H;需要写入的数据

end                  

3、把这个文件添加到工程,并放在工程文件的最后面,这样生成代码的时候,可以编译在最后面,方便查看。

4、编译一下文件,顺利通过,查看hex文件,会发现和之前手动在hex文件中添加是一样的。

5、这个例程可以查看文件夹中的“C8051F代码加密例程 asm”。采用Keil uvision4编译器工程。


方法三:在编程的时候添加代码实现 C

在方法二中,是通过添加汇编文件实现的,那如果不想添加汇编文件如何实现呢?就看

在C语言文件中嵌入汇编代码来实现。

1、在keil51中新建工程,芯片选择C8051F350。添加好main函数。编译一下。

2、新建一个C文件,在这个文件中添加一下代码:

#pragma asm

CSEG AT 0x1dff          //定义安全选项字节的起始地址

DB 00H        //需要写入的数据

#pragma endasm

3、把这个文件添加到工程,并放在工程文件的最后面,这样生成代码的时候,可以编译在最后面,方便查看。

4、编译一下文件,会发现不能通过编译。注意:如果在c51程序中使用了汇编语言,注意在Keil编译器中需要激活Properties中的“Generate Assembler SRC File”和“Assembler SRC File ”两个选项。注意这个是灰色的打勾,一定要重新打钩激活。


再查看工程窗口的文件图标发现:多了3个小红色方块。这就说明设置成功。重新编译文件,发现编译通过。

5、查看hex文件,会发现和之前手动在hex文件中添加是一样的。

6、这个例程可以查看文件夹中的“C8051F代码加密例程 C”。采用Keil uvision4编译器工程。


方法四:在下载程序时加密

在使用下载器给芯片下载程序的时候,在下载界面的加密复选框勾选也可以实现代码加密,这里不做详细说明,可以查看所使用的下载器说明书。


加密后的操作

1、只能擦除整片芯片

2、读取芯片代码,数据全部是00

3、不能对芯片再次烧录,除非先整片擦除。



评论

wjl · 2016-06-12 09:47:21

不错,非常有用

技术专区