用磁盤序列號給軟件加密

作為軟件開發(fā)者,誰都不希望看到自己辛辛苦苦編制的軟件被盜版,雖然國家為了打擊盜版和保護知識產(chǎn)權(quán)出臺了一系列的相關(guān)法律法規(guī),但仍有眾多的地下盜版商在利益的驅(qū)使下置國法于不顧,對眾多的軟件進行非法復制、傳播,所以身為軟件開發(fā)者應加強自我保護意識。為此,我今天就給大家介紹一下用磁盤序列號怎么給軟件加密,防止其被盜版。

一、用磁盤序列號給軟件加密的設計思路與實現(xiàn)原理

本文采用一種通過對磁盤的序列號進行判別的方式簡單而又可靠地來給軟件加密,讓其不被非法傳播。眾所周知,在微軟的操作系統(tǒng)中,對每一個磁盤都在其格式化時設置有一個隨機的8字節(jié)長的序列號,雖然理論上有重復的可能,但實際上要找到兩個相同的磁盤序列號是很困難的,根據(jù)概率論的知識可以算出遇到兩個相同磁盤序列號的概率為0.00000000023283,即大約5億多張磁盤中才會遇到相同的序列號,對我們來說這已經(jīng)足夠了。而且磁盤序列號也不會隨著磁盤上的軟件內(nèi)容的拷貝而拷貝,所以我們在此把磁盤序列號作為唯一識別碼應用于我們的軟件中,可以用API函數(shù)GetVolumeInformation來很方便地獲取磁盤的序列號,其原型聲明如下:

BOOLGetVolumeInformation(LPCTSTRlpRootPathName,

LPTSTRlpVolumeNameBuffer,

DWORDnVolumeNameSize,

LPDWORDlpVolumeSerialNumber,

LPDWORDlpMaximumComponentLength,

LPDWORDlpFileSystemFlags,

LPTSTRlpFileSystemNameBuffer,

DWORDnFileSystemNameSize);

在這里只需通過lpRootPathName來設置我們需要檢測的磁盤驅(qū)動器號,執(zhí)行后結(jié)果保存在lpVolumeSerialNumber中,其它參數(shù)我們不關(guān)心,均設為空(NULL)。

GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,

NULL,NULL,10);

VolumeSerialNumber^=0x12345678;m=VolumeSerialNumber;

為避免讓人一眼看出本ID即為硬盤系列號,可再對獲得的序列號進行一定的變換,本文中讓得到的序列號與0x12345678進行按位異或運算,運算的結(jié)果作為本軟件的機器碼。

當用戶輸入注冊信息(注冊碼)后,我們可將其寫入注冊表、INI配置文件或其它任一文件中,以便軟件進行驗證時可讀入這些信息,本文將此注冊碼寫入名為key.txt的文件中。

用磁盤序列號給軟件加密的流程如圖1所示:

用磁盤序列號給軟件加密

二、用磁盤序列號給軟件加密的程序的具體實現(xiàn)

利用VC++中的MFCAppWizard創(chuàng)建一個名為kangnian的基于對話框的應用程序,在其初始化函數(shù)InitInstance()中添加如下代碼:

BOOLCKangnianApp::Initinstance()

{

AfxEnableControlContainer();

DWORDVolumeSerialNumber;

GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,NULL,NULL,10);

//讀取磁盤序列號

VolumeSerialNumber^=0x12345678;

//對讀取到的序列號進行變換,變換后的數(shù)據(jù)作為機器碼

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所示的注冊登陸框,這個登陸框中的機器碼是程序一開始運行時自動讀取的磁盤序列號并經(jīng)過簡單變換后的數(shù)字。如果用戶輸入正確的注冊碼則程序可正常運行,同時將正確的注冊碼寫入key.txt文件中,使下次運行程序時不再進行注冊;如果注冊碼不正確,則銷毀主程序窗口,程序退出運行。

用戶在第一次運行時將產(chǎn)生的機器碼發(fā)給軟件開發(fā)者,軟件開發(fā)者利用自己掌握的含有解密算法的解密端軟件,其界面如圖3所示,生成注冊碼,發(fā)給用戶,用戶利用此注冊碼,方可正確注冊從而正常運行軟件。

用磁盤序列號給軟件加密

比如,用戶得到的注冊碼為3324433973,用戶將此號通過E-mail或其它方式發(fā)給軟件開發(fā)者,軟件開發(fā)者通過解密端軟件得到注冊號3753868461,并把此號回饋給用戶,用戶即可注冊軟件。

本文設計的利用磁盤序列號給軟件加密的方法,即通過提取用戶計算機中具有唯一性的磁盤序列號,生成注冊碼,實現(xiàn)了一臺計算機一個注冊碼,同時采用加密算法,保證了注冊碼的安全性,解密難度大,可有效防止非法用戶,而且實現(xiàn)容易,幾乎不需要額外的成本,尤其對非專業(yè)的軟件開發(fā)者非常容易掌握并運用。

小知識之API函數(shù)

API函數(shù)就是Windows的32位應用程序編程接口,是一系列很復雜的函數(shù)、消息和結(jié)構(gòu),它使編程人員可以用不同類型的編程語言編制出的運行在Windows95和Windows NT操作系統(tǒng)上的應用程序。