delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
像那些付费软件的注册算法一般是用什么算法? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224100656157.html
像那些付费软件的注册算法一般是用什么算法?如果我想给我的软件加密,使用那种算法比较好?前辈们给点意见啊

//转贴  
   
  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星

呵呵,还有硬件加密狗可以加密的.

算法自然越私有越好了  
  不然别人直接根据公开算法就算出来,你的加密就没啥意义了

posted on 2008-11-18 14:34 delphi2007 阅读(138) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。