代码保护

2024-10-25

代码保护(共8篇)

代码保护 篇1

0、引言

随着信息技术的发展, 计算机已成为人们工作、学习和生活中不可缺少的部分, 而计算机软件正是推动这一发展的主要动力。然而, 盗版现象日益严重, 引起了许多企业和学者的关注。要解决盗版问题, 一方面应该依靠法律手段, 另一方面应该研究和讨论如何借助各种技术手段来有效保护软件产品, 这对于防止盗版有着重要的现实意义。代码混淆是重要的软件保护技术之一, 它的出现使得攻击者很难通过软件反汇编得到源码或得到的源码不可理解, 从而, 极大地保护了Java、C#等语言开发的软件。

1、代码混淆的定义与目标

代码混淆是为了转换一个程序P到另一个程序P', 使得P'对逆向工程师来说更为困难, 同时P'与P有相同的可观测行为。如果P不能结束或错误结束, 则P'也不能结束或错误结束, 否则P'必须结束并产生和P相同的输出。代码混淆的目标是改变代码使得它很难被反编译, 但事实证明, 只要有足够的时间和资源, 反编译一个程序总是可能的, 因此, 更多的代码混淆理论关注的是通过代码混淆使得反编译的代价超出攻击者通过反编译所获得的收益。

根据代码混淆的定义, 可以得出混淆的目标:

(1) P'和P在输入和执行环境相同时, 输出也必须相同, 一般来说, 只要语义保持不变, 这个条件自然满足;

(2) P'的可理解性要远低于P, 比如说, 逆向工程P的时间要远大于逆向工程P的时间;

(3) 不存在由P'向P的逆变换, 或者很难构造一个工具自动完成这种逆变换, 或者这种逆变换的代价非常高。

2、代码混淆分类

代码混淆可以划分成版面布局混淆、数据混淆、控制混淆等类型[1][2]。

2.1 版面布局混淆

版面布局混淆, 也称符号混淆, 即改变或者去除代码里的信息, 但不改变代码的可执行部分。包括弄乱代码里的标识符和去除代码里的调试信息和注释。在Class中存在许多与程序执行本身无关的信息, 例如方法名称、变量名称, 这些符号的名称往往带有一定的含义。

例如, 某个方法名为setPassword () , 那么这个方法很可能就是用来设置密钥的。符号混淆就是将这些信息打乱, 把这些信息变成无任何意义的表示, 比如替换该方法名为a () , 如图所示, 增加了攻击者破解的难度。对于私有函数、局部变量, 通常可以改变它们的符号, 而不影响程序的运行。但是对于一些接口名称、公有函数、成员变量, 如果有其它外部模块需要引用这些符号, 则往往需要保留这些名称, 否则外部模块找不到这些名称的方法和变量。因此, 对于符号混淆, 最好提供选项, 让用户选择是否、如何进行符号混淆。

2.2 数据混淆

这类混淆不修改代码, 而是混淆数据和程序里的数据结构。良好的编程风格对变量的命名方式都有一些约定, 因此, 把数据编码为有一定意义的变量, 通过消除变量的含义来达到混淆的目的。常用的混淆算法如下:

(1) 拆分变量

例如, 把二进制变量S拆分为两个二进制变量P和Q, 当P=Q=0时S=0, 当P=Q=1时S=1。

(2) 转换静态数据为过程

例如, 字符串是由多个字符构成, 可以设计一个连接字符串的函数, 通过调用函数生成静态字符串。

(3) 改变编码

例如, 整数j可以替换为j', 如图所示, 这里c和d为常数。

(4) 改变变量生命期

例如, 局部变量可以转换为全局变量。

(5) 提升标量为向量

例如, 把所有的循环计数变量放在一个数组里。

(6) 合并标量变量

例如, 合并两个16位的变量为一个32位的变量。

(7) 修改继承关系

例如, 取两个没有关系的不同的类, 以两个类都有的某些特征创建一个新的父类。

(8) 拆分、折叠、合并数组

例如, 改变数组的维数。

2.3 控制混淆

控制混淆的目标是改变代码的控制流但不改变代码的计算部分。通常代码是以逻辑的方式划分成方法, 并把相关代码放在一起。通过组合拆分不相关方法可以打破这种逻辑, 使得攻击者无法理解代码之间的相互关系, 从而达到保护软件源码的目的。

常见的控制混淆方法有:重新排序语句;重新排序循环;重新排序表达式。

目前, 最主要的控制混淆算法是通过增加更多的计算来修改真实的控制流。经常使用的一种基本构造是opaque谓词[3]。这种谓词的值对混淆者是已知的, 而反混淆者却很难推知。通常的方法有:插入无意义的或不相关的代码;由opaque谓词构造这些代码的分支语句;扩展循环条件;用opaque谓词来扩展循环条件;表解释;构造一个简单的虚拟机, 真实的代码由虚拟机解释;可约流图转换成不可约流图。

3、代码混淆的性能指标

通常从强度 (potency) 、抗攻击能力 (resilience) 、代价 (cost) 等方面来评估某个混淆的效果。

(1) 强度--度量混淆后程序增加的复杂度, 在大多数情况下该测度刻画了一个程序被人理解的困难程度。一般来说, 一个应用程序所包含的谓词越多, 条件和循环结构嵌套的次数越多, 该程序的复杂度就越高。因此, 常见的提高强度的方法有:引入新的类和方法增加程序的长度;引入新的谓词以增加条件语句和循环结构的嵌套层数;增加方法的参数的个数;增加继承树的高度等方法都可以提高混淆变换的强度。

(2) 抗攻击能力--度量混淆后程序抵抗自动攻击的能力。强度高的混淆变换并不代表抵抗攻击的能力就强。通常如果某个变换是单向 (one-way) 的, 即变换是不可恢复的, 如从程序中移除有助于人阅读和理解的格式、变量名、注释等不影响程序执行的有关信息, 这种变换的抗攻击能力就是最强的。对于其它例如在程序中加入不改变程序行为的假的谓词等变换, 能够加大攻击者人工阅读时的工作量, 但却是可恢复的变换。

