(汕頭職業(yè)技術(shù)學(xué)院計算機(jī)系,廣東 汕頭515078)
作為軟件開發(fā)企業(yè)來說,如何保護(hù)其軟件產(chǎn)品不受盜版影響,事關(guān)企業(yè)的生存和發(fā)展。一般情況下,軟件保護(hù)方法有使用加密狗保護(hù)和使用認(rèn)證書2種方法,但不管使用哪種方法,都只能增加軟件破解的難度,而無法保證絕對不受盜版的侵害?;跈C(jī)器特征碼的軟件簡便認(rèn)證方法,可以讓用戶自定義加密方法,在軟件安裝過程中獲取機(jī)器特征碼,如CPU的ID、主板IDE序列碼或網(wǎng)卡MAC等,編制加密文件作為軟件在該機(jī)器運行的許可認(rèn)證,軟件公司可以將機(jī)器與軟件序碼捆綁,通過網(wǎng)上激活的方法來控制軟件在捆綁機(jī)器上的使用[1]。該方法簡便易行,且由于加密規(guī)則由用戶自定義,增加了軟件破解難度,從而達(dá)到保護(hù)軟件的目的。為此,筆者對基于機(jī)器碼的軟件簡便認(rèn)證方法進(jìn)行了研究。
要生成軟件認(rèn)證文件,必須完成以下主要步驟:①獲取用戶端的機(jī)器特征碼;②將用戶端的特征碼加密成認(rèn)證文件;③將認(rèn)證文件發(fā)回用戶端;④在程序中讀取認(rèn)證文件,按一定規(guī)則解密取得特征碼與本機(jī)特征碼比對,判斷是否予以執(zhí)行。獲取機(jī)器特征碼如圖1所示,生成認(rèn)證文件如圖2所示,軟件運行流程如圖3所示。

圖1 獲取機(jī)器特征碼

圖2 生成認(rèn)證文件
當(dāng)軟件用戶安裝軟件時,先運行一段程序,用于產(chǎn)生加密的機(jī)器特征碼文件,加密種子為其后的六位隨機(jī)十六進(jìn)制碼。要求用戶填寫軟件序列碼,接著上網(wǎng)激活,服務(wù)器端讀取用戶加密文件和軟件序列碼,解密得到機(jī)器的特征碼,如數(shù)據(jù)庫沒有序列碼的捆綁記錄或存在與當(dāng)前特征碼捆綁情況時,可按照軟件加密規(guī)則產(chǎn)生一個key.lic認(rèn)證文件并發(fā)送到用戶的安裝目錄中,否則告知用戶該序列碼已與其他計算機(jī)捆綁,不能在本機(jī)使用[2]。當(dāng)激活并安裝正確后,在運行軟件時利用約定的解密規(guī)則讀取key.lic文件,解碼得到機(jī)器特征碼,與當(dāng)前機(jī)器碼對比,如一致則放行,否則告知用戶該序列碼已在其他機(jī)器登記而不能在本機(jī)運行。

圖3 軟件運行流程
1)獲取機(jī)器特征碼 安裝軟件時,從用戶端獲取機(jī)器特征碼,包括本機(jī)的4組8位十六進(jìn)制CPU的ID碼(如0001067A-01020800-0408E39D-BFEBFBFF)、主版的IDE序列碼(如081104BB6C005GGZUAXJ)或網(wǎng)卡的MAC(如00-23-8B-56-4E-D9)等。以獲取CPU的ID為例,可以編制一個動態(tài)庫cpuid.dll,函數(shù)為GetCPUID:TCPUID[3],以便獲得用戶端CPU的ID。常見方法如下:①在程序開發(fā)過程直接調(diào)用API函數(shù)獲取4組8位十六進(jìn)制碼;②嵌入一段匯編程序來獲取。以下為獲取CPU的ID的匯編程序。

