目前最常用的软件加密防护方法就是用户软件安装完毕后,需要向软件开发商申请许可证才可以不受限制地使用软件的许可证方法。这种许可证方法就是基于动态注册码的软件加密保护方法实现的。那么我们今天就给大家介绍一下这种基于动态注册码的软件加密保护方法。

基于动态注册码的软件加密保护的设计思想

基于动态注册码的软件加密方法过程为软件在使用过程中获取用户计算机系统已经存在的某些特征信息,比如CPU ID、BIOS信息、硬盘序列号、硬盘分区信息等能够将任意两台机器区分开来,这些信息被称为计算机指纹。将指纹信息经过一定的处理后生成机器码,用户需将此机器码以电话、传真或者Email等方式告诉软件开发商,软件开发商在收到此信息确认此用户为合法用户,则将根据机器码生成的软件。注册码告诉用户,用户在软件中输入此注册码,软件校验此注册码合法后即可正常使用软件。

由于注册码是根据计算机指纹信息动态生成的,因此这种方法可以确保软件只在一台机器上使用,具有一定的使用价值。

基于动态注册码的软件加密保护的程序实现

一、计算机指纹信息提取

本软件加密保护方法采用计算机硬盘序列号和网卡MAC地址作为计算机指纹信息,获取硬盘序列号和网卡物理地址的方法虽然可以通过专用软件获取,但是在制作加密程序和软件安装时不够方便,理想的加密程序应该本身具有提取计算机指纹信息的功能,而且软件每次运行时先提取计算机指纹信息,然后通过加密算法验证软件使用的合法性。

获取硬盘序列号通过Windows API函数DeviceIoControl来获取硬盘信息,得到的信息经过转换后就可以得到硬盘序列号,每一块硬盘序列号都是唯一的。下面是部分代码:

if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_ MINIPORT,
buffer,
sizeof (SRB_IO_CONTROL) + sizeof (SENDCMDINPARAMS) - 1,
buffer,
sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
&dummy, NULL))
{
SENDCMDOUTPARAMS *pOut =
(SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
if (pId -> sModelNumber [0])
{
DWORD diskdata [256];
int ijk = 0;
USHORT *pIdSector = (USHORT *) pId;
for (ijk = 0; ijk < 256; ijk++)
diskdata [ijk] = pIdSector [ijk];
PrintIdeInfo (controller * 2 + drive, diskdata);
done = TRUE;
}
}

获取网卡MAC地址要首先对选定的网卡发送一个NCBRESET命令,进行初始化后,通过Netbios函数发送NCBASTAT命令获取到网卡信息,最后经过转换,得到MAC地址。

把硬盘序列号和网卡MAC地址进行组合(本文只是简单叠加)就提取到了所需要的计算机指纹信息。

二、附加码策略

简单的提取计算机指纹在安全性方面是不够的,如果对计算机指纹信息不加处理,那么破解者就可以猜出提取的是哪些特征信息,使用公开的算法经过简单的验证后就会得到注册码。

为了避免这个问题,通常需要把提取到的计算机指纹信息进行处理后再生成注册码,附加码策略就可以解决这个问题。这种策略是在软件代码中包含一个软件开发者定义的字符串,开发者自己保存了一个附加码表,不同用户得到的附加码可能是相同的,也可能不同,附加码与计算机指纹信息组合得到了新的计算机特征码,使用加密算法对这个特征码进行加密得到注册码。

三、程序实现

动态注册码的生成采用信息-摘要算法(message-digest algorithm 5,MD5)加密算法。MD5算法基于不可逆的字符串变换算法,它的作用是让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式,产生了唯一的MD5信息摘要。这个算法被广泛应用在加密、解密以及数字签名技术上,具有很高的安全性。

基于动态注册码的软件加密保护的安全性

软件加密保护的安全性涉及到许多方面,包括反调试、反跟踪技术以及反静态分析技术等。但是就软件加密的安全性而言,安全性取决于两个方面:

(1)算法的安全性;

(2)特征码提取的难易程度。

动态注册码基于安全的公开算法,同时采用了动态提取特征码的方法,因而具有了较高的安全性。

此外,为了提高加密的安全性,在程序设计时做到了以下4点:

(1)附加码在程序中进行了简单的替换,这样就不能根据可执行程序直接分析出附加码的明文;

(2)将生成注册码的代码和检测注册码是否合法的代码分开,这样就不可能通过简单地判断系统调用来获得注册码;

(3)生成的注册码不存放一个数组中,而是分散存放,破解者就很难通过分析内存获得注册码;

(4)检测注册码时,加入了一些无用的运算,通过误导破解者来加大破解难度。

对软件进行加密保护而言,没有绝对安全的软件加密保护方法,当破解软件的代价大于通过正当途径获得合法版权软件的代价时,就可以认为这种加密方保护法是安全的。

小知识之动态注册码:

所谓的动态注册码就是软件在不同的机器运行时注册码将不同。此做法的好处在于不可能以同一注册码注册不同机器上的软件。这样就提高了软件的安全保密性。