(3) 代价--度量混淆后程序执行时资源耗费的增加, 而资源指的是经过混淆变换后的程序在执行时由变换所带来的额外的执行时间和所需存储空间的开销。某些变换 (如改名, 格式移除是零开销的, 但多数变换都会带来或多或少的时空开销。变换的开销主要来自于代码增加、数据膨胀和循环增多。更为严重的情况是, 原本能正常运行的程序在经过混淆变换后, 可能因为耗尽内存空间而无法运行。例如, 在多层循环内的一条简单赋值语句所带来的开销要远大于在循环体之外的同样的语句所带来的开销。

4、总结与展望

代码混淆是近年来出现的一种新型的软件保护方法。它通过改变原有代码, 加大攻击者识别的难度来提高对软件的保护。目前, 针对代码混淆技术的研究在国内外已取得一定的成果。但是, 现实世界的攻击是多角度与多层次的, 为了给软件提供更强的保护, 使软件更能抵御静态分析、逆向工程和篡改等恶意攻击, 将多种软件保护技术结合起来是一种有效的选择。

参考文献

[1].Christian Collberg, Clark Thomborson, and Douglas Low.A taxonomy of obfuscating transformation[C].Technical Report148, Department of Com-puter Science, University of Auckland, July1997.

[2].Christian Collberg, Clark Thomborson, and Douglas Low.Breaking ab-stractions and Unstructuring Data Structures[C].IEEE International Confer-ence on Computer Languages, ICCL'98.

[3].C Collberg, C Thomborson, D Low.Manufacturing cheap, resilient, and stealthy opaque constructs[C].Proceedings of25th Annual SIGPLAN-SIGACT Symp.on Principles of Programming Languages, ACM, New York, pages184-196, 1998.

代码保护 篇2

本科院校分为A++、A+、A、B+、B、C+、C、D+、D、E+、E共11个等级。A++级学术水平最高,E级最低。

A类是实力较强的本科院校,一般包括985 211等知名院校。

B类属于普通类本科院校,一般包括省市建设类院校。

有的学校只从A里选学生,若果你分数够那个学校但你填在 B里了他不会先考虑你的会从A里挑分数够的,比你低的也要只要够线,若果没招满,有的会补招,很少去B里招,学校认为你没优先考虑他们。

学校代码和专业代码是一样的吗

招生代码和学校代码是一样的,是为全国各高校录取时为方便考生填报志愿而加注的由数字组成的代号串。

院校代码由教育部统一编排,号码有5位。各省教育考试院为方便高考生填报志愿,将有在本地区(包含省、直辖市,自治区)招生计划的高校重新编排,号码有4位。由于每年高校办学情况有变动,故高校代码有调整。

院校代码即院校代号,为全国各高校录取时为方便考生填报志愿而加注的由数字组成的代号串。院校代码就如同是学校的一个身份证号,方便查询学校信息。

教育部为高校编排的代码有5位(此代码全国通用),各省教育考试院为高校编排代码有4位(此代码一般作填报高考志愿用,同一所高校在不同省份代码也不一样),由于高校办学情况每年都有变动,所以高校代码也有变化。

各大学专业代码一样吗

肯定不一样,如果你是考生,应该在高考之前,老师会让你们订至少两本书。一本是报考指南,另一本是各个大学的报考专业代码。建议你看09的那本报考专业的代码书。因为每年的代码都有多多少少的变化。高考毕竟是终身大事,不能马虎,错填一个数都能让你遗憾终身。网上的东西出错的几率很大。

元代码的叙事 篇3

关键词:徐訏 作品 模式化

读过徐訏全集就可以看出,徐訏作品中有许多元代码,作者有意将这些元代码排列组合,添枝加叶,以文学的形式构成多姿多彩的艺术世界。这些模式化通常都反映在作品题材内容、情节及人物上。

一、徐訏作品中的题材模式

在题材内容上,徐訏作品可以分为乡村模式、都市模式、乡村与都市结合模式。

乡村模式主要描写了美丽的田园风光,农村人质朴、善良的性情等。徐訏写于1947年的短篇小说《旧地》是很有代表性的以乡村为题材的小说。《旧地》描绘了一个美丽的乡村—枫木村,那是作者儿时的天堂。《旧地》是回忆性自传体,除了写乡村美丽的田园风光之外,还重点刻画了许多个性鲜明的人物,如裁缝马二、打鸡的阿陀、跛子阿德等。在作者心中,那里人情是温暖的,生命是愉快的。日军侵华时,枫木村被洗劫了,人们死的死、逃的逃,美丽的村子不再如以前。美好事物的毁灭给作者的内心带来了无限悲凉,作者的童年与带给作者早期经验的村子一同逝去,但作者认为这一角世界在记忆中是最美的,最安详的,最温暖的世界。

徐訏作品中大多数还是写都市生活的。他最为出名的《鬼恋》、《风萧萧》都是写在大都市尤其是在上海发生的事。这部分作品描写了都市的繁华气象,都市人的富丽雍容,目光停留在都市上层社会的人士,并对这些人的社交和生活不惜笔墨,对下等人关照的却不多。《鬼恋》描写了主人公“徐”与美丽的“鬼”在大都市上海发生的浪漫传奇故事。《风萧萧》也是把地点集中在上海。此外,《属于夜》等都是描写都市生活的作品。

还有一部分作品是把乡村与都市结合起来写,如短篇小说《滔滔》,写了一个生养在农家,又嫁到了农家的女子小顺嫂,因为看到邻居到城里做女佣回来衣着一新,还带回了许多新奇的东西,便对城里产生好奇,开始向往城里的生活。不久,小顺嫂怀孕了,产后去城里做了奶妈。进城回来后,她看村里和家里的一切都不顺眼了,回到城去在车夫的诱惑下背叛了丈夫。不久,她因奶汁少了而被辞掉,车夫也厌倦了她,她在城里生活不下去只能回家。这类作品把乡村和都市做对比,表现了乡村人的憨直,都市人的势利,也反映了农村的落后,城乡差距的明显。

二、徐訏作品中的人物模式

徐訏笔下的人物模式主要可分为知识分子与交际花、从入世到出世人物、幸福家庭的小姐。

知识分子与交际花是徐訏最青睐的描写角色,他的很多作品都是以知识分子“我”的口吻讲故事。中篇小说《吉布赛的诱惑》描写“我”在回国的途中经过马赛,在那遇到了妓女潘蕊,“我”被她的美貌吸引,坠入爱河。长篇小说《风萧萧》是写抗战时期的间谍战,主人公是知识分子徐和舞女白苹、交际花梅瀛子。短篇小说《属于夜》描写了一对邻居由于工作原因常常在夜里回来时相遇,一个是新闻记者,另一个是舞女。《灯》写的也是在报馆工作的“我”与舞女丁媚卷的故事。徐訏本人是一位学者型作家,他对知识分子的生活应该是最为了解的,而他常常写舞女,他对舞女有欣赏也有同情,从他对舞女的描写上看,他很了解舞女的生活。这类女子大多是神秘的,《鬼恋》中的女子让人以“鬼”的身份出现,《赌窑的花魂》中的女子帮我赌钱,每次都能赢钱,却从不与我提及她的过去。徐訏笔下的知识分子大多在报馆工作。

从入世到出世是徐訏笔下一类人物的经历。这类人物往往是从积极入世到看破红尘,要么以死亡来了结此生,要么选择避世。《鬼恋》中的“鬼”是一个革命者,在经历了大半生的革命工作后,拒绝了人世间的爱情、功名,选择了做“鬼”来了此余生。《幻觉》中的和尚李墨龙在入世时执着于艺术理想抛弃并毁灭了纯洁的女子地美,在忏悔中遁入空门。另一类让徐訏着以笔墨的是幸福家庭的小姐。但实际上,这些看似幸福的小姐们并不幸福。她们家庭环境优越,从小接受着严格正规的教育,有知识,懂艺术。但她们内心都有种反抗情绪,仿佛家庭是她们精神上的桎梏,她们多半是典型的叛逆者。《精神病患者的悲歌》中的司特朗小姐患有精神病,她丢掉书屋、钢琴,经常在晚上开车出门,整夜在酒吧与下等人聚在一起。《花束》开篇就写到“金薇死了”,金薇是金家美丽的女儿,她家住在三开间三层楼的洋房,有很大的花园,家教严格。而她竟怀了三个月的孩子自杀。此外,属于这一类型的还有《风萧萧》中的海伦等。

三、徐訏作品中的情节模式

徐訏作品在故事情节上也是模式化的。他的小说开头总是先设悬念,伏笔过多。《风萧萧》一开头就说主人公的朋友史蒂芬突然多出来了个太太,然后提出疑问,史蒂芬太太到底是什么人呢?小说最后才告诉读者,史蒂芬和史蒂芬太太是为革命需要而伪装的假夫妇。《花束》开篇就写“金薇死了”,之后读者就在作者的悬念牵引下不断地推测金薇的死因,谜底在故事情节的发展中被层层揭开。

《鬼恋》也给人留下悬念,这个神秘的女子真的是鬼吗?《赌窑的花魂》也让人不断猜测,这个神秘女子到底有着怎样的过去呢?这种悬念使读者急于想知道个究竟,激发读者的阅读兴趣,增强了作品的可读性和趣味性。小说中间也有悬念,如短篇小说《心病》中妻子有件事要告诉丈夫,但是一直没有合适的机会,作者不停地设置悬念,使读者急于想知道到底是什么事。

代码保护 篇4

在嵌入式实际应用过程中,因为嵌入式系统其独特性和实时性要求,基本上没有虚拟内存等机制存在,整个内存空间对用户程序开放的。所以不恰当的操作,往往会修改其代码段甚至系统内核,从而导致缺陷缺陷甚至系统崩溃。而对代码段只读区域进行检测保护,是保护一个嵌入式系统可靠性的可行的实现方法。

1 基本技术

1.1 vxworks简介

Vx Works操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

1.2 编译链接过程

Vxworks系统使用linux系统的GNU工具链,其中包括GCC编译器和LD链接器。其编译生成的二进制文件格式符合ELF格式,其系统加载规则符合ELF规定。

1.3 ELF文件简析

ELF(可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI))而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。ELF文件现在已经成为Linux系统下最主要最流行的可执行文件格式。Gcc的默认输出格式就是elf。而Vx Works下生成的程序映像就是ELF格式,如图1所示。

