1. 程式人生 > >【miscellaneous】如何利用硬碟號和CPU序列號為軟體加密

【miscellaneous】如何利用硬碟號和CPU序列號為軟體加密

原文:http://www.jiamisoft.com/blog/index.php/3469-yingpanhaocpuruanjianjiami.html

計算機軟體是一種特殊的產品,為了防止軟體的非法複製、盜版,保護軟體開發商的利益,就必須對軟體進行加密保護。下面我就給大家介紹一個利用硬碟號和CPU序列號為軟體加密的方法。

如何利用硬碟號和CPU序列號為軟體加密

一、基於硬碟號和CPU序列號的軟體加密技術的原理

軟體會根據微機硬體引數給出該軟體的序列號;使用者需要把這一序列號用E-mail、電話或郵寄等方法寄給軟體提供商或開發商,軟體開發商利用註冊機(軟體)產生該軟體的註冊號寄給使用者即可。它的註冊資訊與機器的硬體資訊有關,不同於以前的序列號的註冊方法,提高了軟體的安全性。

二、硬碟號與CPU序列號

1、硬碟序列號

硬碟想序列號是出廠時生產廠家為區別產品而設定的,是唯一的,是隻讀的,利用硬碟序列號的加密往往是利用其唯一和只讀的特性。在有的加密軟體中採用的是硬碟卷的序列號:以指硬碟的邏輯盤,如:“C:”、“D:”等,是高階格式化時隨機產生的,是可以修改的,由於其可修改,所以利用其進行加密,對於安全而言就大打折扣了。硬碟的卷號通過WINAPI函式,GetVolmeIn-formation即可獲得。就IDEHDD而言,對於沒有序列號或SCSIHDD硬碟則無能為力,這也是利用它進行加密的侷限性。

2、CPU序列號

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

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

1、加密方法

通過應用程式取得機器硬碟號和CPU號通過加密程式形成一個註冊序列號,使用者將這個註冊序列號傳送到軟體註冊者,軟體註冊者按照預定的演算法生成註冊碼,然後將其發給使用者,通過註冊形成合法使用者。軟體每次啟動時都到登錄檔或註冊檔案的相應位置讀取註冊碼並與軟體生成的註冊碼比較,一致則是合法使用者,否則是非法使用者。由於註冊碼與使用者計算機的硬碟號和CPU號相關聯,故其是唯一的,非法使用者即使知道註冊序列號與註冊碼也無法使用。

2、實現過程

(1)CPU號的讀取

硬碟的序列號只能採用對硬碟控制器直接操作的方式進行讀取,也就是說只能採用CPU的I/O指令操作硬碟控制器,對於CPU號的讀取採用了在DELPHI嵌入彙編的方法讀取。

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

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

MOVEAX,03H

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

(2)硬碟號的讀取

硬碟號的讀取通過CreateFile函式,CreateFile可以開啟物理裝置和串列埠等,使用CreateFile(”\\\\.\\PHYSICALDRIVEI”,…)開啟硬碟,其中的I為0-255,其為需要讀取的硬碟。命令如下:

hDevice:=CreateFile(”\\.\PhysicalDrive0″,GENERIC_READorGENER-IC_WRITE,FILE_SHARE_READorFILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0)

使用DeviceIoContro函式對開啟的裝置進行通訊,傳送指定命令,根據返回的PSENDCMDOUTPARAMS結構,得到物理序列號和模型號,把物理序列號和模型號格式化為一定的格式輸出。

(3)對登錄檔的操作

Delphi程式中可利用TRegisty物件來存取登錄檔檔案中的資訊。

①建立和釋放TRegisty物件通過Create和Destroy來建立物件和釋放記憶體。

②讀取登錄檔中寫入資訊對於登錄檔資料的讀取可採用Read-String、ReadInteger、ReadBinaryData等函式來讀取字串、數值、二進位制值。

③向登錄檔中寫入資訊Write系列方法將資訊轉化為指定的型別,並寫入登錄檔。對於登錄檔資料的寫入可採用Read-String、ReadInteger、ReadBinaryData來寫入字串、整數值、二進位制值。

基於硬碟號和CPU序列號的軟體加密技術對於讀取的硬碟號、CPU號可以通過MD5加密演算法產生一個註冊號,保證軟體加密的可靠性,可有效地防止非法使用者破解軟註冊碼,保護軟體的智慧財產權。

小知識之MD5加密演算法:

MD5就是採用單向加密的加密演算法,對於MD5而言,有兩個特性是很重要的,第一是任意兩段明文資料,加密以後的密文不能是相同的;第二是任意一段明文資料,經過加密以後,其結果必須永遠是不變的。前者的意思是不可能有任意兩段明文加密以後得到相同的密文,後者的意思是如果我們加密特定的資料,得到的密文一定是相同的。