如何利用硬盤(pán)號(hào)和CPU序列號(hào)為軟件加密

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

如何利用硬盤(pán)號(hào)和CPU序列號(hào)為軟件加密

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

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

二、硬盤(pán)號(hào)與CPU序列號(hào)

1、硬盤(pán)序列號(hào)

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

2、CPU序列號(hào)

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

三、如何利用硬盤(pán)號(hào)和CPU序列號(hào)為軟件加密

1、加密方法

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

2、實(shí)現(xiàn)過(guò)程

(1)CPU號(hào)的讀取

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

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

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

MOVEAX,03H

此時(shí)的EDX:ECX就是序列號(hào)的第64位。

(2)硬盤(pán)號(hào)的讀取

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

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

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

(3)對(duì)注冊(cè)表的操作

Delphi程序中可利用TRegisty對(duì)象來(lái)存取注冊(cè)表文件中的信息。

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

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

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

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

小知識(shí)之MD5加密算法:

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