2)生成6位隨機(jī)碼 當(dāng)讀取本機(jī)的特征碼后,為保密起見,應(yīng)該將信息加密而不是以明碼方式發(fā)送到軟件廠商。加密時,混入一組6位的隨機(jī)十六進(jìn)制碼。為此,必須編制一個生成6位十六進(jìn)制碼的動態(tài)庫B6RND.dll,可通過函數(shù)B6crt()產(chǎn)生6位十六進(jìn)制數(shù)。
3)生成字符串加解密動態(tài)庫 文件在傳輸過程必須加密,加密規(guī)則應(yīng)由開發(fā)者定義。為此,必須編制一個字符串加/解密的動態(tài)庫mdsec.dll,加密函數(shù)是 Makesec(原字符串:pchar;加密字符串:pchar),輸出加密后字符串:pchar;解密函數(shù)是Disce(加密后字符串:pchar;加密字符串:pchar),輸出還原字符串:pchar。
采用ASCII碼加密方法,其規(guī)則由開發(fā)者定義。字符串為字母或數(shù)字,不要含標(biāo)點,加密字符串不長于原字符串。
獲得安裝軟件的機(jī)器特征碼并進(jìn)行加密,這樣用戶就看不到程序究竟是使用何種機(jī)器碼來認(rèn)證,從而增加軟件被破解的難度。應(yīng)該注意的是,文件必須包含加密的種子字符串,這樣才能被重新解密出機(jī)器特征碼。將加密后的文件getlic.dat發(fā)送到軟件商,可以獲取認(rèn)證文件。
讀取用戶加密文件getlic.dat,按自定義規(guī)則解密后獲得用戶的機(jī)器碼,軟件商按新的加密規(guī)則重新加密后生成新加密認(rèn)證文件key.lic。為了增加文件被破解的難度,建議采用二進(jìn)制方式寫入,首字節(jié)為有效字節(jié)的指針,混寫入一些無關(guān)的字節(jié),這樣用戶便無法獲知文件內(nèi)容,也無法獲知是何種機(jī)器碼或組合。將認(rèn)證文件發(fā)送回用戶,拷貝到指定目錄即可。也可以在網(wǎng)上直接給用戶認(rèn)證,這樣更加方便快捷。
在程序中,讀取認(rèn)證文件并按加密規(guī)則解密得到機(jī)器特征碼,與讀取的本機(jī)特征碼比較來進(jìn)行認(rèn)證控制。如驗證通過則運行正式版本的軟件,否則提醒用戶驗證失敗,運行限制(如限時/次或減少部分功能)版本軟件。另外,由于認(rèn)證文件與機(jī)器碼有關(guān),因而即使拷貝到其他電腦軟件也無法正常使用。至此,便可實現(xiàn)軟件與機(jī)器特征碼的捆綁認(rèn)證。當(dāng)然,還可以采用比較復(fù)雜的辦法,比如多種機(jī)器碼混合使用,或者采用更復(fù)雜的加密算法,如用流行的MD5算法編制加密的許可文件來驗證軟件是否許可運行[4]。
為了保護(hù)軟件的知識產(chǎn)權(quán)不受侵害,通過對比機(jī)器特征碼與加密認(rèn)證文件的特征碼,實現(xiàn)了軟件的認(rèn)證控制。實踐表明,基于機(jī)器特征碼的軟件認(rèn)證方法簡便實用,控制靈活,特別適用于軟件與機(jī)器捆綁認(rèn)證。
[1]William Stallings.密碼編碼學(xué)與網(wǎng)絡(luò)安全原理與實踐 [M].劉玉珍,王麗娜,傅建明 等譯.北京:電子工業(yè)出版社,2001.
[2]樊剛.加密與解密——軟件保護(hù)技術(shù)及完全解決方案 [M].北京:電子工業(yè)出版社,2001.
[3]熊曾剛,張學(xué)敏,王時繪.軟件加密技術(shù)及應(yīng)用實例 [J].控制工程,2003,10(6):571-573,576.
[4]王津濤,覃尚毅,王冬梅.基于MD5的迭代冗余加密算法 [J].北京:計算機(jī)工程與設(shè)計,2007,28(1):41-42.