请问共享软件的注册码是如何生成的?

qianqiansong 2001-08-17 08:34:36
请不要灌水,谢谢
...全文
291 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
torble 2001-08-18
  • 打赏
  • 举报
回复
可以针对注册数据进行自己的加密算法
qianqiansong 2001-08-18
  • 打赏
  • 举报
回复
我想这应该有一个软件来生成注册码的.比如制作安装程序等地时候.而不是自己写代码来实现.因为自己写的比较容易破解
devecom 2001-08-18
  • 打赏
  • 举报
回复
我想知道是怎么生成的,不是看是否注册
thygw 2001-08-18
  • 打赏
  • 举报
回复
好像是高手哦?!!
瓦琦儿 2001-08-18
  • 打赏
  • 举报
回复
例:
1.你可以用老PIII的序列号
2.可以用硬盘的出厂编号,不是格式化后的序列号
3.你可以用BIOS的序列号
4.你可以用CPU的一些内置信息
Xb_xj 2001-08-18
  • 打赏
  • 举报
回复
up
jzy 2001-08-18
  • 打赏
  • 举报
回复
请教各位
有什么办法可以实现:在每台机器上都生成一个特殊的序列号?
对于一台特定的机器,生成的序列号总是这个,而到了另外一台机器上,序列号就变了
也就是说,一个序列号对应一个注册码,但是每个注册码都只能在一台机器上用,照搬到另一台机器上就行不通了
我想,用序列号生成注册码的加密算法肯定是有多种的
但是关键是这个序列号应该怎么生成呢?
combsky 2001-08-17
  • 打赏
  • 举报
回复
xixi
xhuayu 2001-08-17
  • 打赏
  • 举报
回复
佩服。
jianping0 2001-08-17
  • 打赏
  • 举报
回复
GZ
billten 2001-08-17
  • 打赏
  • 举报
回复
如还不明白看下面代码:
procedure TForm1.form1create(Sender: TObject);

var

reg_id:integer;

registerTemp : TRegistry;

inputstr,get_id:string;

dy,clickedok:boolean;

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 begin //用gc_id的值作为标志,首先判断其存在否?

       re_id:=readinteger('gc_id');//读出标志值

       if (re_id<>0) and (re_id<>100) then begin //若标志值为0,则说明已注册。

              //若不为0且值不到100,说明虽未注册,但允许使用的次数尚未达到。

        re_id:=re_id+5; //允许标志的最大值为100,每次加5,则最多只可用20次。

        Writeinteger('gc_id',re_id);//将更新后的标志值写入注册表中。

     end;

     if re_id=100 then dy:=true; //假如值已到100,则应注册。

    end

   else Writeinteger('gc_id',5);//建立标志,并置初始标志值。

  end;

  if dy then begin //若dy值为TRUE,则应提示用户输入注册码,进行注册。

    clickedok:=InputQuery('您使用的是非注册软件,请输入注册码:',' ',inputstr);

    if clickedok then begin

      get_id:=inttostr(27593758*2);//注册码为55187516,当然可加入更杂的算法。

      if get_id=inputstr then begin

        Writeinteger('gc_id',0);//若输入的注册码正确,则将标志值置为0,即已注册。

        CloseKey;

        Free;

       end

      else begin //若输入的注册码错误,应作出提示并拒绝让其继续使用

        application.messagebox('注册码错误!请与作者联系!','警告框',mb_ok);

        CloseKey;

        Free;

        application.terminate; //中止程序运行,拒绝让其继续使用

       end;

      end

    else begin //若用户不输入注册码,也应作出提示并拒绝让其继续使用

      application.messagebox('请与作者联系,使用注册软件!','警告框',mb_ok);

      CloseKey;

      Free;

      application.terminate;

     end;

  end;

 end;

end;
//转载
soff 2001-08-17
  • 打赏
  • 举报
回复
本文来自中国程序员网站

DELPHI:注册码设计
阿梁 (11/17/1999)

   当你辛辛苦苦用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('.DEFAULTSoftwareAngelSoftDemo',True);//键名为AngelSoftDemo,可自行修改.
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('.DEFAULTSoftwareAngelSoftDemo',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进行异或操作,或者倒取反值...具体的要看你怎么实现了.总之,本文章只抛砖引玉罢了.


billten 2001-08-17
  • 打赏
  • 举报
回复
可以用TREGISTRY,把你的注册号写入注册表,并作一些简单的加密就可以了(如乘2)。
名字不要与程序名与关,这样要想在注册表中找到注册号并破解就不容易了
fatcatman 2001-08-17
  • 打赏
  • 举报
回复
我建议你把这个贴子移到扩充话题的软件市场中去。

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