首先是文件头和程序头表,然后依次各个段排列在后。其中每个段的描述均在节头表(section header table)中。比如要查找代码段信息,需要查找ELF文件头中Text段的偏移量和长度。

1.4 CRC校验公式

由于CRC-32的可靠性,把CRC-32用于重要数据存储传输十分合适,所以在通信、计算机等领域运用十分广泛。

对代码段采用CRC-32校验,其中生成多项式为:

Y=x32+x26+x23+...+x2+x+1;

若余式为零则认为存储无差错;若余式不为零则存储有差错。

2 实现方法

在宿主机生成目标印象ELF的之后,编制脚本objdump从而解析出其代码段偏移地址TextSectionOffset和长度Text Section Size。在目标机加载运行后,启动tCheckTextSection任务,定期进行代码段校验,如校验值和初始校验值不相符,则应该进行异常处理(图2)。

在系统加载后,数据段Text Section的值会发生变化,而代码段应该稳定,如果发生变化,则可以断定内存越界错误。而这种错误在自动控制设备中,往往是致命的错误,需要及时处理,否则将造成被控制对象误操作,从而给工业生产带来损失。

在系统加载后,数据段TextSection的值会发生变化,而代码段应该稳定,如果发生变化,则可以断定内存越界错误。而这种错误在自动控制设备中,往往是致命的错误,需要及时处理,否则将造成被控制对象误操作,从而给工业生产带来损失。

