软件加密技术及实现.docx

上传人:b****6 文档编号:5999568 上传时间:2023-01-02 格式:DOCX 页数:65 大小:78.75KB
下载 相关 举报
软件加密技术及实现.docx_第1页
第1页 / 共65页
软件加密技术及实现.docx_第2页
第2页 / 共65页
软件加密技术及实现.docx_第3页
第3页 / 共65页
软件加密技术及实现.docx_第4页
第4页 / 共65页
软件加密技术及实现.docx_第5页
第5页 / 共65页
点击查看更多>>
下载资源
资源描述

软件加密技术及实现.docx

《软件加密技术及实现.docx》由会员分享,可在线阅读,更多相关《软件加密技术及实现.docx(65页珍藏版)》请在冰豆网上搜索。

软件加密技术及实现.docx

软件加密技术及实现

软件加密技术及实现加入收藏

网站地图

网站搜索

简繁默

首页图片热点专题动网新闻.Net技术文章Flash欣赏新闻信息网络文摘星座命理英语学习论坛

首页→技术文章→加密解密算法

阅读新闻

 

软件加密技术及实现

[日期:

2004-07-30]来源:

csdn作者:

whinah[字体:

大中小]

软件加密技术及实现

雷鹏

(桂林电子工业学院计算机系)

摘要

当今盗版软件的泛滥成灾几乎已经成为了我们中国民族软件的灾难,为了防止软件的非法复制、盗版,保护软件开发商的利益,就必须对软件进行加密保护。

现在市面上有许多反盗版软件,但这类软件多是单机处理,并且只使用简单的加密手段,很容易被解密者破解。

本文描述了一个通过Internet,集加密和电子注册于一身的完善的软件保护方案。

该方案基于多种密码学意义上可靠的算法,如对称加密算法,散列算法,数字签名,密钥交换等等。

通过对Windows下PE可执行文件的结构及载入机制进行深刻的剖析,

巧妙的使用这些密码学算法及多种反破解方案对PE文件进行加密保护。

在该方案的实现中,使用CryptoAPI中的数字签名算法RSA,加密算法RC2和RC4,散列算法SHA,同时自己编写了使用了MD5算法用于快速计算大量数据的摘要;网络接口使用WinSocket;编程语言选用汇编语言和C++混合编程方式;反破解方案有检测文件完整性、检测代码完整性、反跟踪、反-反汇编、反Dump、代码变形等等。

由于使用了可靠的密码学算法,使软件加密的强度大大提高;由于使用了Internet在线注册方式,用户使用也非常方便。

关键词加密;数字签名;散列;反跟踪;电子注册

SoftwareProtectiontechniqueanditsrealization

LEIPeng

