全部博文(788)
分类:
2008-11-18 14:50:22
//转贴
DELPHI程序注册码设计
当你辛辛苦苦用DELPHI做好了一个你认为十分不错的程序,你是否想把它发布出去成为共享软件呢? 做为一个共享软件,注册码肯定是少不了的,你可以通过判断程序是否注册来进行功能,时间或一些其它限制.现在就介绍一种简单的注册码制造方法.思路是这样的:程序运行时先检测注册表,如果找到注册项,则表明已经注册,如果没有找到注册项,则提示要求注册.
<注册例程>
在DELPHI下新建一工程,放置Edit1,Edit2,Label1,Label2,Button1组件.具体代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Registry;//在此加上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();
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Pname:string; //全局变量,存放用户名和注册码.
Ppass:integer;
implementation
{$R *.DFM}
Procedure TForm1.CreateReg();//创建用户信息.
var Rego:Tregistry;
begin
Rego:=Tregistry.Create;
Rego.RootKey:=HKEY_USERS;
rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',True);//键名为AngelSoft\Demo,可自行修改.
Rego.WriteString('Name',Pname);//写入用户名.
Rego.WriteInteger('Pass',Ppass);//写入注册码.
Rego.Free;
ShowMessage('程序已经注册,谢谢!');
CheckReg; //刷新.
end;
Procedure TForm1.CheckReg();//检查程序是否在注册表中注册.
var Rego:Tregistry;
begin
Rego:=Tregistry.Create;
Rego.RootKey:=HKEY_USERS;
IF Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',False) then
begin
Form1.Caption:='软件已经注册';
Button1.Enabled:=false;
Label1.Caption:=rego.ReadString('Name');//读用户名.
Label2.Caption:=IntToStr(Rego.ReadInteger('Pass')); //读注册码.
rego.Free;
end
else Form1.Caption:='软件未注册,请注册';
end;
Function TForm1.Check():Boolean;//检查注册码是否正确.
var
Temp:pchar;
Name:string;
c:char;
I,Long,Pass:integer;
begin
Pass:=0;
Name:=edit1.Text;
long:=length(Name);
for I:=1 to Long do
begin
temp:=pchar(copy(Name,I,1));
c:=temp^;
Pass:=Pass+ord(c); //将用户名每个字符转换为ASCII码后相加.
end;
if StrToInt(Edit2.Text)=pass then
begin
Result:=True;
Pname:=Name;
Ppass:=Pass;
end
else Result:=False;
end;
procedure TForm1.Button1Click(Sender: Tobject);
begin
if Check then CreateReg
else ShowMessage('注册码不正确,无法注册');
end;
procedure TForm1.FormCreate(Sender: Tobject);
begin
CheckReg;
end;
end.
<注册器>
在DELPHI下新建一工程,放置Edit1,Edit2,Button1组件.具体代码如下:
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);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: Tobject);
var
Temp:pchar;
Name:string;
c:char;
I,Long,Pass:integer;
begin
Pass:=0;
Name:=edit1.Text;
long:=length(Name);
for I:=1 to Long do
begin
temp:=pchar(copy(Name,I,1));
c:=temp^;
Pass:=Pass+ord(c);
end;
edit2.text:=IntToStr(pass);
end;
end.
从<注册器>中取得注册码,便可在<注册例程>中进行注册.原理是使用ORD函数取得用户名每单个字符的ASCII码值,并进行相加得到注册码.当然,这十分容易并破解,你可以用XOR进行异或操作,或者倒取反值...具体的要看你怎么实现了.总之,本文章只抛砖引玉罢了.
也可以用专门的控件来做
Regware
破解只是时间和兴趣的问题
软件没有写成功之前考虑加密是白搭
一个写的差的软件就是开源给别人都没人用
加密之前提起别人破解的兴趣先
烂软件不加密也没人用,好软件加密了照样破!
WinRAR加密足够牛了吧,有几个软件可以做到这个程度的?还不照样被干掉
共享软件作者还是提高自己的软件先,别尚未成功就开始防破解,精力用错地方了。
找到的一个:
给你一个,不过是检测注册表中的值进行判断是否已经注册:
当然这程序中的注册码是随便写的...
procedure TE_Mainf.FormCreate(Sender: TObject);
var re_id: integer;
registerTemp: TRegistry;
inputstr,get_id: string;
dy, clickedok: boolean;
i: double;
label Y, N;
begin
dy := false;//软件是否已到注册期、及是否允许继续使用的标志,当值为FALSE是为允许使用
registerTemp := TRegistry.Create; //准备使用注册表
with registerTemp do
begin
RootKey := HKEY_LOCAL_MACHINE; //存放在此根下
if OpenKey('Software\Microsoft\Windows\CurrentVersion\Mark', True) then // 建一目录,存放标志值。当然也可以存放在已存在的目录下。
begin
if valueexists('gc_id') then //用gc_id的值作为标志,首先判断其存在否
begin
re_id := readinteger('gc_id'); //读出标志值
if (re_id <> 0) and (re_id <> 100) then //若标志值为0,则说明已注册 ,若不为0且值不到100,说明虽未注册,但允许使用的次数尚未达到。
begin
re_id := re_id + 5; //允许标志的最大值为100,每次加5,则最多只可用20次
writeinteger('gc_id', re_id); //将更新后的标志值写入注册表中
i := (100 - re_id) / 5;
if application.MessageBox(PAnsiChar('您使用的软件没有注册,还有 ' + floattostr(i) + ' 次使用次数,现在要注册吗?'), '提示信息', mb_yesno + mb_iconwarning) = idyes then
begin
if i = 0 then
application.Terminate
else
goto y;
end;
end;
if re_id = 0 then goto N;
if re_id = 100 then dy := true; //若标志值已达到100,则应当注册
end
else
Writeinteger('gc_id', 5); //建立标志,并置初始标志值
re_id := readinteger('gc_id');
i := (100 - re_id) / 5;
if Application.MessageBox(PAnsiChar('您使用的软件没有注册,还有 ' + floattostr(i) + ' 次使用次数,现在要注册吗?'), '提示信息', mb_yesno + mb_iconwarning) = idyes then
begin
if i = 0 then
application.Terminate
else
goto Y;
end;
end;
if dy then
Y: begin //若dy值为TRUE,则应提示用户输入注册码,进行注册
clickedok := InputQuery('系统提示', '请输入注册码:', inputstr);
if clickedok then
begin
get_id := inttostr(83392582 * 2); //注册码为166785164,够简单的......
if get_id = inputstr then
begin
Writeinteger('gc_id', 0); //若输入的注册码正确,则将标志值置为0,即已注册
Application.MessageBox('恭喜你,软件注册成功!', '提示', MB_OK);
CloseKey;
Free;
end
else
begin
application.messagebox('注册码错误!请与作者联系!', '警告', mb_ok + mb_iconstop);
CloseKey;
Free;
application.terminate; //中止程序运行,拒绝让其继续使用
end;
end
else
begin
CloseKey;
Free;
application.terminate; //中止程序运行,拒绝让其继续使用
end;
end;
end;
N: datamodule1 := tdatamodule1.Create(self);
if not assigned(E_loginf) then
E_loginf := tE_loginf.Create(self);
E_loginf.ShowModal;
if E_loginf.ModalResult = mrCancel then//检查返回模式,如果是关闭或是取消,则中止运行
begin
Application.Terminate;
exit;
end;
不知有没达到你要求~~
楼主,好像这个问题没固定的答案.
每个人都可以想个算法.
同意4星
呵呵,还有硬件加密狗可以加密的.
算法自然越私有越好了
不然别人直接根据公开算法就算出来,你的加密就没啥意义了