一、引言
在互聯網飛速發展的今天,大量單位和個人以網絡為平臺進行軟件等信息產品的傳播,形成一種新的網絡運營模式。通過網絡,人們可以方便地下載、使用和復制軟件,而作為計算機軟件本身而言,它是一種特殊的產品,如果企業或個人沒有給自己開發的軟件采取防盜版措施,那么該軟件就極易被復制使用,甚至被惡意者破壞,給企業或個人帶來經濟損失。為了有效地保護計算機軟件的產權,一般采取一些加密手段來保護自己的軟件。
二、加密手段
通常,防御最終用戶試圖非法獲得軟件的手段是進行身份認證,大致有以下幾種方法:
1.在安裝過程要求輸入產品的序列號,如Windows 98、office 97等,由于序列號具有通用性,很難保證用戶不盜用他人的許可證,這很難從根本上解決每一用戶都不侵犯著作者的知識產權。
2.在軟件安裝或使用軟件的時候要求用戶在軟驅中插入軟件附帶的密鑰盤,這種加密的原理是在軟盤的特殊位置寫入一些信息,軟件在運行時要檢驗這些信息。這種軟盤就好像一把鑰匙,軟件開發商只需一次投資購買一套加密工具就可以自己制作多張鑰匙盤。此方法加密簡單,成本低,在軟件發展的不同時期都能看到其閃光點。由于軟盤是一種易損載體,加密軟件對軟件加密點的反復讀寫很容易造成軟盤的損壞。而這張加密盤又不能備份,軟件公司要不斷應付用戶更換加密盤的請求。
3.在軟件安裝完成后要求用戶通過Internet注冊產品序列號,注冊成功后可以使用該軟件,或給最終用戶一段時間的試用期限,如果超過期限且未聯網注冊,則強迫終止用戶對該軟件的使用,這種方式比較方便,而且具有較好的加密性能,但對于不能聯網的計算機有時也會出現一些麻煩。
4.采用軟件加密狗,它是一種智能型的軟件加密工具,包含一個安裝在計算機并行口或 USB 口上的硬件,及一套適用于各種語言的接口軟件和工具軟件。是基于硬件加密技術,其目的是通過對軟件與數據的加密防止知識產權被非法使用。這種方式加密性能好,但造價稍高。
本文將主要對第二、三方法的實現進行介紹。
三、預備知識
磁盤序列號,簡稱磁盤ID,是對磁盤格式化時隨機產生的磁盤標識信息,是一個卷序列號,該序列號一般是唯一的,重復率為百億分之一。在MS-DOS下鍵入dir命令回車,屏幕會顯示當前磁盤的卷標序列號信息,如:584F-FB76,是一個16進制數值,用高級語言程序也可以讀出這個序列號來。我們可以把這個序列號通過邏輯運算進行加密,將加密后的結果以許可文件的形式寫回磁盤,這樣就保證磁盤和磁盤里的許可文件一一對應,防止了對該盤的復制,這就是第二種加密方式中許可盤的制作方法。對于第三種方式則可以利用最終用戶機器的唯一標識,如硬盤序列號,由應用程序讀取用戶硬盤序列號,加密后形成一個文件或一個字符串,用戶發送這個文件或字符串到軟件制作者,軟件制作者把這個文件或字符串按照預定的算法加密后發給用戶注冊。這樣也可以保證注冊文件和機器唯一對應,防止了用戶隨意拷貝應用程序。關于軟件試用期,則還需要在用戶第一次運行程序的時候把運行的時間加密后寫入系統注冊表的一隱蔽位置,以后啟動該程序的時候先檢測注冊文件,如果沒有注冊,則檢測注冊表來判斷軟件是否過期,并當用戶沒有注冊的時候提示用戶注冊,如果已經注冊則跳過這一步。在本文中為使程序簡單,暫時不考慮試用期的情況。以下是讀取磁盤序列號的函數: BOOL GetVolumeInformation(
LPCTSTR lpRootPathName , // address of root directory of the file system
LPTSTR lpVolumeNameBuffer , // address of name of the volume
DWORD nVolumeNameSize , // length of lpVolumeNameBuffer
LPDWORD lpVolumeSerialNumber , // address of volume serial number
LPDWORD lpMaximumComponentLength , // address of system's maximum filename length
LPDWORD lpFileSystemFlags , // address of file system flags
LPTSTR lpFileSystemNameBuffer , // address of name of file system
DWORD nFileSystemNameSize // length of lpFileSystemNameBuffer
);
四、實現過程
1. 具體實現
以Visual Basic6.0(以下簡稱VB)為例說明,其他語言的實現方法類似。首先,注冊程序要在應用程序執行之前啟動,可以把這段檢測代碼放在第一個窗體的載入過程或放在模塊的Sub Main()函數中,并在工程屬性中設定啟動項。本程序放入Sub Main()函數,在VB工程中添加一模塊,通過API Viewer復制GetVolumeInformation函數至添加的模塊中,并添加以下函數:
Function EnCode(Data As String, Key As String) As String `數據加密函數
Dim Res As String
Dim KeyLen, DataLen, KeyPos As Integer
Res = ""
KeyPos = 1
KeyLen = Len(Key) '密鑰的長度
DataLen = Len(Data) '待加密數據的長度
For i = 1 To DataLen
Res = Res & Chr(Asc(Mid(Data, i, 1)) Xor Asc(Mid(Key, KeyPos, 1))) '數據和密鑰進行異或操作,用相同的密鑰加密2次,可以回復到原來的數據,這樣軟件著作者,很容易得知用戶的磁盤序列號。
KeyPos = KeyPos + 1
If KeyPos > KeyLen Then KeyPos = 1
Next i
EnCode = Res
End Function
Function GetRegData() As String '讀取注冊文件內的信息
Dim RegData As String
Open "reg.dat" For Input As #1
Line Input #1, RegData
Close #1
GetRegData = RegData
End Function
Sub SetErrorDataToFile(Data As String) '寫信息至注冊文件
Dim RegData As String
Open "reg.dat" For Output As #1
Print #1, Data
Close #1
End Sub
Sub main()
Dim VolumeNameBuffer As String
Dim VolumeNameSize As Long
Dim VolumeSerialNumber As Long
Dim MaximumComponentLength As Long
Dim FileSystemFlags As Long
Dim FileSystemNameBuffer As String
Dim FileSystemNameSize As Long
Dim TheData As String
Dim ThisData As String
Dim RegData As String
`獲取磁盤序列號
GetVolumeInformation "c:\", VolumeNameBuffer, VolumeNameSize, VolumeSerialNumber,
MaximumComponentLength, FileSystemFlags, FileSystemNameBuffer, FileSystemNameSize
TheData = Str(VolumeSerialNumber) '把磁盤序列號轉化為字符串的形式
ThisData = EnCode(TheData, "comprg.com") '以“comprg.com”為密鑰對磁盤序列號進行加密
RegData = GetRegData() '從注冊文件中讀取注冊信息
If ThisData <> RegData Then
MsgBox "沒有注冊,退出!"
SetErrorDataToFile EnCode(TheData, "xyz") '用戶沒有注冊,把磁盤序列號以“xyz”加密后寫回注
`冊文件
Exit Sub
End If
Load Form1 '進入應用程序
Form1.Show
End Sub
軟件作者運行的生成用戶注冊文件的主要程序如下:
Private Sub CmdOK_Click() '根據用戶發送的序列號信息生成正確的軟件注冊信息
Dim TheData As String
Dim RegData As String
If TxtCode.Text = "" Then
MsgBox "沒有任何數據"
Exit Sub
End If
TheData = EnCode(TxtCode.Text, "xyz") '還原用戶磁盤序列號
RegData = EnCode(TheData, "comprg.com") '重新加密用戶磁盤序列號
SetRegDataToFile RegData '把加密后的序列號信息寫入文件
MsgBox "終端用戶注冊文件已生成!"
End Sub
五、結語
本文分析了應用軟件加密的基本方法和思想,并給出了一種數據加密的算法,用VB實現,該方法同樣可適用于其他高級語言。如果把生成正確注冊號的算法應用于網絡,用戶便可以運用reg.dat的內容,隨時通過網絡注冊并獲得正確的序列號。由于加密密鑰的長度本身可變,文中的算法只要稍加改動,即可有效防止非法用戶破解軟件注冊碼而實施盜版的企圖,保護了軟件的知識產權。
參考文獻
MSDN library Visual Studio 6.0
|