共享軟體(Shareware)常面臨註冊碼外洩、註冊機破解等問題,嚴重損害開發者權益。雖有法律保護,但執法困難。開發者應具備自我保護意識,運用程式技術確保每組註冊碼僅對應單一軟體拷貝。本文結合實戰經驗,介紹基於硬體唯一識別碼(以硬碟序列號為核心)的安全註冊實作方案。
為確保註冊碼唯一性,採集對象應具備唯一性、不可複製性。硬體資訊因物理特性成為首選:
推薦使用 Windows API GetVolumeInformation 讀取 C 槽硬碟序列號:
DWORD dwIDESerial;
GetVolumeInformation("C:\\", NULL, NULL, &dwIDESerial, NULL, NULL, NULL, NULL);
採集後,將硬碟序列號與使用者輸入的註冊名透過位元運算加密,存成文字檔由使用者回傳給開發者。
開發者端: 收到使用者回傳的加密資訊,利用相同演算法生成註冊碼回覆。
使用者端: 內建相同演算法,依當前硬碟序列號與註冊名動態計算正確註冊碼,比對使用者輸入碼。匹配則寫入註冊表或設定檔標記為已註冊;軟體每次啟動皆即時驗證。
若軟體被複製到其他電腦,硬碟序列號改變導致驗證失敗,需重新註冊,達到保護目的。
// 開發者端:生成註冊碼
char input[8], result[8];
int Index[8] = {7,5,3,1,6,4,2,0};
char Mask[8] = {'Z','H','U','C','E','J','I','0'};
// 從使用者回傳資料還原硬碟序列號
for(int i=0; i<8; i++) input[i] = buf1[i] ^ buf2[i];
// 錯序與位元運算產生註冊碼
for(int i=0; i<8; i++) {
result[i] = input[Index[i]] ^ buf2[i];
result[i] ^= Mask[i];
}
// 使用者端:驗證註冊碼
for(int i=0; i<8; i++) {
input[i] = input[i] ^ buf2[i];
output[Index[i]] = input[i] ^ Mask[i];
}
DWORD dwSerialID = atoll(output);
// 即時讀取硬碟序列號比對
GetVolumeInformation("C:\\", NULL, NULL, &dwIDESerial, NULL, NULL, NULL, NULL);
if (dwSerialID == dwIDESerial) { /* 註冊成功 */ }
使用者輸入註冊名 → 程式採集硬體資訊加密回傳 → 開發者運算生成註冊碼 → 使用者輸入註冊碼 → 本地驗證匹配 → 寫入註冊標記 → 後續啟動即時驗證。
安全註冊核心原則:選準註冊源、常變演算法、加密註冊碼、守護註冊機、採線上驗證。硬碟序列號兼具通用性與易獲取性,是理想註冊種子。結合不可逆演算法與雙端動態驗證,可有效遏制盜版傳播。開發者應持續更新防護手段,在技術對抗中保持優勢。