因为本系统是智能电网电力自动化设备,控制对象是国家电网,如果系统错误动作将会造成错误供电或者错误断电,影响很大。目前本系统采用的异常处理,即立刻停止所有后续操作,并且使系统进入安全模式。在安全模式中对系统进行最小化动作处理后系统重新加载代码段。

3 下一步工作

在实际工程实践中,此方法证明可以稳定有效的保证代码段的完整性,在下一步的工作中,但是没有对代码段的内部结构进行分析。其可以继续细分为系统内核,核心任务,应用任务。可以对其进行重要性,优先级排序后,当次要模块被修改后,只需要重新加载其代码而不是整个系统映像重新加载一遍。

参考文献

[1]Wind River System.VxWorks_BSP_Reference www.wind_river.com.2004.

股票代码决定市值? 篇5

截至首日收盘,Midcoast, Springleaf,58.com以及OCI的股价涨了,而Essent, Brixmor, Mavenir和 Twitter的股价都跌了。我们很难在其中找到什么输赢的规律,许多专家也认为不可能在短期内准确预测股价。

短期投资无疑是一场赌博,但你仔细看上述股价大涨的公司,会发现其中的奥秘:它们的股票代码都可以按英语发音规则拼读,不用再添加其他发音。可读的OCIP, MEP, LEAF, and WUBA (即OCIP,Midcoast,Springleaf,和58.com) 不同程度地上涨了,而不可读出的ESNT, BRX, MVNR和TWTR (Essent, Brixmor, Mavenir还有Twitter的代码)则下跌了0.5个百分点到14个百分点。

回顾1990—2004年间在美上市的近一千只股票的表现,这种发音带来的神奇效果在IPO最初的那几天非常明显;时间越久,这种趋势会变弱,但没有消失。假如投资者投资1000美元在可读代码的股票上,第二天,可能会比等额投资在不可读代码股票上的人多挣85美元。而且,公司名字越简单的(如NOVA公司),其业绩表现也优于名字复杂的企业,比如匈牙利电讯股份公司(Magyar Telekom Tavkozlesi Reszvenytarsasag)。

为什么投资者一方面要分析大量数据来了解公司的实际状况,另一方面也要基于股票代码来作出决定?答案就是,人们通常偏爱那些简单的事物,读那些读得出的股票代码要相对容易些。同样的逻辑也解释了为什么人人都喜欢名字比较简单的人。在通常情况下,越简单的东西似乎越熟悉、风险小、威胁小、更可信。有些投资者潜意识里会按名字选股,结果命中率也蛮高的。

代码保护 篇6

目前为止,有些厂商采取先预先加密软件代码,写入存储器中,执行时,通过软件解码来实现对代码的保护,但是这种方法效率低,成本高,实用性比较低;现有的一些硬件加解密系统,只能保护有限类型的NAND-Flash存储器中的代码,并且系统中的密匙一旦固化就无法改变。针对这些局限性,本文提出了一种全新的嵌入式产品软件代码保护系统,该系统适用于目前通用的基于I2C、SPI总线的EEPROM和Flash;以及主流厂商的NAND-Flash。

1 嵌入式软件代码保护系统构成

嵌入式软件代码保护系统由两部分组成:PC机上运行的TDES加密软件和硬件电路中隔离处理器与软件代码存储器直接通路的代码保护芯片组成,如图1所示。PC机上的TDES程序对嵌入式软件代码进行加密,生成密文形式的数据,并写入软件代码存储器中,供嵌入式系统使用;同时通过GPIO口模拟I2C或者SPI通信协议,对代码保护芯片中,存放相关重要数据的EERPOM区域进行配置:达到诸如更改代码保护芯片中TDES的密匙的目的。

代码保护芯片内嵌于嵌入式系统的硬件电路中,用户可以选择隔离处理器和指令代码存储器之间的通路:所有写入存储器的数据将被加密后才写入其中; 所有从存储器中读出的数据将被解密后才送回给CPU执行;用户也可以选择不隔离处理器和存储器之间的通路:读写操作将不会进行任何加密和解密。

2 代码保护芯片设计

2.1 内部结构简介

代码保护芯片隔断了原有嵌入式系统处理器和软件代码存储器之间的直接通路,如图2所示。该系统主要分成主从I2C总线接口模块、主从SPI总线接口模块、Nand-Flash通信模块以及核心控制模块。

如果用户选择I2C接口,芯片将通过I2C总线和存储器进行通信,如果用户选择SPI接口,芯片将通过SPI总线和存储器进行通信,否则芯片将通过NAND-Flash模块和存储器进行通信。

如果用户选择加密模式,那么处理器和存储器之间的通路将被隔断,所有准备写入存储器的数据经过TDES加密后才写入其中,所有从存储器读入的数据经过TDES解密后才送回至处理器执行;如果用户选择不加密模式,那么处理器将直接和存储器进行通信,代码保护芯片将不启动任何加密/解密操作。这种设计方式,使得芯片可以适用于更多的嵌入式系统,同时也给予用户最大限度的灵活性。

2.2 核心处理模块

核心处理模块是整个系统的核心部分,如图2所示:主要完成指令译码、控制FIFO的读写、控制TDES加密/解密的运行,控制I2C、SPI、通用Nand-Flash模块和外界的数据接收和传送以及对内部EEPROM进行操作。当代码保护芯片接收到处理器发出的读数据命令后,将从存储器中预取64字节的数据,然后进行TDES解密。解密的同时,芯片再次从存储器预取64字节的数据,写入内部的另外的64字节FIFO中:乒乓FIFO架构的设计以及采用流水线技术的TDES加密/解密,大大提高了代码保护芯片的效率。

2.3 芯片内部EEPROM存储数据内容介绍

由于存储器出自不同的厂商,因此对于存储器的读写等命令存在着一定的差异,为了满足系统对不同厂商芯片的适用性,该代码保护芯片内部内嵌了一个64字节的可读写EEPROM,用来存放一些特殊的数据,用户可以通过特殊的命令,达到对相关地址的写操作。相关地址存放数据如下所示:

地址0x00至0x05:分别代表SPI读操作指令代码、SPI写操作指令代码、SPI写状态寄存器指令代码、SPI读状态寄存器指令代码、SPI关闭写操作指令代码、SPI允许写操作指令代码。

地址0x06至0x07:分别代表I2C器件地址、I2C有效地址字节数。

地址0x08至0x0D:分别代表NAND-Flash读操作指令代码1、NAND-FLASH读操作指令代码2、NAND-FLASH读操作指令代码3 、NAND-FLASH页编程操作指令代码1、NAND-FLASH页编程操作指令代码2、NAND-FLASH有效地址字节数。

地址0x0E至0x25: 分别代表24字节的TDES密匙。

地址0x25以后的区域为保留区域,预留给将来使用。

3 代码保护芯片设计实现

3.1 综合结果

本文设计的嵌入式软件代码安全保护芯片,使用Verilog语言进行编程,并进行了功能验证,使用Quartus-7.2进行了综合及布局布线,并完成了后仿真。实验结果表明,整个系统适用的时钟工作频率介于4MHz和96MHz之间,满足目前主流的嵌入式系统的数据读写速度。使用Stratix II系列的EP2S15F484C3器件进行了综合,综合结果见图3:

3.2 系统性能分析

3.2.1 基于I2C/SPI接口的存储器

当代码保护芯片第一次从处理器接收连续读操作指令后,由于代码保护芯片需要从存储器预取64字节,所以必须等待1.28ms(和存储器通信的频率为400K);因为代码保护芯片采取流水线技术的TDES,所以第51个时钟周期后[3],解密后的数据就可以传送回处理器,由于在向处理器传送数据的同时,代码保护芯片也同时从存储器接受数据,因此,处理器不需再等待额外的时间,就可以连续的从代码保护芯片接受解密后的指令。因此当系统时钟工作频率为4MHz,处理器必须等待1.29275ms后,才可接收数据;当系统始终工作频率为96MHz,处理器只须等待1.28053ms后,就可接收数据。

3.2.2 Nand-Flash存储器

目前主流的Nand-Flash器件,其最大的串行读出数据时间为50ns,预取64字节,必须等待3200ns,TDES解密时间同节3.1.1,因此当系统时钟工作频率为4MHz,处理器必须等待15.95us后,才可接收数据;而当系统时钟工作频率为96MHz,处理器只须等待3.73125us后,就可接收数据。

本文设计的嵌入式软件代码保护系统,已经成功地对国家半导体公司的CAT1026芯片存储器进行解/加密读写操作,虽然基于TDES的加密和解密的过程降低了嵌入式系统的运行速度,但是以少量降低性能换取更高的产品安全性,对于用户来说,是完全可以接受的。它对于保护公司的知识产权、提高产品的市场寿命有着重要的、积极的意义,有着极为广泛的应用前景。

参考文献

[1]National institute of standards and technology.Data Encryption Standard(DES).FIPS PUB 46-3,1999.

[2]SCHAFFER T,GLASER A,FRANZONP D.Chip-package co-implementation of the triple-DES processor,advanced Packa-ging.IEEE Transaction 2004,27(1):194-202.

[3]王莆莉,陈健,郭晋亮.3-DES IP核的VerilogHDL设计[J].电子技术应用,2007,(1)

[4]君凯,吴延军.嵌入式计算机加密存储系统研究.电子技术应用.2007,(10)

[5]KiSeun Kwon,YoungMinYi.Embedded Software Generation from System Level Specification for Multi-tasking Embedded Sys-tems.ASP-DAC,2005.

代码保护 篇7

嵌入式系统是指采用微处理器(单片机、ARM等)完成特殊的功能。同时其采用完全独立的操作系统,且不需要大量的外围器件,因此在功能、可靠性、成本、体积、功耗上有着巨大优势,已经成为电子信息产业中最具增长力的一个分支,在无线通信、网络传输和应用、科学研究、图像处理以及手机、液晶电视等与人们日常生活息息相关的领域中得到了广泛应用。在2011年中国互联网大会上,ARM中国区总裁吴雄昂透露,ARM架构芯片在2010年全球的出货量已经达到12亿,占到智能手机90%以上,可见嵌入式系统迅猛的发展和巨大的潜力[1,2,3]。

嵌入式系统是软件和硬件高度结合的产物,软件是整个系统最核心的部分。为了提高执行速度和系统可靠性,嵌入式系统中的软件代码一般都被固化在诸如EEPROM,Flash等存储器中,因此代码非常容易被黑客破坏、被竞争对手恶意窃取。这对于开发嵌入式产品的厂商而言,是一个致命的打击:产品的生命周期大大缩短,公司的效益大大降低,甚至因此面临倒闭的巨大风险。故而如何保护自身的产品已经成为嵌入式产品领域一个亟待解决的问题。

