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

Delphi 共享軟體註冊碼設計與實作教學

     編輯:Delphi

前言

當你花費心力完成一個 Delphi 應用程式,想要將其作為共享軟體釋出時,註冊碼機制是不可或缺的關鍵環節。透過檢測註冊狀態,可以對功能、使用時間或其他項目進行限制。本文介紹一種基於註冊表與使用者名稱 ASCII 碼運算的簡易註冊碼實作方式,適合初學者理解基本原理。

核心思路

程式啟動時檢查系統註冊表是否存在特定鍵值:

  • 若存在,判定為已註冊版本,解除限制。
  • 若不存在,提示使用者輸入使用者名稱與註冊碼進行驗證。

驗證演算法採用將使用者名稱每個字元的 ASCII 碼累加,總和即為註冊碼。雖然容易被破解,但可作為進階加密(如 XOR、位元反轉)的基礎範例。

註冊主程式實作

建立新專案,放置 Edit1(使用者名稱)、Edit2(註冊碼)、Label1、Label2、Button1(註冊按鈕)。需在 uses 子句加入 Registry 單元。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    function Check: Boolean;
    procedure CheckReg;
    procedure CreateReg;
  public
  end;

var
  Form1: TForm1;
  PName: string;   // 全域變數:儲存使用者名稱
  PPass: Integer;  // 全域變數:儲存註冊碼

implementation

{$R *.DFM}

procedure TForm1.CreateReg;  // 寫入註冊資訊
var
  Rego: TRegistry;
begin
  Rego := TRegistry.Create;
  try
    Rego.RootKey := HKEY_USERS;
    if Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo', True) then
    begin
      Rego.WriteString('Name', PName);
      Rego.WriteInteger('Pass', PPass);
      ShowMessage('程式已成功註冊,謝謝!');
      CheckReg;  // 刷新介面
    end;
  finally
    Rego.Free;
  end;
end;

procedure TForm1.CheckReg;  // 檢查註冊狀態
var
  Rego: TRegistry;
begin
  Rego := TRegistry.Create;
  try
    Rego.RootKey := HKEY_USERS;
    if Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo', False) then
    begin
      Caption := '軟體已註冊';
      Button1.Enabled := False;
      Label1.Caption := Rego.ReadString('Name');
      Label2.Caption := IntToStr(Rego.ReadInteger('Pass'));
    end
    else
      Caption := '軟體未註冊,請進行註冊';
  finally
    Rego.Free;
  end;
end;

function TForm1.Check: Boolean;  // 驗證註冊碼
var
  Name: string;
  i, Len, Pass: Integer;
begin
  Result := False;
  Name := Edit1.Text;
  Len := Length(Name);
  Pass := 0;
  for i := 1 to Len do
    Pass := Pass + Ord(Name[i]);  // 累加 ASCII 碼

  if StrToIntDef(Edit2.Text, -1) = Pass then
  begin
    Result := True;
    PName := Name;
    PPass := Pass;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Check then
    CreateReg
  else
    ShowMessage('註冊碼錯誤,無法註冊');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CheckReg;
end;

end.

註冊碼產生器

獨立小工具,輸入使用者名稱即可計算對應註冊碼,供開發者離線發號使用。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  Name: string;
  i, Len, Pass: Integer;
begin
  Pass := 0;
  Name := Edit1.Text;
  Len := Length(Name);
  for i := 1 to Len do
    Pass := Pass + Ord(Name[i]);
  Edit2.Text := IntToStr(Pass);
end;

end.

安全性提醒

本範例演算法極其簡單,僅供教學示範。實際商業軟體應採用非對稱加密(RSA)、硬體綁定、線上驗證等更強健的保護機制,並搭配代碼混淆、反偵錯技術提高破解門檻。

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