(GuiLinInstituteofElectronicTechnology.TheDepartmentofComputing

AbstractThefloodingofpiratesoftwarehasbeenacalamityofour

nationalsoftwareindustry.Inordertopreventsoftwarefrompirate,

andprotecttheprofitofthesoftwaredeveloper,theymustencrypttheir

softwaretogetaprotection.Thereareseveralsoftwareprotectiontools

inthemarketcurrently,butthesetoolswerestandaloneninetenths,

andtheyonlyusedsimpleencryptionalgorithms,sotheycouldbecracked

easilybythecrackers.

Thisthesisdescribesaperfectsoftwareencryptionandprotectionscheme

whichintegratetheencryptionandelectronicregister.Thisschemeis

basedonmultiplereliablecryptographicalgorithmssuchassymmetric

encryptionalgorithm,digitalsignature,hashingandkeyexchange.The

PEfileformat(PortableExecutableFileFormat)anditsloadingmechanism

underWindowsaredissectedthoroughlyinthisthesis.Thenthese

cryptographicalgorithmsandseveralanti-crackmethodareusedgracefully

toencryptandprotectthePEfile.

Withintherealizationofthisscheme,theRSAdigitalsignature

algorithm,RC2andRC4encryptionalgorithm,SHAhasingalgorithmetcin

MicroSoftCryptoAPIareused.Inordertoincreasetheperformaceof

caculatethedigestoflargenumberofdata,MD5hashingalgorithmwas

rewritten.WinSocketAPIisusedasthenetworkinterface.Theblendof

C++andassemblyareusedforeasilycontolingthebottomlayerofthe

systemandsimplifytheprogramming.Theanti-crackmethodconsitsthe

integralizationofthefilechecking,theintegralizationofthecode

checking,andanti-debug,anti-disassembly,anti-dumpandcode

metamorphoseetc.

Thereliablecyrptoalgorithmsguaranteethecryptostrength.Asaresult

ofonlineregister,theretailusersandthesoftwaredevelopersget

convenience.

KeywordsEncrypt;DigitalSignature;Hashing;Anti-Debug;

ElectronicRegister

目录

1概述1

2密码学简介

2.1概念3

2.2对称密码算法6

2.3公开密码算法6

2.4单向散列函数7

2.5数字签名8

3Windows环境下PE文件简介

3.1WIN32与PE基本概念10

3.2PE首部12

3.3PE文件的导入表14

4当前流行的一些软件保护技术

4.1序列号保护21

4.2时间限制22

4.3KeyFile保护23

4.4CD-check23

4.5反跟踪技术(Anti-Debug)23

4.6反-反汇编技术(Anti-Disassmbly)24

4.7软件狗25

4.8Vbox保护技术25

4.9SalesAgent保护技术26

4.10SecuROM保护技术26

4.11软盘加密26

4.12将软件与机器硬件信息结合26

4.13加壳27

5该软件的设计思想

5.1传统保护的不足28

5.2网络的流行29

5.3我的方案29

5.4该方案的可行性分析29

6该软件的整体构架、开发工具及方法

6.1需求分析32

6.2整体框架35

6.3各取所长(汇编与C/C++各取所长)35

6.4C/C++与汇编语言混合编程时的互调协议36

6.5该软件中各模块对语言特性的限制及解决方法40

6.6C/C++和汇编语言的预编译45

7该软件的实现及技术细节

7.1CryptoAPI简介47

7.2几个公共函数和宏49

7.3模块共用的结构体定义54

7.4Shield模块56

7.4.1壳程序中API和库函数的处理59

7.4.2壳程序主体62

7.4.3加密壳程序63

7.4.4运行中修改自身代码64

7.4.5代码散列校验64

7.4.6跳转到客户程序入口65

7.4.7载入并销毁Client程序的ImportTable66

7.4.8自毁壳程序代码69

7.4.9编译方法70

7.5Merge模块71

7.6Register模块76

7.7Server模块77

7.8软件授权协议的实现78

7.9Client的代码(数据)的加密/解密流程图示82

8使用说明及演示

8.1使用说明83

8.2演示及效果83

9限制、不足与展望

9.1使用该软件的限制86

9.2该软件的不足86

9.3对该软件的展望87

10结束语

10.1总结91

10.2致谢91

参考文献92

1概述

我引用《应用密码学》作者BruceSchneier的话:

世界上有两种密码:

一种是防止你的小妹妹看你的文件;另一种是防止当局者阅读你的文件资料。

如果把一封信锁在保险柜中,把保险柜藏在纽约的某个地方…,然后告诉你去看这封信。

这并不是安全,而是隐藏。

相反,如果把一封信锁在保险柜中,然后把保险柜及其设计规范和许多同样的保险柜给你,以便你和世界上最好的开保险柜的专家能够研究锁的装置。

而你还是无法打开保险柜去读这封信,这样才是安全的。

意思是说,一个密码系统的安全性只在于密钥的保密性,而不在算法的保密性。

对纯数据的加密的确是这样。

对于你不愿意让他看到这些数据(数据的明文)的人,用可靠的加密算法,只要破解者不知道被加密数据的密码,他就不可解读这些数据。

但是,软件的加密不同于数据的加密,它只能是"隐藏"。

不管你愿意不愿意让他(合法用户,或

Cracker)看见这些数据(软件的明文),软件最终总要在机器上运行,对机器,它就必须是明文。

既然机器可以"看见"这些明文,那么

Cracker,通过一些技术,也可以看到这些明文。

于是,从理论上,任何软件加密技术都可以破解。

只是破解的难度不同而已。

有的要让最高明的Cracker忙上几个月,有的可能不费吹灰之力,就被破解了。

所以,反盗版的任务(技术上的反盗版,而非行政上的反盗版)就是增加Cracker

的破解难度。

让他们花费在破解软件上的成本,比他破解这个软件的获利还要高。

这样Cracker

的破解变得毫无意义--谁会花比正版软件更多的钱去买盗版软件?

然而,要做到"难破解",何尝容易?

Sony曾宣称的超强反盗版(Key2Audio音乐

CD反盗版),使用了很尖端的技术,然而最近却被一枝记号笔破解了,成为人们的饭后笑料!

所以,很多看上去很好的技术,可能在Cracker面前的确不堪一击。

就像马其诺防线一样,Cracker

不从你的防线入手,而是"绕道"。

这样,让你的反盗版技术在你做梦也想不到的地方被Crack了。

为什么会这样呢?

归根到底是因为软件在机器上运行,并且软件和机器是分离的--这一点是关键,如果软件和硬件完全绑定,不能分离,是可以做到象IDEA

之类几乎不可破解的系统的。

这将在后面谈传统软件保护技术时详细说明。

对我的这个解决方案,我不能保证Crack高手在几天之内不能破解它,我只能说:

"在这个软件中,我尽量堵住了当前破解者普遍使用的方法以及"我想得到"的可能的缺口。

"但是我相信,倾注了我三个月心血的反盗版软件,决不是一个"玩具式"的反盗版软件。

2密码学简介

2.1概念

(1)发送者和接收者

假设发送者想发送消息给接收者,且想安全地发送信息:

她想确信偷听者不能阅读发送的消息。

(2)消息和加密

消息被称为明文。

用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。

图2-1表明了这个过程。

图2-1加密和解密

明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。

至于涉及到计算机,P是简单的二进制数据。

明文可被传送或存储,无论在哪种情况,M指待加密的消息。

密文用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。

然而,单单加密通常达不到这一点)。

