軟件加密保護(hù)之動(dòng)態(tài)注冊(cè)碼

目前最常用的軟件加密防護(hù)方法就是用戶軟件安裝完畢后,需要向軟件開發(fā)商申請(qǐng)?jiān)S可證才可以不受限制地使用軟件的許可證方法。這種許可證方法就是基于動(dòng)態(tài)注冊(cè)碼的軟件加密保護(hù)方法實(shí)現(xiàn)的。那么我們今天就給大家介紹一下這種基于動(dòng)態(tài)注冊(cè)碼的軟件加密保護(hù)方法。

基于動(dòng)態(tài)注冊(cè)碼的軟件加密保護(hù)的設(shè)計(jì)思想

基于動(dòng)態(tài)注冊(cè)碼的軟件加密方法過程為軟件在使用過程中獲取用戶計(jì)算機(jī)系統(tǒng)已經(jīng)存在的某些特征信息,比如CPU ID、BIOS信息、硬盤序列號(hào)、硬盤分區(qū)信息等能夠?qū)⑷我鈨膳_(tái)機(jī)器區(qū)分開來,這些信息被稱為計(jì)算機(jī)指紋。將指紋信息經(jīng)過一定的處理后生成機(jī)器碼,用戶需將此機(jī)器碼以電話、傳真或者Email等方式告訴軟件開發(fā)商,軟件開發(fā)商在收到此信息確認(rèn)此用戶為合法用戶,則將根據(jù)機(jī)器碼生成的軟件。注冊(cè)碼告訴用戶,用戶在軟件中輸入此注冊(cè)碼,軟件校驗(yàn)此注冊(cè)碼合法后即可正常使用軟件。

由于注冊(cè)碼是根據(jù)計(jì)算機(jī)指紋信息動(dòng)態(tài)生成的,因此這種方法可以確保軟件只在一臺(tái)機(jī)器上使用,具有一定的使用價(jià)值。

基于動(dòng)態(tài)注冊(cè)碼的軟件加密保護(hù)的程序?qū)崿F(xiàn)

一、計(jì)算機(jī)指紋信息提取

本軟件加密保護(hù)方法采用計(jì)算機(jī)硬盤序列號(hào)和網(wǎng)卡MAC地址作為計(jì)算機(jī)指紋信息,獲取硬盤序列號(hào)和網(wǎng)卡物理地址的方法雖然可以通過專用軟件獲取,但是在制作加密程序和軟件安裝時(shí)不夠方便,理想的加密程序應(yīng)該本身具有提取計(jì)算機(jī)指紋信息的功能,而且軟件每次運(yùn)行時(shí)先提取計(jì)算機(jī)指紋信息,然后通過加密算法驗(yàn)證軟件使用的合法性。

獲取硬盤序列號(hào)通過Windows API函數(shù)DeviceIoControl來獲取硬盤信息,得到的信息經(jīng)過轉(zhuǎn)換后就可以得到硬盤序列號(hào),每一塊硬盤序列號(hào)都是唯一的。下面是部分代碼:

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;
}
}

獲取網(wǎng)卡MAC地址要首先對(duì)選定的網(wǎng)卡發(fā)送一個(gè)NCBRESET命令,進(jìn)行初始化后,通過Netbios函數(shù)發(fā)送NCBASTAT命令獲取到網(wǎng)卡信息,最后經(jīng)過轉(zhuǎn)換,得到MAC地址。

把硬盤序列號(hào)和網(wǎng)卡MAC地址進(jìn)行組合(本文只是簡(jiǎn)單疊加)就提取到了所需要的計(jì)算機(jī)指紋信息。

二、附加碼策略

簡(jiǎn)單的提取計(jì)算機(jī)指紋在安全性方面是不夠的,如果對(duì)計(jì)算機(jī)指紋信息不加處理,那么破解者就可以猜出提取的是哪些特征信息,使用公開的算法經(jīng)過簡(jiǎn)單的驗(yàn)證后就會(huì)得到注冊(cè)碼。

為了避免這個(gè)問題,通常需要把提取到的計(jì)算機(jī)指紋信息進(jìn)行處理后再生成注冊(cè)碼,附加碼策略就可以解決這個(gè)問題。這種策略是在軟件代碼中包含一個(gè)軟件開發(fā)者定義的字符串,開發(fā)者自己保存了一個(gè)附加碼表,不同用戶得到的附加碼可能是相同的,也可能不同,附加碼與計(jì)算機(jī)指紋信息組合得到了新的計(jì)算機(jī)特征碼,使用加密算法對(duì)這個(gè)特征碼進(jìn)行加密得到注冊(cè)碼。

三、程序?qū)崿F(xiàn)

動(dòng)態(tài)注冊(cè)碼的生成采用信息-摘要算法(message-digest algorithm 5,MD5)加密算法。MD5算法基于不可逆的字符串變換算法,它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被“壓縮”成一種保密的格式,產(chǎn)生了唯一的MD5信息摘要。這個(gè)算法被廣泛應(yīng)用在加密、解密以及數(shù)字簽名技術(shù)上,具有很高的安全性。

基于動(dòng)態(tài)注冊(cè)碼的軟件加密保護(hù)的安全性

軟件加密保護(hù)的安全性涉及到許多方面,包括反調(diào)試、反跟蹤技術(shù)以及反靜態(tài)分析技術(shù)等。但是就軟件加密的安全性而言,安全性取決于兩個(gè)方面:

(1)算法的安全性;

(2)特征碼提取的難易程度。

動(dòng)態(tài)注冊(cè)碼基于安全的公開算法,同時(shí)采用了動(dòng)態(tài)提取特征碼的方法,因而具有了較高的安全性。

此外,為了提高加密的安全性,在程序設(shè)計(jì)時(shí)做到了以下4點(diǎn):

(1)附加碼在程序中進(jìn)行了簡(jiǎn)單的替換,這樣就不能根據(jù)可執(zhí)行程序直接分析出附加碼的明文;

(2)將生成注冊(cè)碼的代碼和檢測(cè)注冊(cè)碼是否合法的代碼分開,這樣就不可能通過簡(jiǎn)單地判斷系統(tǒng)調(diào)用來獲得注冊(cè)碼;

(3)生成的注冊(cè)碼不存放一個(gè)數(shù)組中,而是分散存放,破解者就很難通過分析內(nèi)存獲得注冊(cè)碼;

(4)檢測(cè)注冊(cè)碼時(shí),加入了一些無用的運(yùn)算,通過誤導(dǎo)破解者來加大破解難度。

對(duì)軟件進(jìn)行加密保護(hù)而言,沒有絕對(duì)安全的軟件加密保護(hù)方法,當(dāng)破解軟件的代價(jià)大于通過正當(dāng)途徑獲得合法版權(quán)軟件的代價(jià)時(shí),就可以認(rèn)為這種加密方保護(hù)法是安全的。

小知識(shí)之動(dòng)態(tài)注冊(cè)碼:

所謂的動(dòng)態(tài)注冊(cè)碼就是軟件在不同的機(jī)器運(yùn)行時(shí)注冊(cè)碼將不同。此做法的好處在于不可能以同一注冊(cè)碼注冊(cè)不同機(jī)器上的軟件。這樣就提高了軟件的安全保密性。