飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 50940|回复: 66

限制软件30次试用期

[复制链接]

该用户从未签到

发表于 2007-3-23 11:54:58 | 显示全部楼层 |阅读模式
好像有段时间没有新内容了,放一篇上来:

procedure TForm1.form1create(Sender: TObject);
var
re_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;
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-23 12:41:34 | 显示全部楼层
是的,力不从心啊,
刚巧就这段时间乱,/:10
PET刚起步,论坛也在建设中……
公司事务加重,新的加密体系学习中
有时候甚至连电脑看都不想看了
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-23 13:38:57 | 显示全部楼层
今天跌我的心痛啊。。。/:02
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-23 15:38:20 | 显示全部楼层
有办法把这个30次放在主程序中吗?试试看……
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-23 15:49:12 | 显示全部楼层
原帖由 fonge 于 2007-3-23 15:38 发表
有办法把这个30次放在主程序中吗?试试看……


怎么放?/:15
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-23 16:41:30 | 显示全部楼层
修改主程序中的某个标志,然后退出时更新原程序主体……
呵呵~
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-23 17:02:30 | 显示全部楼层
举例说明~~代码为例啊。。。
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-23 18:15:00 | 显示全部楼层
代码有点长
稳定性有待测试
所以一时就不贴了

先露原理吧:
1。退出文件前修改主程序本身代码
如下修改004510cd处的标志:

  1. push eax
  2. mov eax,dword ptr [004510cd]
  3. and eax,0ff
  4. dec eax
  5. mov dword ptr[004510cd],eax
  6. pop eax

复制代码


2。自删除前备份修改过的代码

3。退出时自删除
如下一段经典自删除代码:

  1. var
  2.   BatchFile: TextFile;
  3.   BatchFileName: string;
  4.   ProcessInfo: TProcessInformation;
  5.   StartUpInfo: TStartupInfo;
  6. begin
  7.   BatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';
  8.   AssignFile(BatchFile, BatchFileName);
  9.   Rewrite(BatchFile);

  10.   Writeln(BatchFile, ':try');
  11.   Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
  12.   Writeln(BatchFile,
  13.     'if exist "' + ParamStr(0) + '"' + ' goto try');
  14.   Writeln(BatchFile, 'del %0');
  15.   CloseFile(BatchFile);

  16.   FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  17.   StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  18.   StartUpInfo.wShowWindow := SW_HIDE;
  19.   if CreateProcess(nil, PChar(BatchFileName), nil, nil,
  20.     False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
  21.     ProcessInfo) then
  22.   begin
  23.     CloseHandle(ProcessInfo.hThread);
  24.     CloseHandle(ProcessInfo.hProcess);
  25.   end;
  26. end;
复制代码

3。自删除后把备分文件改回原文件名。



从表面逻辑上说不通,确定是可行的……呵呵~
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-23 20:33:02 | 显示全部楼层
结构体:
1 修改主程序代码,保存为xxxx
2 写个批处理<
a在主程序退出后删除主程序
b更名xxxx为主程序名
c删除批处理
>


OK,就这样了
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-26 19:26:07 | 显示全部楼层
我一般直接写死,不这么麻烦~~/:01
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表