如何利用硬盤號和CPU序列號為軟件加密

計算機軟件是一種特殊的產(chǎn)品,為了防止軟件的非法復(fù)制、盜版,保護軟件開發(fā)商的利益,就必須對軟件進行加密保護。下面我就給大家介紹一個利用硬盤號和CPU序列號為軟件加密的方法。

如何利用硬盤號和CPU序列號為軟件加密

一、基于硬盤號和CPU序列號的軟件加密技術(shù)的原理

軟件會根據(jù)微機硬件參數(shù)給出該軟件的序列號;用戶需要把這一序列號用E-mail、電話或郵寄等方法寄給軟件提供商或開發(fā)商,軟件開發(fā)商利用注冊機(軟件)產(chǎn)生該軟件的注冊號寄給用戶即可。它的注冊信息與機器的硬件信息有關(guān),不同于以前的序列號的注冊方法,提高了軟件的安全性。

二、硬盤號與CPU序列號

1、硬盤序列號

硬盤想序列號是出廠時生產(chǎn)廠家為區(qū)別產(chǎn)品而設(shè)置的,是唯一的,是只讀的,利用硬盤序列號的加密往往是利用其唯一和只讀的特性。在有的加密軟件中采用的是硬盤卷的序列號:以指硬盤的邏輯盤,如:“C:”、“D:”等,是高級格式化時隨機產(chǎn)生的,是可以修改的,由于其可修改,所以利用其進行加密,對于安全而言就大打折扣了。硬盤的卷號通過WINAPI函數(shù),GetVolmeIn-formation即可獲得。就IDEHDD而言,對于沒有序列號或SCSIHDD硬盤則無能為力,這也是利用它進行加密的局限性。

2、CPU序列號

CPU序列號是一個建立在處理器內(nèi)部的、唯一的、不能被修改的編號。它由96位數(shù)字組成。高32位是CPUID,用來識別CPU類型。低64位每個處理器都不同,唯一地代表了該處理器。CPU號可以用來識別每一個處理器。為了適應(yīng)這一新特征,Intel在處理中增加了兩條指令(“讀取”和“禁止”)和一個寄存器位。讀取指令擴展了CPUID讀取指令。當(dāng)執(zhí)行讀取指令時可以得到96位的處理器序列號。禁止指令可以禁止對處理器序列號的讀取。為了配合CPU序列號的讀取和禁止,設(shè)置了MSR位。當(dāng)MSR位為“0”時可以讀取CPU序列號;當(dāng)MSR為“1”時只能讀取高32位(即CPUID)而低64位全為零。

三、如何利用硬盤號和CPU序列號為軟件加密

1、加密方法

通過應(yīng)用程序取得機器硬盤號和CPU號通過加密程序形成一個注冊序列號,用戶將這個注冊序列號發(fā)送到軟件注冊者,軟件注冊者按照預(yù)定的算法生成注冊碼,然后將其發(fā)給用戶,通過注冊形成合法用戶。軟件每次啟動時都到注冊表或注冊文件的相應(yīng)位置讀取注冊碼并與軟件生成的注冊碼比較,一致則是合法用戶,否則是非法用戶。由于注冊碼與用戶計算機的硬盤號和CPU號相關(guān)聯(lián),故其是唯一的,非法用戶即使知道注冊序列號與注冊碼也無法使用。

2、實現(xiàn)過程

(1)CPU號的讀取

硬盤的序列號只能采用對硬盤控制器直接操作的方式進行讀取,也就是說只能采用CPU的I/O指令操作硬盤控制器,對于CPU號的讀取采用了在DELPHI嵌入?yún)R編的方法讀取。

其讀取方法如下:MOVEAX,01H

如果返回的EDX中,低18位為1,那么這個CPU就是支持序列號的。此時EAX就是序列號的高32位。這32位對同一型號的CPU是一樣的。再執(zhí)行:

MOVEAX,03H

此時的EDX:ECX就是序列號的第64位。

(2)硬盤號的讀取

硬盤號的讀取通過CreateFile函數(shù),CreateFile可以打開物理設(shè)備和串口等,使用CreateFile("\\\\.\\PHYSICALDRIVEI",…)打開硬盤,其中的I為0-255,其為需要讀取的硬盤。命令如下:

hDevice:=CreateFile("\\.\PhysicalDrive0",GENERIC_READorGENER-IC_WRITE,F(xiàn)ILE_SHARE_READorFILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0)

使用DeviceIoContro函數(shù)對打開的設(shè)備進行通信,發(fā)送指定命令,根據(jù)返回的PSENDCMDOUTPARAMS結(jié)構(gòu),得到物理序列號和模型號,把物理序列號和模型號格式化為一定的格式輸出。

(3)對注冊表的操作

Delphi程序中可利用TRegisty對象來存取注冊表文件中的信息。

①創(chuàng)建和釋放TRegisty對象通過Create和Destroy來創(chuàng)建對象和釋放內(nèi)存。

②讀取注冊表中寫入信息對于注冊表數(shù)據(jù)的讀取可采用Read-String、ReadInteger、ReadBinaryData等函數(shù)來讀取字符串、數(shù)值、二進制值。

③向注冊表中寫入信息Write系列方法將信息轉(zhuǎn)化為指定的類型,并寫入注冊表。對于注冊表數(shù)據(jù)的寫入可采用Read-String、ReadInteger、ReadBinaryData來寫入字符串、整數(shù)值、二進制值。

基于硬盤號和CPU序列號的軟件加密技術(shù)對于讀取的硬盤號、CPU號可以通過MD5加密算法產(chǎn)生一個注冊號,保證軟件加密的可靠性,可有效地防止非法用戶破解軟注冊碼,保護軟件的知識產(chǎn)權(quán)。

小知識之MD5加密算法:

MD5就是采用單向加密的加密算法,對于MD5而言,有兩個特性是很重要的,第一是任意兩段明文數(shù)據(jù),加密以后的密文不能是相同的;第二是任意一段明文數(shù)據(jù),經(jīng)過加密以后,其結(jié)果必須永遠是不變的。前者的意思是不可能有任意兩段明文加密以后得到相同的密文,后者的意思是如果我們加密特定的數(shù)據(jù),得到的密文一定是相同的。