分享一套輕量級的軟體註冊保護方案,包含:用戶名綁定註冊碼演算法、註冊表旗標持久化、啟動檢查與功能限制、註冊對話框 UI。適合中小型獨立應用程式。
CString GetRegPasswd(CString& strUserName)
{
long n1=0, n2=0, n3=0;
char sn[16]={0};
int len = strUserName.GetLength();
for (int i=1; i<=len; ++i)
{
BYTE ch = strUserName[i-1];
// 三組混淆運算
n1 = (n1 + (ch * i * i) * (i * sqrt(ch) + 1)) % 100000;
n2 = (n2 * i + (ch * ch * i)) % 100000;
n3 = (n2 + (long)sqrt(n1)) % 100000;
}
// 產生 15 字元
for (int i=0; i<5; ++i) sn[i] = (n1 + 31 + i*i*i) % 128;
for (int i=5; i<10; ++i) sn[i] = (n2 + 31 + i*i*i) % 128;
for (int i=10;i<15; ++i) sn[i] = (n3 + 31 + i*i*i) % 128;
// 映射至可見字元 0-9, A-Z, a-z
for (int i=0; i<15; ++i)
{
while ((sn[i]<'0'||sn[i]>'9') && (sn[i]<'A'||sn[i]>'Z') && (sn[i]<'a'||sn[i]>'z'))
sn[i] = (sn[i] + 31 + 7*i) % 128;
}
sn[15] = 0;
return CString(sn);
}
特點:單向不可逆、同一用戶名固定輸出、字元集可讀性強。
// 檢查是否已註冊 (返回 TRUE=已註冊)
BOOL GetRegFlag()
{
HKEY hKey; CString strSubKey = _T("Software\\MyApp");
if (RegCreateKey(HKEY_CURRENT_USER, strSubKey, &hKey) != ERROR_SUCCESS) return FALSE;
BYTE val; DWORD cb=sizeof(BYTE);
LONG res = RegQueryValueEx(hKey, _T("RegFlag"), NULL, NULL, &val, &cb);
RegCloseKey(hKey);
return (res==ERROR_SUCCESS && val==0); // 0=已註冊
}
// 寫入註冊成功旗標
BOOL SetRegFlag()
{
HKEY hKey; CString strSubKey = _T("Software\\MyApp");
if (RegCreateKey(HKEY_CURRENT_USER, strSubKey, &hKey) != ERROR_SUCCESS) return FALSE;
BYTE val = 0; // 0 代表已註冊
LONG res = RegSetValueEx(hKey, _T("RegFlag"), 0, REG_BINARY, &val, sizeof(val));
RegCloseKey(hKey);
return (res==ERROR_SUCCESS);
}
// CMyApp::InitInstance() 中
if (!GetRegFlag())
{
// 未註冊:禁用高級功能、顯示試用倒計時、或彈出註冊對話框
// 例:pMainFrame->EnableAdvancedFeatures(FALSE);
}
void CRegDlg::OnOK()
{
UpdateData(TRUE);
m_strUser.Trim(); m_strCode.Trim();
if (m_strUser.IsEmpty() || m_strCode.IsEmpty()) { /*提示*/ return; }
CString realCode = GetRegPasswd(m_strUser);
if (realCode == m_strCode)
{
SetRegFlag();
EndDialog(IDOK); // 註冊成功
}
else
AfxMessageBox(_T("註冊碼錯誤!"));
UpdateData(FALSE);
}
| 層面 | 現狀 | 建議加強 |
|---|---|---|
| 演算法強度 | 簡單混淆,可逆向 | 引入非對稱加密 (RSA/ECC)、硬體指紋綁定 |
| 註冊表保護 | 明文旗標,易被刪除/修改 | 加密儲存、多處冗餘檢查、關鍵代碼混淆 |
| 防破解 | 無 | 關鍵函數內聯、反調試、代碼完整性校驗 |
本方案已在 VC6.0 / Win98 / Win2000 實測通過,源碼可直接整合至現有專案。