目前针对嵌入式代码的加密方案有软件加密和硬件加密。软件加密易于实现,成本也较低,但是其核心模块容易被跟踪和替换,且通常会占用较多的主机系统资源,大大降低整个系统的工作效率,因此在实际应用中很少采用。硬件加密在产品设计上嵌入一种特殊的安全芯片,应用软件通过和安全芯片通信来控制程序的流程,从而达到保护整个系统的目的。由于系统将大部分工作放在安全芯片内部,不影响系统的整体性能,而且对密钥的管理更加隐蔽,所以更适合于嵌入式软件的保护。但专用加密芯片的开发成本较高,开发周期相对较长。依据FPGA的可编程特点,其通用性强于专用加密芯片,只需修改程序,即可实现各种加密算法,同时缩短开发周期,节省开发成本。

本文提出一种针对主流存储器的加密存储方案,采用TDES加密算法,使用FPGA实现。该系统完全独立于原嵌入式系统,因此它不改变嵌入式软件的功能、结构,密文与明文数据量相同,无须功能性更改硬件电路,可以实现全方位的软件保护,防止软件被抄袭、篡改,大大延长了产品的生命周期。

1 代码保护系统构成

整个系统结构如图1所示。I2C/SPI模块用来接收传输来自CPU的数据;收发控制/指令译码模块用来译码接收到的数据,并产生相应的操作命令;为了保证数据的正确性,CRC校验模块对I2C/SPI接收数据进行有效性确认,为了使安全芯片有更广泛的适用性,用户可以通过外部端口选择CRC8或者CRC16以及I2C或者SPI传输协议。

内部状态机如图2所示,它对接收到的数据进行命令有效性分析、CRC校验分析、命令解析等一系列运算。

1)状态机检测到来自I2C/SPI总线的起始信号后,如果用户选择CRC8校验,将连续接收9 byte的数据,其中最后1 byte数据为CRC8的校验位;如果用户选择CRC16校验,将连续接收10 byte的数据,其中最后2 byte数据为CRC16的校验位。

2)如果CRC校验通过,则启动TDES解密,由于从总线上的接收数据是直接写入FIFO中,因此DMA方式在设计中被应用:FIFO中的数据被直接搬入TDES中进行解密,完成后再被写回FIFO中,通过这种方式,大大节省了解密的时间。

3)解密后状态机对命令进行分析,如果是非法命令,那么状态机将执行类似步骤1)和步骤2)中的动作。根据计算摘要中的后续明文长度,接收相应的数据;或者接收长度为24 byte的Key;或者接收8 byte的摘要。

4)解密结束后,如果是计算摘要命令,那么状态机将对TDES和DMA进行相应的配置,进行数据的加密并且将计算得出的摘要放入内部寄存器中;如果是重写Key命令,则状态机将接收到的24 byte的Key写入相应的TDES内部寄存器中;如果是摘要验证命令,则状态机将接收的摘要和芯片内部运算后的摘要进行比较,然后将相应的结果写入FIFO中,再进行数据的加密并通过总线接口,将数据返回给CPU。

2 系统验证

用户首先将需要被保护的代码生成摘要(Digest),此段摘要码会放入代码区的由用户指定的位置,程序执行时,将需要保护的代码首先分段发送给安全芯片,发送完毕后再发送摘要码。安全芯片通过计算反馈给CPU认证结果,如果被保护的代码被修改,则认证无法通过,代码验证失败,如图3所示。

2.1 系统命令

为了使保护系统有更广泛的通用性,用户可以通过重新写Key的特殊指令,改变安全芯片内部的TDES的Key。其他握手协议命令如表1~5所示。

3 实验结果与分析

本文设计的软件代码安全保护芯片,使用Verilog语言进行编程,并进行了功能验证,使用Quartus II软件进行综合及布局布线。整个系统的工作频率在4~72 MHz之间,由于标准I2C/SPI工作频率仅仅为400 kHz,所以该安全保护芯片满足目前主流需求。

由表6和图4~5可知,安全芯片通过I2C接收的数据,经过内部TDES解密后,明文和用户的完全一致。

4 结束语

本文提出的主流存储器加密存储方案,经过仿真和FPGA验证,功能正确,能够很好地保护嵌入式软件代码,极大地提高了嵌入式系统的防破解能力以及嵌入式软件的安全性和适用性。该安全芯片已成功运用在立体声蓝牙耳机、机顶盒等产品中。如果该方案能够在将来进行量产,必将以其体积小、使用方便、安全可靠等特点在嵌入式系统中得到广泛应用[4,5,6]。

摘要:针对嵌入式系统软件代码容易被盗用的问题,提出了一种基于高速TDES的加密系统,由PC机上运行的预加密软件和安全芯片两部分组成,能够防范当前各种针对嵌入式计算机的软件程序的恶意窃取以及修改,有效保护Flash存储器中的嵌入式软件代码。

关键词:嵌入式,Flash,TDES

参考文献

[1]SAPUTRA H,CHEN G,BROOKS R R.Code protection for resource-constrained embedded devices[J].Sigplan Notices,2004,39(7):240-248.

[2]黄君凯,吴延军.嵌入式计算机加密存储系统研究[J].电子技术应用,2007(10):138-140.

[3]胡向东,魏琴芳.应用密码学教程[M].北京:电子工业出版社,2005.

[4]颜重光.具有保密功能的MCU+FPGA片上系统[J].电子设计应用,2004(8):110-111.

[5]朱琦.信息安全:应用程序代码保护[C]//中国造船工程学会2008年MIS/S&A学术交流会.[S.l.]:中国造船工程学会,2008:141-143.

代码保护 篇8

高性能并行计算是现代科学研究、工程技术开发和大规模数据处理的关键技术,而并行编译系统是并行计算机系统软件中十分重要的一部分,提高并行编译技术对充分利用并行机资源和提高并行机效率起着十分重要的作用。

并行编译器包括前端处理和后端处理两部分:前端处理主要包括逻辑上的并行识别、计算和数据划分、依赖关系识别;后端处理主要是并行代码的自动生成,代码生成的关键在于如何高效地生成同步通信代码。

