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

C++ Builder 實作軟體試用期限制:天數、次數、截止日期、單次時長

     編輯:關於C++

四種保護策略

  1. 限制使用天數 (如 30 天)
  2. 限制使用次數 (如 45 次)
  3. 設定截止日期 (如 2001/08/31)
  4. 限制單次執行時間 (如 50 分鐘)

可單獨或組合使用。核心機制:登錄表儲存狀態 (策略 1、2) 或單純時間比對 (策略 3、4)。

登錄表操作基礎 (TRegistry)


TRegistry* Reg = new TRegistry;
Reg->RootKey = HKEY_USERS; // 或 HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE
Reg->OpenKey("\\.DEFAULT\\MyProgram\\Records", true); // 不存在則建立
// 寫入初始值
Reg->WriteInteger("Count", 1);
Reg->WriteInteger("Flag", 0);
Reg->WriteDate("First", Date());
Reg->WriteDate("Last", Date());
Reg->CloseKey();
delete Reg;

鍵值說明:Count 執行次數,Flag 過期標記,First 首次執行日期,Last 上次執行日期。

策略實作細節

1. 限制天數 (FormCreate)


TDate firstDate = Reg->ReadDate("First");
TDate currentDate = Date();
if (currentDate.Val - firstDate.Val > 30) {
    Application->MessageBox("超過 30 天試用期!", "結果", MB_OK);
    Reg->WriteInteger("Flag", 1);
    Application->Terminate();
}

2. 限制次數 (FormCreate)


if (Reg->ReadInteger("Count") > 45) {
    Application->MessageBox("超過 45 次試用次數!", "結果", MB_OK);
    Reg->WriteInteger("Flag", 1);
    Application->Terminate();
}

3. 截止日期 (FormCreate,無需登錄表)


DateSeparator = '-';
ShortDateFormat = "yyyy/mm/dd";
TDate endDate = StrToDate("2001-08-31");
if (Date().Val > endDate.Val) {
    Application->MessageBox("已過截止日期!", "結果", MB_OK);
    Application->Terminate();
}

4. 單次執行時間 (TTimer OnTimer,Interval=60000)


// 全域變數
TDateTime startDateTime, currentDateTime;

// FormCreate
startDateTime = Now();

// Timer1Timer
currentDateTime = Now();
if (currentDateTime.Val - startDateTime.Val > 50.0 / (60 * 24)) { // 50 分鐘
    Timer1->Enabled = false;
    Application->MessageBox("本次執行超過 50 分鐘!", "結果", MB_OK);
    Close();
}

進階防破解技巧

  • 偽裝登錄表路徑:使用深層、非明顯鍵名 (如 HKEY_USERS\\.DEFAULT\\{GUID}\\Data)。
  • 偵測系統時間回撥:
    
    TDate lastDate = Reg->ReadDate("Last");
    if (Date().Val < lastDate.Val) {
        Application->MessageBox("偵測到系統時間被回撥!", "結果", MB_OK);
        Reg->WriteInteger("Flag", 1);
        Application->Terminate();
    }
    
  • Flag 檢查置於最前:一旦 Flag=1 直接終止,不再執行後續邏輯。
  • 重裝無效:登錄表殘留值導致重裝仍受限,除非使用者手動刪除對應鍵值。

更新登錄表 (未過期時)


Reg->WriteInteger("Count", Reg->ReadInteger("Count") + 1);
Reg->WriteDate("Last", Date());
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved