作为软件开发者,谁都不希望看到自己辛辛苦苦编制的软件被盗版,虽然国家为了打击盗版和保护知识产权出台了一系列的相关法律法规,但仍有众多的地下盗版商在利益的驱使下置国法于不顾,对众多的软件进行非法复制、传播,所以身为软件开发者应加强自我保护意识。为此,我今天就给大家介绍一下用磁盘序列号怎么给软件加密,防止其被盗版。
一、用磁盘序列号给软件加密的设计思路与实现原理
本文采用一种通过对磁盘的序列号进行判别的方式简单而又可靠地来给软件加密,让其不被非法传播。众所周知,在微软的操作系统中,对每一个磁盘都在其格式化时设置有一个随机的8字节长的序列号,虽然理论上有重复的可能,但实际上要找到两个相同的磁盘序列号是很困难的,根据概率论的知识可以算出遇到两个相同磁盘序列号的概率为0.00000000023283,即大约5亿多张磁盘中才会遇到相同的序列号,对我们来说这已经足够了。而且磁盘序列号也不会随着磁盘上的软件内容的拷贝而拷贝,所以我们在此把磁盘序列号作为唯一识别码应用于我们的软件中,可以用API函数GetVolumeInformation来很方便地获取磁盘的序列号,其原型声明如下:
BOOLGetVolumeInformation(LPCTSTRlpRootPathName,
LPTSTRlpVolumeNameBuffer,
DWORDnVolumeNameSize,
LPDWORDlpVolumeSerialNumber,
LPDWORDlpMaximumComponentLength,
LPDWORDlpFileSystemFlags,
LPTSTRlpFileSystemNameBuffer,
DWORDnFileSystemNameSize);
在这里只需通过lpRootPathName来设置我们需要检测的磁盘驱动器号,执行后结果保存在lpVolumeSerialNumber中,其它参数我们不关心,均设为空(NULL)。
GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,
NULL,NULL,10);
VolumeSerialNumber^=0x12345678;m=VolumeSerialNumber;
为避免让人一眼看出本ID即为硬盘系列号,可再对获得的序列号进行一定的变换,本文中让得到的序列号与0x12345678进行按位异或运算,运算的结果作为本软件的机器码。
当用户输入注册信息(注册码)后,我们可将其写入注册表、INI配置文件或其它任一文件中,以便软件进行验证时可读入这些信息,本文将此注册码写入名为key.txt的文件中。
用磁盘序列号给软件加密的流程如图1所示:
二、用磁盘序列号给软件加密的程序的具体实现
利用VC++中的MFCAppWizard创建一个名为kangnian的基于对话框的应用程序,在其初始化函数InitInstance()中添加如下代码:
BOOLCKangnianApp::Initinstance()
{
AfxEnableControlContainer();
DWORDVolumeSerialNumber;
GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,NULL,NULL,10);
//读取磁盘序列号
VolumeSerialNumber^=0x12345678;
//对读取到的序列号进行变换,变换后的数据作为机器码
m=VolumeSerialNumber;
//将机器码赋值给全局变量m,m已在文件StdAfx中定义
ifstreaminfile("key.txt",ios::in);
//以读的方式打开注册码文件key.txt
charline[10];DWORDp,mm;
//定义变量
infile.getline(line,11);
//从key.txt中读取注册码
t=line;
mm=atoi(t);p=m^0x1978aa12;
//对机器码进行换算
if(p!=mm)//判断key.txt中的注册码是否与换算后的机器码不相等
{
CLoginDialogdtt;
//打开验证对话框if(dtt.DoModal()==IDCANCEL)return-1;
}
}
在添加以上代码中的同时,新建一个用于进行验证登陆的对话框,类名CLoginDialog,其对话框界面如图2所示。
程序开始运行时,首先检查注册码文件key.txt是否存在,如果不存在或key.txt中的注册码不正确,则弹出图2所示的注册登陆框,这个登陆框中的机器码是程序一开始运行时自动读取的磁盘序列号并经过简单变换后的数字。如果用户输入正确的注册码则程序可正常运行,同时将正确的注册码写入key.txt文件中,使下次运行程序时不再进行注册;如果注册码不正确,则销毁主程序窗口,程序退出运行。
用户在第一次运行时将产生的机器码发给软件开发者,软件开发者利用自己掌握的含有解密算法的解密端软件,其界面如图3所示,生成注册码,发给用户,用户利用此注册码,方可正确注册从而正常运行软件。
比如,用户得到的注册码为3324433973,用户将此号通过E-mail或其它方式发给软件开发者,软件开发者通过解密端软件得到注册号3753868461,并把此号回馈给用户,用户即可注册软件。
本文设计的利用磁盘序列号给软件加密的方法,即通过提取用户计算机中具有唯一性的磁盘序列号,生成注册码,实现了一台计算机一个注册码,同时采用加密算法,保证了注册码的安全性,解密难度大,可有效防止非法用户,而且实现容易,几乎不需要额外的成本,尤其对非专业的软件开发者非常容易掌握并运用。
小知识之API函数
API函数就是Windows的32位应用程序编程接口,是一系列很复杂的函数、消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。