用過共享軟體的人都知道,一般的共享軟體(特別是國外的)在使用一段時間後都會提出一些「苛刻」的要求,如讓您輸入註冊號等等。如果您想在軟體中實現該「功能」的話,方法有很多。在這裡我介紹一種我認為安全性比較高的一種,僅供參考。
大家都知道,當您在命令列中鍵入「dir」指令後,系統都會讀出乙個稱作serial number的十六進製制數字。這個數字理論上有上億種可能,而且很難同時找到兩個序列號一樣的硬碟。這就是我這種註冊方法的理論依據,通過判斷指定磁碟的序列號決定該機器的註冊號。
要實現該功能,如何獲得指定磁碟的序列號是最關鍵的。在windows中,有乙個getvolumeinformation的api函式,我們利用這個函式就可以實現。
下面是實現該功能所需要的**:
private declare function getvolumeinformation& lib "kernel32" _
alias "getvolumeinformationa" (byval lprootpathname as string, _
byval pvolumenamebuffer as string, byval nvolumenamesize as long, _
lpvolumeserialnumber as long, lpmaximumcomponentlength as long, _
lpfilesystemflags as long, byval lpfilesystemnamebuffer as string, _
byval nfilesystemnamesize as long)
private const max_filename_len = 256
public function driveserial(byval sdrv as string) as long
'usage:
'dim ds as long
'ds = driveserial("c")
dim retval as long
dim str as string * max_filename_len
dim str2 as string * max_filename_len
dim a as long
dim b as long
getvolumeinformation sdrv & ":/", str, max_filename_len, retval, _
a, b, str2, max_filename_len
driveserial = retval
end function
如果我們需要某個磁碟的序列號的話,只要driverserial(該磁碟的碟符)即可。如driveraserialnumber=driverserial("a")。
下面,我們就可以利用返回的磁碟序列號進行加密,需要用到一些數學知識。在這裡我用了俄羅斯密碼表的加密演算法對進行了數學變換的序列號進行加密。下面是註冊碼驗證部分的**:
public function isvalidate(byval src as long, byval value as string) as boolean
dim sourcestring as string
dim newsrc as long
for i = 0 to 30
if (src and 2 ^ i) = 2 ^ i then
sourcestring = sourcestring + "1"
else
sourcestring = sourcestring + "0"
end if
next i
if src < 0 then
sourcestring = sourcestring + "1"
else
sourcestring = sourcestring + "0"
end if
dim table as string
dim tableindex as integer
'這是密碼表,根據你的要求換成別的,不過長度要一致
'注意:這裡的密碼表變動後,對應的註冊號生成器的密碼表也要完全一致才能生成正確的註冊號
table = "jsdjfkluwruoisdh;ksadjklwq;abcdefhihl;kladshkjagfwiherqowrlqh"
dim result as string
dim midword as string
dim midwordvalue as byte
dim resultvalue as byte
for t = 1 to 1
for i = 1 to len(sourcestring)
midword = mid(sourcestring, i, 1)
midwordvalue = asc(midword)
tableindex = tableindex + 1
if tableindex > len(table) then tableindex = 1
resultvalue = asc(mid(table, tableindex, 1)) mod midwordvalue
result = result + hex(resultvalue)
next i
sourcestring = result
next t
dim bittorool as integer
for t = 1 to len(cstr(src))
bittorool = src and 2 ^ t
for i = 1 to bittorool
sourcestring = right(sourcestring, 1) _
+ left(sourcestring, len(sourcestring) - 1)
next i
next t
if sourcestring = value then isvalidate = true
end function
最後,我們就可以利用這些子程式進行加密了。
基於硬碟序列號的軟體加密與解密
基於硬碟序列號的軟體加密與解密 部分源 如下所示 在 oninitdialog 函式中初始化客戶號 dword volumeserialnumber getvolumeinformation c null,12,volumeserialnumber,null,null,null,10 char pn...
用磁碟序列號對ASP進行加密
自從asp active server pages 問世以來,因其可以建立健壯易於維護 與平台無關的應用系統,asp技術受到了越來越多網路程式設計師的喜愛,使用asp從事web開發的人也越來越多。但asp只是一種非編譯型的 在服務端執行的指令碼語言,採用明文 plain text 方式來編寫,即使採...
VC 中利用磁碟序列號識別正版軟體
vc 中利用磁碟序列號識別正版軟體 2007年06月23日 星期六 上午 11 37 摘要 本文講述了獲取磁碟序列號的方法,並利用所讀取的磁碟序列號來作為甄別正版 關鍵字 磁碟序列號 正版軟體 識別 一 引言 作為程式設計師,不希望看到自己辛辛苦苦編制的軟體被盜版,雖然國家為了打擊盜版和保護智財權出...