《基于硬盘序列号和RSA算法的软件加密系统的设计和实现 毕业设计论文.doc》由会员分享,可在线阅读,更多相关《基于硬盘序列号和RSA算法的软件加密系统的设计和实现 毕业设计论文.doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于硬盘序列号和RSA算法的软件加密系统的设计和实现摘 要随着计算机软件业的飞速发展和计算机的日益普及计算机软件已经进入社会生活中的各个角落。但是由于计算机软件易于复制,所以随之而来的便是盗版软件的泛滥。这使软件开发人员蒙受了巨大的经济和社会损失,防止软件盗版最行之有效的方法就是对软件进行有效的加密。论文首先介绍了软件加密的发展现状和研究它的意义,接着对软件序列号保护的相关技术分析和当前流行的加密算法详细研究。基于以上理论基础,将本设计的基于硬盘序列号和RSA算法软件加密系统的设计和实现划分为两个层次:采用动态链接库文件DiskSerial.DLL导出的GetSerialNumber()函数获
2、取硬盘的物理序列号,动态链接库的好处是可以采用多种编程语言来编写,增强产品的功能,提供二次开发的平台,简化项目管理,节省磁盘空间和内存,有助于资源的共享;注册机使用RSA加密算法将硬盘物理序列号加密生成为注册码,客户端将注册码进行解密运算,其结果与获取的本地计算机硬盘物理序列号对比,验证注册码的合法性。加密解密使用非对称密钥RSA算法,私钥和公钥不同,理论上从公钥推算出私钥是不可行的,当密钥长度达到1024位时,破解难度极大,所以使用RSA算法加密确保了软件的安全性。本设计因为使用的序列号是硬盘物理序列号,及每台电脑的序列号是不同的,从而保证了注册码的唯一性。经过调试和测试的验证,本设计结构简
3、单,性能可靠,操作方便。本设计在软件保护行业有着广泛的使用价值,如在软件防盗中,用作注册码的生成与验证等。 关键词:硬盘物理序列号;RSA算法;注册机;软件加密System design and implementation of encryption system based on hard disk serial number and RSA algorithm Student:LI Zhong-jie Teacher:ZHANG Lie-ping Abstract:With the rapid development of computer software industry, and
4、the increasing popularity of computer software has entered every corner of social life. However, because computer software is easy to replicate, so what comes next is the proliferation of pirated software. This allows software developers suffered huge economic and social loss, to prevent software pi
5、racy is the most effective way to encrypt the software effectively. First, the paper introduces the current development of software encryption and research its meaning, then the serial number of software related to technical analysis and protection of the popular encryption algorithm in detail. Base
6、d on the above theory, this design based on the hard disk serial number and the RSA encryption algorithm software, system design and implementation is divided into two levels: the dynamic link library files DiskSerial.DLL exported GetSerialNumber() function to get the hard drive of the physics seria
7、l number, The advantage of the dynamic link library can be written using a variety of programming languages, and enhance products features, provide second development platform, simplifying project management, saving disk space and memory to help resource sharing; Keygen using RSA algorithm encrypt t
8、he hard disk physical serial number of students to become registration key, registration key to decrypt the client will operation, its results for the local computer hard disk physical serial number contrast, validation License legitimacy. Encryption and decryption using RSA asymmetric key algorithm
9、, the private key and public key difference, in theory calculate the private key from the public key is not feasible, when the 1024-bit key length, the crack is extremely difficult, so use the RSA encryption algorithm to ensure the security of the software. The design for using the serial number is
10、hard physical serial number, and serial number of each computer is different, thus ensuring the registration code is unique. After commissioning and testing of the verification, the design is simple, reliable, easy to operate. The design of the software protection industry has a wide range of value,
11、 such as software security, the registration code for the generation and verification.Keywords:shard disk physical serial number;RSA algorithm;keygen;software encryption目次摘要IAbstractII1 绪论11.1 问题的提出及研究意义11.2 软件保护系统概念11.3 课题研究内容及论文的主要工作22 软件序列号保护的相关技术介绍32.1 序列号保护机制32.1.1 注册码保持不变32.1.2 注册码因输入信息而异32.1.
12、3 注册码因用户计算机而异42.2 注册机信息采集技术42.2.1 网卡的物理地址(MAC)获取42.2.2 磁盘逻辑序列号获取52.2.3 磁盘物理序列号获取52.3 常用的软件保护技术介绍72.3.1 时间限制72.3.2 Key File保护92.3.3 CD-CHECK92.4 软件保护总结92.5 本章小结103 加密算法介绍113.1 DES算法113.1.1 DES算法原理113.1.2 DES算法的应用误区113.2 MD5算法113.2.1 MD5算法原理113.2.2 MD5算法的应用123.3 RSA算法123.3.1 RSA算法原理123.3.2 RSA的安全性133.
13、3.3 RSA的速度133.4 本章小结144 系统详细设计及实现154.1 开发环境介绍154.1.1 Visual C+ 6.0 介绍154.1.2 MFC程序开发流程164.2 大进制数及其运算类定义204.2.1 大数类的详细描述204.2.2 大数类的类定义214.3 注册机的设计及实现224.3.1 注册机界面设计224.3.2 注册机算法的详细描述254.3.3 算法的实现代码264.3.4 完成的注册机程序284.4 客户端的设计及实现294.4.1 客户端界面设计294.4.2 各种接口硬盘介绍304.4.3 客户端算法详细描述324.4.4 完成的客户端程序344.5 本章
14、小结365 结论37致谢38参考文献391 绪论1.1 问题的提出及研究意义 计算机软件业的飞速发展和计算机的日益普及计算机软件已经进入社会生活中的各个角落。计算机软件是开发者脑力劳动的成果,具有原创性质1。计算机软件开发要求软件开发人员拥有丰富的专业相关知识,具备优秀的逻辑思维和抽象思维能力,了解计算机硬件与软件的最新发展状况与发展趋势,熟练掌握和应用编程语言。尤其是开发具有大规模商业应用的计算机软件,通常需要专业分工、流水作业。必须具有的充足的物质条件和良好的技术储备。而计算机软件的复制是对计算机软件的客观再现,不改变软件内容,不影响软件本身的价值,而把软件转载于有形物体的行为。由于软件存
15、在形式的特殊性,它比传统的作品更容易被复制,且复制所需投入少、耗时短、传播容易,无需借助特殊的装置。尤其在网络环境下计算机软件的复制与传播就更为方便,从而使盗版侵权成了轻易又且暴利的事情。这使软件开发人员蒙受了巨大的经济和社会损失,防止软件盗版最行之有效的方法就是对软件进行有效的加密2。 随着软件的防盗版措施越来越被软件开发者所重视,其采用的技术也变得越来越广泛和复杂。软件的破解技术与保护技术这两者之间就是矛与盾的关系,它们是在互相斗争中发展进化的。这种技术上的较量归根到底是一种利益的冲突。软件开发者为了维护自身的商业利益,不断地寻找各种有效地技术来保护软件版权,以增加其保护强度,推迟软件被破
16、解的时间;而破解者则受盗版所带来的高额利润的驱使,或出于纯粹的个人兴趣,而不断制作新的破解工具并针对新出现的保护方式进行跟踪分析以找到相应的破解方法。 从理论上说,几乎没有破解不了的保护。但是如果一种保护技术的强大强到足以让破解者在软件的生命周期内无法将其完全破解,这种保护技术就可以说是非常成功的。因此,开发研制一种安全可靠、难以破解软件加密系统具有重大的经济意义和社会意义。1.2 软件保护系统概念 软件与普通作品不同,天生即具有技术属性。软件本身就是实现技术的一段计算机可以识别的编码。因此,在既有功能的基础上,很容易添加新的功能代码用于保护版权。这也意味着,相对于其他普通作品,在软件保护中使
17、用技术手段的成本最低,效率最高。对于软件而言,通过对软件进行加密等技术保护手段可以有效的防止他人对软件擅自访问、复制、操作、散发及传播,同时也便于控制软件正常的授权使用以及使用后的监督。 目前各国对于软件的保护性技术措施都有比较明确的概念。美国将技术措施的定义为“任何能够有效控制进入受版权保护的作品并能够有效保护版权人权利的措施。”而欧盟的定义为“设计用于阻止侵犯版权以及与数据库有关的特殊权利的设备、产品或方法。”但是技术措施事实上是一个开放的系统,随着技术的不断进步,不断地会有新类型的技术保护措施的涌现。本文出发点即是通过硬盘物理序列号用RSA算法生成唯一的注册码,从而对软件进行保护。 软件
18、权利人通过对软件等数字化形式存在的作品上设置的能够实现对作品的访问、复制、传播、修改和使用进行有效控制的各种技术手段、设备、产品或方法,并借此达到对作品未经授权的访问、复制、传播、修改与使用行为的警示、禁止甚至制裁的目的。这些技术手段、设备、产品或方法的实施阶段既包括在出售前与软件本体打包封装,亦包括在出售后通过在线升级、认证等方式加载。上述的这一类的技术手段、设备、产品或方法统称为软件保护技术3。1.3 课题研究内容及论文的主要工作 本课题研究内容主要有:MFC编程技术、软件保护技术概述、动态链接库文件的生产导入、获得Ring0级权限、获取硬盘物理序列号、定义大整数及其运算法则类、RSA非对
19、称密钥加密解密算法、素数的判定和密钥对的生成;在了解以上技术之后,确定了各个模块的工作原理及作用,最后根据要实现的功能要求,绘制流程图,由流程图应用C+语言编写程序。本论文的主要工作如下:1)了解软件盗版的严重性,以及软件防盗的现状和发展趋势。2)了解软件产品的特点,深入分析软件易于复制传播的原因。3) 掌握软件保护系统概念,熟悉软件保护中常用的技术手段。4)掌握MFC可视化编程常用的方法,动态链接库文件的制作和该文件的导入。5)了解常用的进入Ring0级权限的三种方法:第一种通过中断陷入技术,第二种通过写一个中断VXD(虚拟驱动设备)或WDM,最后一种通过WindowsAPI函数Device
20、InControl调用Smartvsdvxd。掌握动态链接库导出函数获取硬盘物理序列号。 6)掌握大数类的定义,大数类中定义了赋值、比较大小、加法、减法、乘法、除法、求模等基本运算法则。7)了解常用的加密算法,掌握RSA非对称加密算法的原理,随机生成密钥对(e,n)和(d,n)。熟悉序列号的加密和注册码的解密。 8)根据功能需求,画出程序流程图,应用C+语言编写应用程序。2 软件序列号保护的相关技术介绍2.1 序列号保护机制 数学算法一项都是密码加密的核心,但在一般的软件加密中,它似乎并不太为人们关心,因为大多数时候软件加密本身实现的都是一种编程的技巧。但近几年来随着序列号加密程序的普及,数学
21、算法在软件加密中的比重似乎是越来越大了。所谓序列号保护机制就是软件开发者根据用户提供的一些信息,然后使用数学算法生成注册码。用户得到注册码后,经过逆运算得到的结果跟自己提供的信息对比,从而确定软件注册码的合法性。因为采集的用户信息类型不同,所以就有了多种类型的注册码。2.1.1 注册码保持不变 注册码保持不变就是说不管是哪个用户在哪个台电脑上都能注册,整个软件的安全性寄托在注册码本身的保密上,只要注册码泄漏了,所有人都可以注册该软件。早期的软件保护都采用一串复杂的字符串作为注册码,因为当时的网络并不发达,加上注册码本身难于记忆,所以个人所拥有的注册码一般情况下,是不容易被大量用户非法盗用的。
22、随着时间的推移,网络逐渐普及,覆盖面越来越广,早期软件保护防盗的方法面临前所未有的挑战,只要有一个人把自己一款软件的合法注册码发布在网上,其他使用该软件的用户就能很容易的利用搜索引擎找到此注册码,成功的注册自己的软件,而无需支付相应的费用,这给软件开发商造成了巨大的损失。现在已经很少有人使用注册码保持不变的方法保护软件,此方法已经慢慢淡出了人们的视线。2.1.2 注册码因输入信息而异 这是传统的注册码保护方法,根据用户输入的不同信息(如用户名)产生注册码,这种方法产生的注册码和用户的信息存在简单的对应机制,安全性极差,只要“用户名”和“注册码”泄漏就可以无限制地在任何计算机上注册使用。网络上大
23、量的“注册用户”和“注册码”使软件的保护形同虚设4。 注册码保持不变的方法失利之后,软件保护行业亟需一种有效地保护方法,于是在原来的方法上改进为使用注册时输入的信息和注册码对应的方式保护软件,防止盗用,因为生成注册码时时用户输入的用户名只有用户自己知道,因此,就算是本软的某个注册码被别人知道了,但是不知道与这个注册码对应的用户名,同样还是不能注册成功。所以整个软件的安全全部寄托在了用户对自己信息的保密程度,只要某个用户把自己的注册码和用户名公开,或是黑客通过木马获取到了相关信息,那么其他人就可以用这些信息成功的注册该软件。2.1.3 注册码因用户计算机而异 根据用户计算机各种软硬件信息:如CP
24、U ID、分区卷标、硬盘大小、硬盘物理序列号、网卡号等等。通过这些信息可以将任意两台机器区分出来,从而可以生成一段唯一的序列号。这些信息中有的是不可取的,例如分区卷标这种不稳定信息,因其仅与软件系统有关。而有一些是无法得到的,例如当机器中没有网卡时或早于Pentium III型号的CPU,网卡号和CPU ID就得不到了5。 网络的普及,因一个注册码泄漏而可以无限制的注册该软件的问题越发突出,软件开发商为了能保护自己的合法权益,开发出了一套新的软件保护方法,这也是现阶段最主要的保护方式,因计算机不同而生成不同的注册码。这种注册码一般都是与本机的相关的具有唯一性的一种或多种物理信息,这种物理信息是
25、出厂时就确定了的,一般是固化在了计算机内部,不能修改,因此生成的注册码即使是发布在了网上,别的人还是无法使用该注册码注册自己的软件,因为自己的计算机硬件的相关信息和本注册码不相关。有了这种全新的软件保护方式,软件开发商就能在网络环境中很容易的保护自己的利益,避免软件被非法盗版。2.2 注册机信息采集技术 注册机信息采集技术是指利用计算机软件技术,针对计算机相关软硬件信息进行采集保存,从而为各种信息服务系统提供数据输入的整个过程。 硬件信息包括CPU ID、网卡物理地址(MAC)、硬盘的相关物理信息例如硬盘物理序列号等等。这些硬件物理信息有些可以通过windows提供的API函数直接获取,有些需
26、要自己编写相关的函数,而且在windows下,必须编写一个驱动程序或通过一定的技术手段获取,例如,硬盘信息的获取操作,需要运行在Ring 0级别,而正常情况,windows的应用程序是运行在Ring 3级的,因此在获取硬盘物理信息前,必须通过一定的技术方法进入windows的Ring 0级。2.2.1 网卡的物理地址(MAC)获取 MAC(Media Access Control, 介质访问控制)MAC地址是烧录在Network Interface Card(网卡,NIC)里的。MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成。0-23位叫做组织唯一标志符(organiz
27、ationally unique),是识别LAN(局域网)节点的标识,24-47位是由厂家自己分配,其中第40位是组播地址标志位。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。也就是说,在网络底层的物理传输过程中,是通过物理地址来识别主机的,它一般也是全球唯一的。比如,著名的以太网卡,其物理地址是48bit(比特位)的整数,如:44-45-53-54-00-00,以机器可读的方式存入主机接口中。以太网地址管理机构(除了管这个外还管别的)(IEEE)(IEEE:电气和电子工程师协
28、会)将以太网地址,也就是48比特的不同组合,分为若干独立的连续地址组,生产以太网网卡的厂家就购买其中一组,具体生产时,逐个将唯一地址赋予以太网卡。形象的说,MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。 众所周知,一个网卡对应唯一MAC地址,对一些应用程序来说,获取网卡MAC地址有时是必要的,使用VC提供的NetBIOS网络编程接口可以方便获取网卡MAC地址。NetBIOS中所有的函数声明、常数等等均是在头文件nb30.h内定义的,nb30.h中一些类型在wtypes.h中定义,另外,若想使用NetBIOS,须连接的库是netapi.dll。2.2.2 磁盘逻辑序列号获取 硬盘的磁
29、盘逻辑序列号的获取很简单,可直接调用windows的API函数GetVolumeInformation()获取硬盘的逻辑序列号6。该函数如下所示:GetVolumeInformation(lpRootPathName: PChar; 磁盘驱动器代码字符串lpVolumeNameBuffer: PChar; 磁盘驱动器卷标名称nVolumeNameSize: DWORD;磁盘驱动器卷标名称长度lpVolumeSerialNumber: PDWORD;磁盘驱动器卷标序列号var lpMaximumComponentLength: DWORD; 系统允许的最大文件名长度var lpFileSyste
30、mFlags: DWORD;文件系统标识lpFileSystemNameBuffer: PChar; 文件操作系统名称nFileSystemNameSize: DWORD 文件操作系统名称长度): BOOL; 采用注册码的保护方式,最好是一机一码,即注册码与机器特征相关,这样一台机器上的注册码就无法在另外一台机器上使用,可以防止有人散播注册码,然而硬盘逻辑序列号用相关工具可以修改其值,所以使用逻辑序列号不安全。2.2.3 磁盘物理序列号获取 硬盘的序列号是厂家设定的,且只能用I/O指令读取,所以,这在以前的DOS时根本不是什么问题,方法非常简单,如下面的代码所示: static int Wai
31、tIde() int al; while (al=inp(0x1F7)=0x80); return al; static void ReadIDE() int al; int i; WORD pw256; WaitId(); outp(0x1F6,0xA0); al = WaitIde(); if(al&0x50)!=0x50) return; outp(0x1F6,0xA0); outp(0x1F7,0xEC); al = WaitIde(); if(al&0x58)!=0x58) return; for(i=0;i256;i+) pwi = inpw(0x1F0); 至此,关于IDE硬盘的
32、信息已经在pw数组中了,需要注意的是该数组是一个WORD类型,硬盘的序列号存放于pw10开始的10个WORD中,使用时需要将每个WORD的高低字节颠倒一下。真正有点麻烦的是在Windows 95/98下,I/O指令作为特权指令在应用程序级别,即Ring3是不可使用的,所以上面的代码在执行到WaitIde()时会陷到死循环中,原因就是IN 0x1F7总是返回0xFF容易想到的解决办法是写一个VxD,因为VxD运行Ring 0级别上,即最高特权级上,所以所有的指令都是可用的,硬盘物理序列号的获取需要使用特权指令,要进入Ring0特权级常用的还有两种方法:1)中断陷入技术;2)通过WindowsAP
33、I函数DeviceInControl调用Smartvsdvxd。其中第一种方法相对简单实用,但不能取得NT下的Ring0级,因为NT下得不到中断向量表,本文只介绍第一种方法的实现机制。 计算机操作系统都有一个中断描述表(IDT),该表有IDTR寄存器指向。矢量号作为IDT表的索引,从IDT表中获取一个8字节的门描述符。在门中包含48位的全指针及占用了16位的属性。48位的全指针包含32位的偏移量及16位的选择子。这里的偏移量分为两个部分存放。全指针的选择子部分存放在m+2及m+3字节,偏移量的低16位存放在m及m+1字节,高16位存放在m+6及m+7字节。在门描述符中,属性位存放在m+4及m+
34、5字节。 P为存在位,P=1表示门有效,P=0表示门无效,使用无效门将引起异常。DPL为描述符特权级,定义与门相联系的特权级。门的DPL只在INTn及INTO时进行检查,以避免应用程序执行INTn时,使用了各种设备在中断表中使用的矢量号。对于所有其它的异常或中断,忽略门DPL。DT为DType位,用于区分储存段(DT=1)及非储存段(及系统段或门,DT=0)。我们现在讨论的是门描述符,故此处有DT=0。Type为四位类型字段,用于定义门的类型:5为任务门;6为286中断门;7为286陷阱门;14为386中断门;15为386陷阱门。我们利用重新定义门描述符的偏移量将自己的程序放入中断中,通过执行
35、中断从而得到Ring0级的权限来读到硬盘序列号7。2.3 常用的软件保护技术介绍2.3.1 时间限制2.3.1.1 定时器 有些程序的试用版每次运行都有时间限制,例如运行10分钟或20分钟就停止工作,必须重新运行该程序才能正常工作。这些程序里面自然有个定时器来统计程序运行的时间。1)使用Settimer() 常用的计数器是函数Settimer(),调用这个函数创建的定时器可以发出消息VM_TIMER,或者在定时期满时调用一个回调函数。使用这个函数会使时间延时,精度不高。2)使用timeSetEvent() 给Windows驱动程序最精确的周期性通知是由Windows的多媒体服务timeSetE
36、vent()提供的。它的时间可以精确到1毫秒。3)使用VXD可以使用VMM的Set_Global_time_Out()服务来迫使回调函数的几个毫秒再执行,这就创造了一个“只有一次”的定时器。VXD可以在回调中再次调用Set_Global_time_Out()来开始下一个定时器,这样提供了一个连续运行的定时器了。 4)其它GetTickCount():精度不高;timeGetTime():可以以毫秒级返回windows开始后的时间。2.3.1.2 时间限制一般这类保护的软件都有时间上的限制,如试用30天等,当过了共享软件的试用期后,就不予运行,只有向软件作者付费注册之后才能得到一个无时间限制的注
37、册版本。这种类型程序很多,让你有10天、20天、30天等,它们在安装时,在你的系统某处做上时间标记,每次运行时用当前系统时间和安装时的时间比较,判断你还否能使用。如最典型的30天限制的一种情况:mov ecx,1E ; 把1E (30天 十进制) 放入 ecxmov eax,esp+10 ; 把用过天数放到eaxcmp eax,ecx ; 在此比较如碰到这种情况,只需把mov eax,esp+10改成mov eax,1。要记住当前年份、月份的十六进制的一些表示方法,如:2000年的十六进制是07D0,然后用W32DASM反汇编你的程序,用查找字符串的方法找D007(在机器码中位置颠倒了一下)或
38、其它类似时间的数字,有可能会找到有价值的线索。你别小看这种方法,对那些没怎么防范的程序,此招很有效。 如:一程序限定在2000年使用,可能有如下一代码::00037805 817C2404D0070000 cmp dword ptr esp+04, 000007D0 比较是否在2000年。 1)GetSystemTime 得当前系统时间在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式。 VOID GetSystemTime( LPSYSTEMTIME lpSystemTime );/ 随同当前时间载入的结构。 2)GetLocalTi
39、me 得当前本地时间 VOID GetLocalTime( LPSYSTEMTIME lpSystemTime );/ 用于装载本地时间的结构。 3)SystemTimeToFileTime 根据一个FILETIME结构内容,载入一个SYSTEMTIMEBOOL SystemTimeToFileTime(CONST SYSTEMTIME * lpst,LPFILETIME lpft);/ 包含了系统时间信息的一个结构。/ 用于装载文件时间的一个结构。4)SetTimer 创建一定时器,在指定时间内暂停UINT SetTimer( HWND hwnd,UINT idtimer,UINT uTim
40、eout,TIMERPROC tmprc); / 时间信息句柄。 / 定时器ID 标识符。 / 暂停时间。 / 处理定时过程的程序入口地址。 一般这类保护的软件都有时间上的限制,如试用30天等,当过了共享软件的试用期后,就不予运行,只有向软件作者付费注册之后才能得到一个有(或无)时间限制的注册版本。使用时间限制技术时,不要依赖于GetLocalTime()、GetSystemTime()这样众所周知的函数来获取系统时间,可以通过读取关键的系统文件的修改时间来得到系统时间的信息。2.3.2 Key File保护 Key File(注册文件)是一种利用文件来注册软件的保护方式。Key File一般
41、是一个小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件,其内容是一些加密过或未加密的数据,其中可能有用户名、注册码等信息。文件格式则由软件作者自己定义。采用keyfile的保护方式时,keyfile的尺寸不能太小,可将其结构设计得比较复杂,在程序中不同的地方对keyfile的不同部分进行复杂的运算和检查。试用版软件没有注册文件,当用户向作者付费注册之后,会收到作者寄来的注册文件,其中可能包含用户的个人信息。用户只要将该文件放入指定的目录,就可以让软件成为正式版。该文件一般是放在软件的安装目录中或系统目录下。软件每次启动时,从该文件中读取数据,然后利用某种算法进行处理,根据处理的结
42、果判断是否为正确的注册文件,如果正确则以注册版模式来运行8。2.3.3 CD-CHECK 简单也最常见的光盘保护就是程序在启动时判断光驱中的光盘上是否存在特定的文件,如果不存在则认为用户没有正版光盘,拒绝运行。在程序运行的过程当中一般不再检查光盘的存在与否。Windows下的具体实现一般是这样的:先用GetLogicalDriveStrings()或GetLogicalDrives()得到系统中安装的所有驱动器的列表,然后再用GetDriveType()检查每一个驱动器,如果是光驱则用CreateFileA()或FindFirstFileA()等函数检查特定的文件存在与否,并可能进一步地检查文
43、件的属性、大小、内容等。这种光盘检查是比较容易被破解的,解密者只要利用上述函数设断点找到程序启动时检查光驱的地方,修改判断指令就可以跳过光盘检查9。2.4 软件保护总结 本节将给出关于软件保护的一般性建议,这些都是无数人经验的总结。程序员在设计自己的保护方式时最好能够遵守这里给出的准则,这样会提高软件的保护强度。1)软件最终发行之前一定要将可执行程序进行加壳/压缩,使得解密者无法直接修改程序。如果时间允许并且有相应的技术能力,最好是设计自己的加壳/压缩方法。如果采用现成的加壳工具,最好不要选择流行的工具,因为这些工具已被广泛深入地加以研究,有了通用的脱壳/解压办法。另外,最好采用两种以上的不同
44、的工具来对程序进行加壳/压缩,并尽可能地利用这些工具提供的反跟踪特性。 2)增加对软件自身的完整性检查。这包括对磁盘文件和内存映像的检查,以防止有人未经允许修改程序以达到破解的目的。DLL和EXE之间可以互相检查完整性。3)所有与软件保护相关的字符串都不能以明文形式直接存放在可执行文件中,这些字符串最好是动态生成。尽可能少地给用户提示信息,因为这些蛛丝马迹都可能导致解密者直接深入到保护的核心。比如,当检测到破解企图之后,不要立即给用户提示信息,而是在系统的某个地方做一个记号,随机地过一段时间后使软件停止工作,或者装作正常工作但实际上却在所处理的数据中加入了一些垃圾。4)将注册码、安装时间记录在
45、多个不同的地方。检查注册信息和时间的代码越分散越好。不要调用同一个函数或判断同一个全局标志,因为这样做的话只要修改了一个地方则全部都被破解了。在检查注册信息的时候插入大量无用的运算以误导解密者,并在检查出错误的注册信息之后加入延时。5)如果试用版与正式版是分开的两个版本,且试用版的软件没有某项功能,则不要仅仅使相关的菜单变灰,而是彻底删除相关的代码,使得编译后的程序中根本没有相关的功能代码。2.5 本章小结 本章主要介绍了序列号保护机制,注册机信息采集技术,其中详细介绍了硬盘物理序列号的获取和一些其它的软件保护技术,通过对比分析,每种算法都有自己的优势,具体使用哪种算法要根据问题的需求,最终本
46、设计选用硬盘物理序列生成注册码的方法。采用硬盘物理序列号生成注册码的保护方式,最好的优势是一机一码,即注册码与机器特征相关,这样一台机器上的注册码就无法在另外一台机器上使用,能有效地防止软件盗版的问题。3 加密算法介绍3.1 DES算法3.1.1 DES算法原理 数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自IBM的研究工作,并在 1977 年被美国政府正式采纳。它是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬件中的。通常自动取款机(Automated Teller Machine,ATM)都使用 DES。 DES 使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64