并行程序中的通信主要由四部分组成:数据初始分布通信、计算前的数据准备通信、计算过程中的同步通信以及数据收集通信。初始数据分布通信是在进行数据的初始分布过程中引起的通信。由于初始分布中数据划分和计算划分不能做到完全对齐所引起的通信称之为数据准备通信。同步通信是在进行并行计算过程中产生的通信。数据收集通信是所有进程计算结束后,主进程把所有进程的计算结果收集起来得到程序的最终执行结果时所引起的通信。本文重点讨论计算中的同步通信问题。

在文献[1]中对代码生成和通信优化做了介绍,但对具体如何实现没有讨论,本文则提出利用命名的线性不等式系统来表示数组数据空间、循环迭代空间、虚拟处理器空间和物理处理器空间,并建立了它们之间的内联关系,在此基础上给出了同步通信代码的自动生成算法。

1 计算划分

在分布式存储的大型计算机中,循环级的并行性一般是通过对循环嵌套迭代空间进行计算划分并将循环迭代分布到多个进程同时执行来实现的。下面给出与计算划分相关的定义。

定义1 迭代空间 迭代空间I表示一个循环边界是循环索引的线性函数且深度为m的循环嵌套,该空间是一个m维多面体。循环嵌套的每个迭代对应多面体中的一个整数点,即一次计算操作,用索引向量undefined表示。

定义2 处理器空间P 处理器空间P表示一个n维的处理器数组。

定义3 计算划分[4]C 计算划分undefined是满足特定关系的迭代和处理器对undefined的集合,处理器undefined执行迭代undefined当且仅当undefined。其中U是一个扩展的幺模矩阵,undefined是整数向量,B是整数矩阵,undefined是符号向量,undefined。

在计算划分C中,U指示计算划分是对迭代空间的哪些维进行划分以及是正分还是斜分;undefined给出分块的大小;undefined是偏移的大小。计算划分在代码生成的前一遍自动生成。

2 读写依赖关系与LWT树

计算中的同步通信由读写依赖关系和计算划分共同确定,对依赖关系有如下定义。

定义4[5] 嵌套循环L中的语句T的一个实例T(j)和语句S的一个实例S(i),如果存在一个存储单元M满足下述条件,则称语句T的实例T(j)依赖于语句S的实例S(i):

(1) S(i)和T(j)都引用(读或写)M;

(2) 在程序串行执行时,S(i)在T(j)之前执行;

(3)在程序串行执行时,从S(i)执行结束到T(j)开始执行前,没有其他实例对M进行写操作。

一对语句实例可以用4种不同的方式引用相同的存储单元,因此有4种类型的依赖关系:

① 如果S(i)写M而T(j)读M,则T(j)流依赖于S(i);

② 如果S(i)读M而T(j)写M,则T(j)反依赖于S(i);

③ 如果S(i)写M而T(j)也写M,则T(j)输出依赖于S(i);

④ 如果S(i)读M而T(j)也读M,则T(j)输入依赖于S(i)。

在这4种依赖关系中,④不会影响程序的并行化,不会引起通信,②和③的依赖关系是可以消除的,也不会引起通信,只有①需要通信,本文中的同步通信即指由流依赖所引起的通信。

在进行依赖关系分析时,用LWT树来表示数据之间的读写关系,每对读写对对应一棵LWT树。LWT树是一棵二叉树,表示精确的数据流信息,是描述从读操作实例到提供该读操作所读数据的最后一次写操作实例的映射关系。若读、写分别用循环索引undefined和undefined表示,则该函数的定义域是所有满足循环边界限制的undefined的集合。LWT树包括根节点、叶节点和内节点,内节点是对读undefined进一步的限制,叶节点又分为⊥节点和非⊥节点,表示了不同的依赖关系。

LWT[3]树把循环嵌套划分为以其每个叶节点的内容(contexts)ι为元素的集合,undefined。如果一个contextι∈I中迭代所读的值是在循环中产生的,则存在最后写关系undefined,且读迭代undefined所读值在写迭代undefined中产生},其中undefined和undefined是线性函数。

对给定的读迭代,从LWT知道一个写迭代undefined修改了undefined所读的数据且undefined是修改该数据的最后一个写操作,因此可以定义一个写迭代和读迭代之间的函数来表示undefined到undefined之间的关系,记为L,这样就可以通过LWT计算出两次引用之间的数据流依赖向量。

定义5 最后写关系LasarLasar是从读数组访问undefined和读迭代undefined到写数组访问undefined和写迭代undefined的映射,undefined当且仅当undefined;undefined;undefined;undefined且undefined使得undefined;undefined;undefined,其中undefined和undefined是读写访问函数。

由定义5知道,如果写迭代undefined和读迭代undefined都访问同一数组元素undefined之前执行,而且在undefined之间不存在其他迭代修改数组元素undefined则undefined之间存在最后写关系。

通过建立LWT树的方法可以将依赖关系精确到具体数值,这就为各进程之间的通信提供了关键依据。依赖关系分析是在代码生成的前一遍自动生成的。

3计算代码和计算中同步通信代码的自动生成

在并行程序代码自动生成中将涉及到多个多维整数空间,包括数组数据空间、循环迭代空间、虚拟处理器空间和物理处理器空间等。定义1和定义2分别给出了循环迭代空间和处理器空间的定义,下面给出数据空间的定义:

定义6 一个m维的数组A[n0][n1]…[nm-1],li≤ni≤ui,0≤i≤m-1,定义了一个m维的数据空间,该空间每一维的上下界即是数组每一维的上下界li和ui。

用命名的符号系数不等式系统统一表示这些空间,该不等式系统由多个不等式组成,每个不等式表示一种变量之间的关系,每个变量表示的即是空间的某一维。变量的所有可能的整数解的集合用n维离散的笛卡尔空间表示(n是变量数),所有满足该不等式系统的解都与笛卡尔空间中的一个整数点相对应。

