首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 軟體註冊機制實作:註冊碼生成、註冊表驗證與功能限制

     編輯:關於VC++

分享一套輕量級的軟體註冊保護方案,包含:用戶名綁定註冊碼演算法、註冊表旗標持久化、啟動檢查與功能限制、註冊對話框 UI。適合中小型獨立應用程式。

1. 註冊碼生成演算法 (用戶名 → 15 碼註冊碼)

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);
}

特點:單向不可逆、同一用戶名固定輸出、字元集可讀性強。

2. 註冊表旗標讀寫 (HKCU\Software\YourApp)

// 檢查是否已註冊 (返回 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);
}

3. 應用程式啟動攔截

// CMyApp::InitInstance() 中
if (!GetRegFlag())
{
    // 未註冊:禁用高級功能、顯示試用倒計時、或彈出註冊對話框
    // 例:pMainFrame->EnableAdvancedFeatures(FALSE);
}

4. 註冊對話框驗證邏輯

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 實測通過,源碼可直接整合至現有專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved