當你花費心力完成一個 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)、硬體綁定、線上驗證等更強健的保護機制,並搭配代碼混淆、反偵錯技術提高破解門檻。