计算代码和同步通信代码的自动生成过程分三部分:生成数据的接收和解包代码、生成计算代码、生成数据打包和发送代码。自动代码生成的关键是在程序的什么地方插入何种方式的通信代码?首先判断是否需要进行同步通信,如果LWT树中读的数据不在当前进程则需要通信,且利用计算划分来确定应该与哪个进程进行通信。

定理1 计算划分C满足最后写关系μ的通信集是undefined的集合,其中,undefined。

定理1所处理的是LWT树中的非⊥节点,根据LWT提供的读写依赖关系和读写变量所在

迭代的取值范围以及计算划分来判断两个迭代之间是否需要进行通信,见图1[1]。从图中可以看出,读/写迭代通过计算划分C分布到不同的进程pr和ps,两者之间通过LWT树联系在一起,若undefined则需要通信。

对于每一个物理进程mypid,通过以下算法判断是否需要发送数据给其他进程。

算法输入:计算划分C、依赖关系LWT、处理器空间P、迭代空间I

算法输出:并行同步通信代码和计算代码

算法描述:

(1) 建立虚拟拓扑结构把当前进程的标识mypid转换为多维坐标表示的pids;

(2) 通过计算划分和循环迭代范围得到参与计算的进程范围Pe;

(3) 如果pids∉Pe则不需要通信,否则;

(4) 根据计算划分C得到pids的迭代范围is;

(5) 根据LWT树中非⊥节点提供的读写依赖关系信息得到与is对应的ir;

(6) 依据ir和计算划分C得到ir所在的进程pidr;

(7) 比较pidr和pids是否是同一进程,如果二者相同则不需要同步通信,否则;

(8) 产生同步发送代码:打包数据并发送给pidr。

相应的,进程也需要判断是否需要接收其他进程发送来的数据:

(9) 通过建立的虚拟拓扑结构把当前进程的标识mypid转换为多维坐标表示的pidr;

(10) 通过计算划分和循环迭代范围得到参与计算的进程范围Pe;

(11) 如果pidr∉Pe则不需要通信,否则;

(12) 根据计算划分C得到pidr的迭代范围ir;

(13) 根据LWT树中非⊥节点提供的读写依赖关系信息计算出ir对应的is;

(14) 依据is和计算划分C得到is所在的进程pids;

(15) 比较pidr和pids是否是同一进程,如果二者相同则不需要同步通信,否则;

(16) 产生同步接收代码:接收pids发送来的数据并解包数据。

最后生成计算代码,根据上一遍提供的计算划分C和循环迭代I的边界信息计算出执行计算的进程范围,再依据分块执行的原理把计算分布到各进程执行。

4 实例分析

以下例来说明上面的算法:

例1 for(i=0;i<=N-1;i++)

for(j=i;j<=N-1;j++)

for(k=N-1;k>=i;k--)

a[j][k][i]=a[j][k][i]+a[i][k][j]*a[j][i][k]/a[i][j][k];

该例计算划分C:pid0=-k,pid1=i;迭代空间I:0≤i≤N-1;i≤j≤N-1;i≤k≤N-1,LWT树见图2。从图中可以知道数组引用a[j][k][i]和a[i][j][k]之间存在读写依赖关系,其依赖关系为:ks=-jr;js=ir;is=kr。

设N=4,则由计算划分C和迭代空间I可以计算出虚拟处理器空间P为-3≤pid0≤0,0≤pid1≤3。在生成同步通信代码时,首先判断是否需要进行通信,如果需要通信则产生同步通信代码。以pidr0=-2,pidr1=1为例来说明,根据计算划分C知道ir=1;kr=2;ir≤jr≤3,进而根据LWT树提供的读写依赖关系得到is=2;js=1;-3≤ks≤-1。得到写迭代之后,再根据计算划分C就可以找到该写迭代所在的进程为-3≤pids0≤-1,pids1=2。最后比较pids和pidr是否是同一进程,不是则产生两个进程之间的同步通信代码。此例pidr≠pids,则两个进程之间需要通信,进程pids产生同步发送代码,进程pidr产生同步接收代码。

5 总结与展望

本文主要讨论串行程序并行化中涉及到的计算代码和计算中同步通信代码的自动生成。文中所介绍的算法已在SUIF编译架构上实现,并利用ppopp benchmark程序集进行了验证,实验结果表明该算法能够正确生成计算代码和同步通信代码,但在该算法中未对同步通信的优化进行处理。下一步将主要研究计算中同步通信的优化问题,如多维并行条件下的计算和通信的重叠等。

摘要:简要介绍了并行编译中的计算划分和依赖关系分析,提出如何利用计算划分和依赖关系自动生成并行程序中的计算代码和同步通信代码。

关键词:计算划分,依赖关系,最后写树,同步通信

参考文献

[1]Amarasinghe S P,Lam M S.Communication optimization and CodeGeneration for distributed memory machines.In the Proceedings of TheACMSIGPLAN′93 Conference on Programming Language Design andImplementation,Albuquerque,New Mexico,June,1993:126-138.

[2]Ferner G S.The Paraguin compiler Message-passing code generation u-sing SUIF.In the Proceedings of the IEEE SoutheastCon 2002,Colum-bia,SC,April 5-7,2002:1-6.

[3]Maydan D E,Amarasinghe S P,LamMS.Array data-_flowanalysis andits use in array privatization.In the Proceedings of ACMSIGP-LAN-SI-GACTSymposium on Principles of Programming Languages.Charles-ton,South Carolina,January 10-13,1993:2-15.

[4]Anderson J M,Lam M S.Global Optimizations for Parallelism and Lo-cality on Scalable Parallel Machines.In Proceedings of the SIGPLAN′93 Conference on Program Language Design and Implementation,June1993.

上一篇:空间规划下一篇:事业单位内部风险控制