加密函数E作用于M得到密文C,用数学表示为:

E(M)=C.

相反地,解密函数D作用于C产生M

D(C)=M.

先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:

D(E(M))=M

(3)鉴别、完整性和抗抵赖

除了提供机密性外,密码学通常有其它的作用:

.

(a)鉴别

消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。

(b)完整性检验

消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。

(c)抗抵赖

发送者事后不可能虚假地否认他发送的消息。

(4)算法和密钥

密码算法也叫密码,是用于加密和解密的数学函数。

(通常情况下,有两个相关的函数:

一个用作加密,另一个用作解密)

如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。

受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。

大的或经常变换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法。

如果有人无意暴露了这个秘密,所有人都必须改变他们的算法。

更糟的是,受限制的密码算法不可能进行质量控制或标准化。

每个用户组织必须有他们自己的唯一算法。

这样的组织不可能采用流行的硬件或软件产品。

但窃听者却可以买到这些流行产品并学习算法,于是用户不得不自己编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就无法知道他们是否拥有安全的算法。

尽管有这些主要缺陷,受限制的算法对低密级的应用来说还是很流行的,用户或者没有认识到或者不在乎他们系统中内在的问题。

现代密码学用密钥解决了这个问题,密钥用K表示。

K可以是很多数值里的任意值。

密钥K的可能值的范围叫做密钥空间。

加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K作为下标表示),这样,加/解密函数现在变成:

EK(M)=C

DK(C)=M.

这些函数具有下面的特性(见图2-2):

DK(EK(M))=M.

图2-2使用一个密钥的加/解密

图2-3使用两个密钥的加/解密

有些算法使用不同的加密密钥和解密密钥(见图2-3),也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:

EK1(M)=C

DK2(C)=M

DK2(EK1(M))=M

所有这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。

这就意味着算法可以公开,也可以被分析,可以大量生产使用算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使用的具体密钥,他就不可能阅读你的消息。

密码系统由算法、以及所有可能的明文、密文和密钥组成的。

基于密钥的算法通常有两类:

对称算法和公开密钥算法。

下面将分别介绍:

2.2对称密码算法

对称算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。

在大多数对称算法中,加/解密密钥是相同的。

这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。

对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。

只要通信需要保密,密钥就必须保密。

对称算法的加密和解密表示为:

EK(M)=C

DK(C)=M

对称算法可分为两类。

一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。

另一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。

现代计算机密码算法的典型分组长度为64比特--这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。

2.3公开密码算法

公开密钥算法(也叫非对称算法)是这样设计的:

用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。

之所以叫做公开密钥算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。

在这些系统中,加密密钥叫做公开密钥(简称公钥),解密密钥叫做私人密钥(简称私钥)。

私人密钥有时也叫秘密密钥。

为了避免与对称算法混淆,此处不用秘密密钥这个名字。

用公开密钥K加密表示为

EK(M)=C.

虽然公开密钥和私人密钥是不同的,但用相应的私人密钥解密可表示为:

DK(C)=M

有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(后面将详细介绍),尽管可能产生混淆,但这些运算可分别表示为:

EK(M)=C

DK(C)=M

当前的公开密码算法的速度,比起对称密码算法,要慢的多,这使得公开密码算法在大数据量的加密中应用有限。

2.4单向散列函数

单向散列函数H(M)作用于一个任意长度的消息M,它返回一个固定长度的散列值h,其中h的长度为m。

输入为任意长度且输出为固定长度的函数有很多种,但单向散列函数还有使其单向的其它特性:

(1)给定M,很容易计算h;

(2)给定h,根据H(M)=h计算M很难;

(3)给定M,要找到另一个消息M'并满足H(M)=H(M')很难。

在许多应用中,仅有单向性是不够的,还需要称之为"抗碰撞"的条件:

