C# 獲取硬碟序列號 Volume Serial Number
阿新 • • 發佈:2019-02-04
在做軟體註冊時,通常用硬碟號(建議用雜湊後的硬碟號)作為本地電腦特徵碼,加上使用者名稱以及公司名等其他資訊,通過一定的演算法,得到軟體序列號。這樣做的好處的顯而易見的。它可以防止一個序列號N多人用的現象。現在有些軟體就是一個註冊碼,在網上公開,全世界人都在用。但是也有相應的缺陷。客戶只能在一臺電腦上用你寫的軟體。下面的方法通過Windows API獲得硬碟號。
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
privatestaticexternint GetVolumeInformation(
string lpRootPathName,
string lpVolumeNameBuffer,
int nVolumeNameSize,
refint lpVolumeSerialNumber,
int lpMaximumComponentLength,
int lpFileSystemFlags,
string lpFileSystemNameBuffer,
int nFileSystemNameSize
);
privatestring GetVolOf(string drvID){
constint MAX_FILENAME_LEN =256;
int retVal =0;
int a =0;
int b =0;
string str1 =null;
string str2 =null;
int i = GetVolumeInformation(
drvID +@":",
str1,
MAX_FILENAME_LEN,
ref retVal,
a,
b,
str2,
MAX_FILENAME_LEN
);
return retVal.ToString("x");
}
[DllImport("kernel32.dll")]
privatestaticexternint GetVolumeInformation(
string lpRootPathName,
string lpVolumeNameBuffer,
int nVolumeNameSize,
refint lpVolumeSerialNumber,
int lpMaximumComponentLength,
string lpFileSystemNameBuffer,
int nFileSystemNameSize
);
privatestring GetVolOf(string drvID){
constint MAX_FILENAME_LEN =256;
int retVal =0;
int a =0;
int b =0;
string str2 =null;
int i = GetVolumeInformation(
drvID +@":",
str1,
MAX_FILENAME_LEN,
ref retVal,
a,
b,
str2,
MAX_FILENAME_LEN
);
return retVal.ToString("x");
}
呼叫方法:例如C盤:GetVolOf("C");
不過無論你的註冊演算法如何精妙,始終會被破解。因為你的演算法始終在軟體客戶端,cracker總是有機會找到你的註冊演算法,做出註冊機來。看看網上流傳的五花八門的註冊機就知道了。個人覺得如果做依賴Web的程式,最好還是把註冊演算法寫在Web Service裡面,這樣cracker就沒法從本地破解註冊演算法了,這樣就大大增加了安全性。