原文:http://www.jiamisoft.com/blog/index.php/3469-yingpanhaocpuruanjianjiami.htmlphp
计算机软件是一种特殊的产品,为了防止软件的非法复制、盗版,保护软件开发商的利益,就必须对软件进行加密保护。下面我就给你们介绍一个利用硬盘号和CPU序列号为软件加密的方法。html
1、基于硬盘号和CPU序列号的软件加密技术的原理算法
软件会根据微机硬件参数给出该软件的序列号;用户须要把这一序列号用E-mail、电话或邮寄等方法寄给软件提供商或开发商,软件开发商利用注册机(软件)产生该软件的注册号寄给用户便可。它的注册信息与机器的硬件信息有关,不一样于之前的序列号的注册方法,提升了软件的安全性。安全
2、硬盘号与CPU序列号函数
一、硬盘序列号加密
硬盘想序列号是出厂时生产厂家为区别产品而设置的,是惟一的,是只读的,利用硬盘序列号的加密每每是利用其惟一和只读的特性。在有的加密软件中采用的是硬盘卷的序列号:以指硬盘的逻辑盘,如:“C:”、“D:”等,是高级格式化时随机产生的,是能够修改的,因为其可修改,因此利用其进行加密,对于安全而言就大打折扣了。硬盘的卷号经过WINAPI函数,GetVolmeIn-formation便可得到。就IDEHDD而言,对于没有序列号或SCSIHDD硬盘则无能为力,这也是利用它进行加密的局限性。spa
二、CPU序列号orm
CPU序列号是一个创建在处理器内部的、惟一的、不能被修改的编号。它由96位数字组成。高32位是CPUID,用来识别CPU类型。低64位每一个处理器都不一样,惟一地表明了该处理器。CPU号能够用来识别每个处理器。为了适应这一新特征,Intel在处理中增长了两条指令(“读取”和“禁止”)和一个寄存器位。读取指令扩展了CPUID读取指令。当执行读取指令时能够获得96位的处理器序列号。禁止指令能够禁止对处理器序列号的读取。为了配合CPU序列号的读取和禁止,设置了MSR位。当MSR位为“0”时能够读取CPU序列号;当MSR为“1”时只能读取高32位(即CPUID)而低64位全为零。htm
3、如何利用硬盘号和CPU序列号为软件加密对象
一、加密方法
经过应用程序取得机器硬盘号和CPU号经过加密程序造成一个注册序列号,用户将这个注册序列号发送到软件注册者,软件注册者按照预约的算法生成注册码,而后将其发给用户,经过注册造成合法用户。软件每次启动时都到注册表或注册文件的相应位置读取注册码并与软件生成的注册码比较,一致则是合法用户,不然是非法用户。因为注册码与用户计算机的硬盘号和CPU号相关联,故其是惟一的,非法用户即便知道注册序列号与注册码也没法使用。
二、实现过程
(1)CPU号的读取
硬盘的序列号只能采用对硬盘控制器直接操做的方式进行读取,也就是说只能采用CPU的I/O指令操做硬盘控制器,对于CPU号的读取采用了在DELPHI嵌入汇编的方法读取。
其读取方法以下:MOVEAX,01H
若是返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。此时EAX就是序列号的高32位。这32位对同一型号的CPU是同样的。再执行:
MOVEAX,03H
此时的EDX:ECX就是序列号的第64位。
(2)硬盘号的读取
硬盘号的读取经过CreateFile函数,CreateFile能够打开物理设备和串口等,使用CreateFile(”\\\\.\\PHYSICALDRIVEI”,…)打开硬盘,其中的I为0-255,其为须要读取的硬盘。命令以下:
hDevice:=CreateFile(”\\.\PhysicalDrive0″,GENERIC_READorGENER-IC_WRITE,FILE_SHARE_READorFILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0)
使用DeviceIoContro函数对打开的设备进行通讯,发送指定命令,根据返回的PSENDCMDOUTPARAMS结构,获得物理序列号和模型号,把物理序列号和模型号格式化为必定的格式输出。
(3)对注册表的操做
Delphi程序中可利用TRegisty对象来存取注册表文件中的信息。
①建立和释放TRegisty对象经过Create和Destroy来建立对象和释放内存。
②读取注册表中写入信息对于注册表数据的读取可采用Read-String、ReadInteger、ReadBinaryData等函数来读取字符串、数值、二进制值。
③向注册表中写入信息Write系列方法将信息转化为指定的类型,并写入注册表。对于注册表数据的写入可采用Read-String、ReadInteger、ReadBinaryData来写入字符串、整数值、二进制值。
基于硬盘号和CPU序列号的软件加密技术对于读取的硬盘号、CPU号能够经过MD5加密算法产生一个注册号,保证软件加密的可靠性,可有效地防止非法用户破解软注册码,保护软件的知识产权。
小知识之MD5加密算法:
MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密之后的密文不能是相同的;第二是任意一段明文数据,通过加密之后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密之后获得相同的密文,后者的意思是若是咱们加密特定的数据,获得的密文必定是相同的。