要找出两个随机的消息M和M',使H(M)=H(M')满足很难。

由于散列函数的这些特性,由于公开密码算法的计算速度往往很慢,所以,在一些密码协议中,它可以作为一个消息M的摘要,代替原始消息M,让发送者为

H(M)签名而不是对M签名。

如SHA散列算法用于数字签名协议DSA中。

2.5数字签名

提到数字签名就离不开公开密码系统和散列技术。

有几种公钥算法能用作数字签名。

在一些算法中,例如RSA,公钥或者私钥都可用作加密。

用你的私钥加密文件,你就拥有安全的数字签名。

在其它情况下,如DSA,算法便区分开来了?

?

数字签名算法不能用于加密。

这种思想首先由Diffie和Hellman提出

基本协议是简单的:

(1)A用她的私钥对文件加密,从而对文件签名。

(2)A将签名的文件传给B。

(3)B用A的公钥解密文件,从而验证签名。

这个协议中,只需要证明A的公钥的确是她的。

如果B不能完成第(3)步,那么他知道签名是无效的。

这个协议也满足以下特征:

(1)签名是可信的。

当B用A的公钥验证信息时,他知道是由A签名的。

(2)签名是不可伪造的。

只有A知道她的私钥。

(3)签名是不可重用的。

签名是文件的函数,并且不可能转换成另外的文件。

(4)被签名的文件是不可改变的。

如果文件有任何改变,文件就不可能用A的公钥验证。

(5)签名是不可抵赖的。

B不用A的帮助就能验证A的签名。

在实际应用中,因为公共密码算法的速度太慢,签名者往往是对消息的散列签名而不是对消息本身签名。

这样做并不会降低签名的可信性。

本章仅对密码学进行了一些简要的介绍,更多的请参阅参考文献[1]。

3Windows环境下PE文件简介

3.1WIN32与PE基本概念

只要用过电脑的人都知道什么是Windows,Windows95已经是过时的昨日黄花了,Windows98也已推出将近四年了。

2000

年又推出了Windows2000,今年又推出了

WindowsXP,微软的操作系统更新速度是如此的快,以至于昨天还在使用的东西,在今天看来就已经过时了。

Windows98以后,微软传言不在推出

9x内核的操作系统,但是2000年下半年却正式推出了WindowsMillennium,简称Win.Me。

然而从WindowsXP

的推出,可以断言,微软不会在升级Win9x操作系统了。

Windows2000和WindowsXP都是基于NT内核的。

所有这些操作系统都使用一种"可移植可执行文件格式"(PortableExecutableFileFormat),简称PE文件格式。

下面简短介绍一下PE文件的一些概念。

详细内容请参阅参考文献[14]。

WindowsNT继承了VAX?

VMS?

和UNIX?

的传统。

许多WindowsNT

的创始人在进入微软前都在这些平台上进行设计和编码。

当他们开始设计WindowsNT

时,很自然的,为了最小化工程的启动时间,他们会使用以前写好的并且已经测试过的工具。

用这些工具生成并且工作的可执行文件和OBJ文件格式叫做

COFF(CommonObjectFileFormat的首字母缩写)。

COFF的年龄不超过八年。

COFF本身是一个很好的起点,但是需要扩展到一个现代操作系统如Windows95和WindowsNT

就要进行一些更新。

其结果就是产生了(PE格式)可移植可执行文件格式。

它被称为"可移植的"是因为在所有平台(如x86,Alpha,MIPS等等)上实现的WindowsNT

都使用相同的可执行文件格式。

当然了,也有许多不同的东西如二进制代码的CPU指令。

重要的是操作系统的装入器和程序设计工具不需要为任何一种CPU完全重写就能达到目的。

关于PE文件最重要的是,磁盘上的可执行文件和它被WINDOWS载入内存之后(PE文件载入内存之后称为PE映像)是非常相像的(如图

3-1)。

WINDOWS载入器不必为从磁盘上载入一个文件而辛辛苦苦创建一个进程。

载入器使用内存映射文件机制把文件中相似的块映射到虚拟空间中。

构造式的进行分析,一个PE文件类似一个预制的屋子。

它本质上开始于这样一个空间,这个空间后面有几个把它连到其余空间的机件(就是说,把它联系到它的DLL上,等等)。

这对PE格式的DLL式一样容易应用的。

一旦这个模块被载入,Windows

就可以有效的把它和其它内存映射文件同等对待。

图3-1PE文件和PE映像的布局很相似

对Win32来讲,模块所使用的所有代码,数据,资源,导入表,和其它需要的模块数据结构都在一个连续的内存块中。

在这种形势下,你只需要知道载入器把可执

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1