如何实现能够记忆自身被使用次数的程序(50分)

  • 主题发起人 主题发起人 lmax
  • 开始时间 开始时间
L

lmax

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做个程序,希望软件能够记忆用户使用的次数。不希望使用外部文件或方法进行纪录,而是希望能够在EXE的内部实现。每使用一次,内部计数器就加一,无论用户将此程序放在那里使用,计数器都是在源基础上加一,换言之,我希望此程序用户只能使用100次,那么用户无论将次程序放在那里使用,最多也只能正常执行100次,请问各位大侠怎么是线这样的程序。
先给50,如果实现了再送100。
 
操作注册表怎么样啊?
 
程序每次运行时,用计数器计算,一旦使用100次,将不再执行程序。
 
关键点:-->>不希望使用外部文件或方法进行纪录,而是希望能够在EXE的内部实现。
 
EXE文件自我修改演示
http://www.delphibox.com/article.asp?articleid=422
 
http://www.delphibox.com/article.asp?articleid=422
无法打开,别处有没有
 
EXE自身不会修改的,除非你自己写一个编译器挂在程序里。
其他的操作注册表或其他文件都不成的。
一句话,没有人那么实现。
 
我把lilor说的原码贴上来,大家参考,很不错。
program SelfModify;

uses
Windows,
Classes,
Sysutils,
TlHelp32,
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

Var
s: string;
a: byte;
Handle: THandle;
Found: boolean;
Lppe: TProcessEntry32;
begin
s:='';
a:=1;
while ParamStr(a)<>'' do
begin
s:=s+ParamStr(a)+' ';
inc(a);
end;
if s<>'' then
begin
Handle:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
lppe.dwSize:=Sizeof(TProcessEntry32);
Found:=Process32First(Handle,Lppe);
while Found do
begin
if pos(Lppe.szExeFile,s)<>0 then
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, True,
Lppe.th32ProcessID),0);
Found:= Process32Next(Handle,Lppe);
end;
CloseHandle(Handle);
while FileExists(s) do DeleteFile(s);
CopyFile(PChar(ParamStr(0)),PChar(s),True);
winexec(PChar(s),SW_SHOW);
exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

{ 单元 }
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TempName: string;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
Sr: TSearchRec;
size : Longint;
begin
FindFirst(ParamStr(0),$27,Sr);
size:=Sr.Size;
FindClose(Sr);
StatusBar1.SimpleText:='本程序大小为 '+IntToStr(size)+' 字节';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Dir: PChar;
Ch: Array[0..3] of Char;
Stream1,Stream2: TMemoryStream;
begin
GetMem(Dir,254);
GetTempPath(254, Dir);
TempName:=StrPas(Dir)+'o.o.0.o.o.exe';
CopyFile(PChar(ParamStr(0)),PChar(TempName),False);
Stream1:=TMemoryStream.Create;
Stream2:=TMemoryStream.Create;
Stream1.LoadFromFile(TempName);
//在尾部加入4个随机字节
Randomize;
Ch[0]:=Chr(Random(256));
Ch[1]:=Chr(Random(256));
Ch[2]:=Chr(Random(256));
Ch[3]:=Chr(Random(256));
Stream1.Seek(0,soFromEnd);
Stream1.Write(Ch,4);
//修改偏移48的一个字节,记录程序运行次数
Stream1.Seek(0,soFromBeginning);
Stream2.CopyFrom(Stream1,48);
Stream1.Seek(48,soFromBeginning);
Stream1.Read(Ch,1);
Ch[0]:=Chr(1+Ord(Ch[0]));
Stream2.Write(Ch,1);
Stream1.Seek(49,soFromBeginning);
Stream2.CopyFrom(Stream1,Stream1.Size-49);
Stream2.SaveToFile(TempName);
Stream1.Free;
Stream2.Free;
FreeMem(Dir);
Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WinExec(PChar(TempName+' '+ParamStr(0)), SW_SHOWNORMAL);
end;

end.
 
谢谢大家,看了上面的例子,我知道怎么做了
 
lilor 你哪里啊?能告诉我联系方式吗?
 
后退
顶部