📄 ctmd.pas
字号:
////////////////////////////////////////////////////////////////
{ 软件注册模块 }
{ 包括: } }
{ 1: 加密,解密函数 }
{ 2: 获取CPU 的序列号函数(汇编语言) }
{ 3: 一系列操作注册表函数 }
////////////////////////////////////////////////////////////////
unit CTMD;
interface
uses
Classes,Registry,Windows,SysUtils,Controls;
Const
C1 = 52845; // 常量说明
C2 = 22719; // 此二常量用于生成随机数
// CPU ID 专用变量
Const
ID_BIT = $200000;
Type
TCPUID = Array[1..4] of Longint; // 储存CPU ID号
// CPU ID 专用变量
function Encrypt(S:String;Key:Word):String; // 加密函数声明
function Decrypt(S:String;Key:Word):String; // 解密函数声明
function ISCPUID:Boolean; // 检测是否有CPU ID可查
function GetCPUID:TCPUID; // 获取CPU ID号
function ISFIRSTRUN(AppName:String):Boolean; // 是否是第一次使用该软件
// 如是第一次使用该软件,则写如相关的信息
function WriteInfo(AppName,CUPID:String):Boolean;
function ReadFirstDate(AppName:String):TDate; // 读出第一次运行软件的时间
function ReadRegistry(AppName:String):String; // 读出注册码
function ReadUserName(AppName:String):String; // 读出注册用户名
function WriteRegistry(AppName,UserName,PWD:String):boolean; // 输入注册码
implementation
{*****************************加密解密函数*************************************}
function Encrypt(S:String;Key:Word):String;
var { 加密子程序 }
I,j:Integer; // 用于循环
begin
Result:=S; // 初始化结果字符串
for I:=1 to Length(S) do // 依次对字符串中的各个字符进行操作
begin
Result[I]:=char(byte(S[I]) xor (Key shr 8)); // 将密匙移位后与字符异或
Key:=(byte(Result[I])+Key)*C1+C2 // 产生下一密匙
end;
S:=Result; // 保存结果
Result:=''; // 清除结果
for I:=1 to Length(S) do // 对加密结果进行转换
begin
j:=Integer(s[i]); // 提取字符
Result:=Result+Char(65+(j div 26))+Char(65+(j mod 26));
end;
end;
function Decrypt(S:String;Key:Word):String;
var { 解密子函数 }
I,j:Integer;
begin
Result:=''; // 清除结果
for I:=1 to (length(S) div 2) do
begin
j:=(Integer(S[2*i-1])-65)*26;
j:=j+(Integer(S[2*i])-65);
Result:=Result+Char(j);
end;
S:=Result;
for I:=1 to Length(S) do
begin
Result[I]:=Char(byte(S[I]) xor (Key shr 8));
Key:=(byte(S[I])+Key)*C1+C2;
end;
end;
{*****************************加密解密函数*************************************}
{*****************************获取CPU ID号函数*********************************}
function ISCPUID:Boolean;register;
asm { 查看该机是否有CPU ID 号可以查 }
PUSHFD
POP EAX
MOV EDX,EAX
XOR EAX,ID_BIT
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX,EDX
JZ @exit
MOV AL,TRUE
@exit:
end;
function GetCPUID:TCPUID;assembler;register;
asm { 获取CPU ID 号 }
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F // CPUID Command
STOSD // CPUID[1]
MOV EAX,EBX
STOSD // CPUID[2]
MOV EAX,ECX
STOSD // CPUID[3]
MOV EAX,EDX
STOSD // CPUID[4]
POP EDI
POP EBX
end;
{*****************************获取CPU ID号函数*********************************}
{*****************************操作注册表函数***********************************}
function ISFIRSTRUN(AppName:String):Boolean;
var { 判断是否是第一次运行该软件 }
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\ZR_SOFT\'+AppName,False) then
Result:=False
else
Result:=True;
Finally
Reg.CloseKey;
Reg.Free;
End;
end;
function WriteInfo(AppName,CUPID:String):Boolean;
var { 如果该软件是第一次使用,则写入相关的信息 }
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
Reg.OpenKey('SOFTWARE\Microsoft\Windows\ZR_SOFT\'+AppName,True);
Reg.WriteString('UserName',''); // 注册者姓名(未注册为'');
Reg.WriteDate('FirstDate',DATE); // 第一次运行软件的日期
Reg.WriteString('CPUID',CUPID); // CPU ID(用于验证注册码)
Reg.WriteString('UserPWD',''); // 注册码(初始为'');
Result:=True;
Finally
Reg.CloseKey;
Reg.Free;
End;
end;
function ReadFirstDate(AppName:String):TDate;
var { 读出第一次运行软件的时间 }
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\ZR_SOFT\'+AppName,False) then
Result:=Reg.ReadDate('FirstDate');
Finally
Reg.CloseKey;
Reg.Free;
End;
end;
function ReadRegistry(AppName:String):String;
var { 读出注册码 }
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\ZR_SOFT\'+AppName,False) then
Result:=Reg.ReadString('UserPWD');
Finally
Reg.CloseKey;
Reg.Free;
End;
end;
function ReadUserName(AppName:String):String;
var { 读出注册用户名 }
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\ZR_SOFT\'+AppName,False) then
Result:=Reg.ReadString('UserName');
Finally
Reg.CloseKey;
Reg.Free;
End;
end;
function WriteRegistry(AppName,UserName,PWD:String):boolean;
var { 输入注册码 }
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\ZR_SOFT\'+AppName,False) then
begin
Reg.WriteString('UserName',UserName); // 注册用户名
Reg.WriteString('UserPWD',PWD); // 注册码
Result:=True;
end;
Finally
Reg.CloseKey;
Reg.Free;
End;
end;
{*****************************操作注册表函数***********************************}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -