الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج يعدل نفسه وهو شغال

مغلق
بدأه إبراهيم_دياب5 في 18 يونيو 2002 · 3 رد · 1,153 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أعزائى لقد وجدت هذا الكود وهو برنامج يعدل نفسه وهو شغال وفقنا ووفقكم الله لرفعة وطننا العربى

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Buttons, StdCtrls,ShellAPI, ExtCtrls, Mask; //Be sure to include ShellAPI

type

TForm1 = class(TForm)

SpeedButton1: TSpeedButton;

Edit1: TEdit;

OpenDialog1: TOpenDialog;

Label1: TLabel;

GroupBox1: TGroupBox;

ScrollBar1: TScrollBar;

SpeedButton2: TSpeedButton;

SpeedButton3: TSpeedButton;

SpeedButton4: TSpeedButton;

Image1: TImage;

Label2: TLabel;

procedure FormCreate(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

ExeString: String;

implementation

{$R *.DFM}

////////////////////////////////////////////////////////////////////////////////

procedure Extract(A,B: String;Var C,D: String);

Var

E,F: Integer;

begin

if Pos(uppercase(A),C) > 0 then

begin

E := Pos(uppercase(A),C)+length(A);

F := Pos(uppercase(B),C);

D := Copy(C,E,F-E);

end;

end;

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

procedure Exe2String(var A:String);

Var

ExeStream: TFileStream;

MyStream: TMemoryStream;

begin

ExeStream:=TFileStream.Create(Application.ExeName,fmOpenRead or fmShareDenyNone);

Try

SetLength(A, ExeStream.Size);

ExeStream.ReadBuffer(Pointer(A)^, ExeStream.Size);

Finally

ExeStream.Free;

end;

end;

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

procedure Delay(ms : longint);

var

TheTime : LongInt;

begin

TheTime := GetTickCount + ms;

while GetTickCount < TheTime do

Application.ProcessMessages;

end;

////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

procedure TForm1.FormCreate(Sender: TObject);

Var

MyStream: TMemoryStream;

name,C,Temp: String;

D,E: integer;

begin

exe2String(ExeString);////////////////////////////Get entire exe file from HD

//and store in global variable

//ExeString.

if pos(uppercase('soname'),exestring) > 0 then //Check if exe contains a

begin //users name already and if

delay(500); //it does then see if the

if pos('_clone',application.exename) = 0 then //running exe is a temporary

begin //clone program.. if it is not

name := application.exename; //a clone then attempt to delete

Insert('_clone',name,(length(name)-3)); //any clone that may be in the

deletefile(name); //applications directory. This

end; //ensures that no clone will

//ever remain after exe has

//been customized.....

////////////////////////////////////////////////////////////////////////////////

edit1.visible := false; ///////////////////////It has been determined that

form1.color := $00c6aa84; //the running exe has already been

form1.height := 300; //customized..so alter the exe's

//appearance to reflect that fact

//This is where you put any setup code you want

//to run when it has been determined that the exe

//has ALREADY been modified! Code to check for a

//valid usename+key,to alter the exe's appearance

//or whatever you want to do to change the way the

//now modified prog is to act should be done HERE!

end;

////////////////////////////////////////////////////////////////////////////////

//The code below runs IF it is determined that the currently running exe is

//a temporary clone program..... this code will delete the original exe file

//from the HD and then save a new copy of itself to the HD with the original

//exe name...DO NOT REMOVE THE delay(500) line! The program will fail sometimes

//if you do! Since the currently running exe is a clone that means it already

//has been modified and in fact is identical to the final exe that it is saving

//to disk with the original name... as soon as the new exe is saved to disk

//this code runs it...then immediately terminates itself .. the clone commits

//hari kiri :-) and since every time a customized exe starts up it attempts

//to delete it's clone from the current directory this clones remaining life

//on disk is limited to 1/2 second......

if pos('_CLONE',uppercase(application.exename)) <> 0 then

begin

delay(500);

name := application.exename;

Delete(name,length(name)-9,6);

if deletefile(name) then

begin

MyStream := TMemoryStream.Create;

try

MyStream.WriteBuffer(Pointer(ExeString)^, Length(ExeString));

MyStream.savetofile(name);

finally

MyStream.Free;

ShellExecute(Handle, 'open',

pchar(name), nil, nil, SW_SHOWNORMAL);

application.terminate

end;

end

else showmessage(name+' not found'); //this displays if it was determined that

//the running exe is a clone but for some

//crazy reason the original exe file is

//not found in the current directory :-(

end;

//The code below extracts the user name string from the exe file

//and displays it as a caption...but you could retrieve whatever

//data you had stored and do whatever you want with it :-)

if Pos(uppercase('soname'),exestring) > 0 then //Extract Name string

begin //from exe file and

Extract('soname','eoname',ExeString,Temp); //display as the button

SpeedButton1.Caption := 'Program is Registered to '+Temp; //caption :-)

end;

end;

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

//The code in the SpeedButton event handler below modifies the string held in

//the global variable ExeString...this string contains the entire exe file as

//string data...it modifies ExeString by adding data to it's end... the data is

//held between the demarcators 'SONAME' and 'EONAME' these mark off the data

//and make it possible to find it later and extract it from the running exe

//After ExeString is modified it is saved to a new file in the current directory

//with the exe's name plus '_clone' so if the exe name is myprog.exe the clone

//that is saved will be myprog_clone.exe... as soon as the clone exe is saved

//to disk the program runs it and then terminates itself :-)

//The reason uppercase('soname') is used is because the program would find the

//data 'SONAME' at the wrong point in the exe file if you did not do it this way

//ditto for uppercase('eoname') this is an IMPORTANT POINT!

procedure TForm1.SpeedButton1Click(Sender: TObject);

var

MyStream: TMemoryStream;

MyFile,newname: string;

A,B: Integer;

begin

If Speedbutton1.Caption <> 'Enter Your Name Below Then Click Here To Customize Exe'then

begin

exit;

end;

begin

if edit1.text = '' then

begin

showmessage('Please enter a name in the Edit Box!');

exit;

end;

MyStream := TMemoryStream.Create;

try

//in line below you tack on the new data :-)

ExeString := ExeString + uppercase('soname') + Edit1.Text + uppercase('soname');

MyStream.Clear;

MyStream.WriteBuffer(Pointer(ExeString)^, Length(ExeString));//string 2 stream

newname := application.exename; //change name to make it a clone!

Insert('_clone',newname,length(application.exename)-3);

MyStream.savetofile(newname);//save stream to file as a temporary clone!

finally

MyStream.Free;

end;

ShellExecute(Handle, 'open', //run the clone you just saved!

pchar(newname), nil, nil, SW_SHOWNORMAL);

application.terminate; //die little proggie die! :-)

end;

end;

(gift)

#2

(gift)

#3

شكر أخي -waf

#4

شكرآ لك اخ ابراهيم

هذا هو الكود بعد حذف الزوائد .. وتعديل مشكلة بسيطة :

unit Unit1;

interface

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  Buttons,
  StdCtrls,
  ShellAPI,
  ExtCtrls,
  Mask; //Be sure to include ShellAPI
type
  TForm1 = class(TForm)
	SpeedButton1: TSpeedButton;
	Edit1: TEdit;
	procedure FormCreate(Sender: TObject);
	procedure SpeedButton1Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;

var
  Form1: TForm1;
  ExeString: string;

implementation
{$R *.DFM}
////////////////////////////////////////////////////////////////////////////////

procedure Extract(A, B: string; var C, D: string);
var
  E, F: Integer;
begin
  if Pos(uppercase(A), C) > 0 then
  begin
	E := Pos(uppercase(A), C) + length(A);
	F := Pos(uppercase(B), C);
	D := Copy(C, E, F - E);
  end;
end;
////////////////////////////////////////////////////////////////////////////////

procedure Exe2String(var A: string);
var
  ExeStream: TFileStream;
  MyStream: TMemoryStream;
begin
  ExeStream := TFileStream.Create(Application.ExeName, fmOpenRead or
	fmShareDenyNone);
  try
	SetLength(A, ExeStream.Size);
	ExeStream.ReadBuffer(Pointer(A)^, ExeStream.Size);
  finally
	ExeStream.Free;
  end;
end;
////////////////////////////////////////////////////////////////////////////////

procedure Delay(ms: longint);
var
  TheTime: LongInt;
begin
  TheTime := GetTickCount + ms;
  while GetTickCount < TheTime do
	Application.ProcessMessages;
end;
////////////////////////////////////////////////////////////////////////////////

procedure TForm1.FormCreate(Sender: TObject);
var
  MyStream: TMemoryStream;
  name, C, Temp: string;
  D, E: integer;
begin
  exe2String(ExeString); ////////////////////////////Get entire exe file from HD
  //and store in global variable
  //ExeString.
  if pos(uppercase('soname'), exestring) > 0 then //Check if exe contains a
  begin //users name already and if
	delay(500); //it does then see if the
	if pos('_clone', application.exename) = 0 then //running exe is a temporary
	begin //clone program.. if it is not
	  name := application.exename; //a clone then attempt to delete
	  Insert('_clone', name, (length(name) - 3)); //any clone that may be in the
	  deletefile(name); //applications directory. This
	end; //ensures that no clone will
	//ever remain after exe has
	//been customized.....
	////////////////////////////////////////////////////////////////////////////////
	edit1.visible := false; ///////////////////////It has been determined that
	form1.color := $00C6AA84; //the running exe has already been
	// form1.height := 300; //customized..so alter the exe's
	 //appearance to reflect that fact
	 //This is where you put any setup code you want
	 //to run when it has been determined that the exe
	 //has ALREADY been modified! Code to check for a
	 //valid usename+key,to alter the exe's appearance
	 //or whatever you want to do to change the way the
	 //now modified prog is to act should be done HERE!
  end;

  ////////////////////////////////////////////////////////////////////////////////
  //The code below runs IF it is determined that the currently running exe is
  //a temporary clone program..... this code will delete the original exe file
  //from the HD and then save a new copy of itself to the HD with the original
  //exe name...DO NOT REMOVE THE delay(500) line! The program will fail sometimes
  //if you do! Since the currently running exe is a clone that means it already
  //has been modified and in fact is identical to the final exe that it is saving
  //to disk with the original name... as soon as the new exe is saved to disk
  //this code runs it...then immediately terminates itself .. the clone commits
  //hari kiri :-) and since every time a customized exe starts up it attempts
  //to delete it's clone from the current directory this clones remaining life
  //on disk is limited to 1/2 second......
  if pos('_CLONE', uppercase(application.exename)) <> 0 then
  begin
	delay(500);
	name := application.exename;
	Delete(name, length(name) - 9, 6);
	if deletefile(name) then
	begin
	  MyStream := TMemoryStream.Create;
	  try
		MyStream.WriteBuffer(Pointer(ExeString)^, Length(ExeString));
		MyStream.savetofile(name);
	  finally
		MyStream.Free;
		ShellExecute(Handle, 'open',
		  pchar(name), nil, nil, SW_SHOWNORMAL);
		application.terminate
	  end;
	end
	else
	  showmessage(name + ' not found');
	//this displays if it was determined that
//the running exe is a clone but for some
//crazy reason the original exe file is
//not found in the current directory :-(
  end;
  //The code below extracts the user name string from the exe file
  //and displays it as a caption...but you could retrieve whatever
  //data you had stored and do whatever you want with it :-)
  if Pos(uppercase('soname'), exestring) > 0 then //Extract Name string
  begin //from exe file and
	Extract('soname', 'eoname', ExeString, Temp); //display as the button
	SpeedButton1.Caption := 'Program is Registered to ' + Temp; //caption :-)
  end;
end;
////////////////////////////////////////////////////////////////////////////////

//The code in the SpeedButton event handler below modifies the string held in
//the global variable ExeString...this string contains the entire exe file as
//string data...it modifies ExeString by adding data to it's end... the data is
//held between the demarcators 'SONAME' and 'EONAME' these mark off the data
//and make it possible to find it later and extract it from the running exe
//After ExeString is modified it is saved to a new file in the current directory
//with the exe's name plus '_clone' so if the exe name is myprog.exe the clone
//that is saved will be myprog_clone.exe... as soon as the clone exe is saved
//to disk the program runs it and then terminates itself :-)
//The reason uppercase('soname') is used is because the program would find the
//data 'SONAME' at the wrong point in the exe file if you did not do it this way
//ditto for uppercase('eoname') this is an IMPORTANT POINT!

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  MyStream: TMemoryStream;
  MyFile, newname: string;
  A, B: Integer;
begin
  if Speedbutton1.Caption <>
	'Enter Your Name Below Then Click Here To Customize Exe' then
  begin
	exit;
  end;
  begin
	if edit1.text = '' then
	begin
	  showmessage('Please enter a name in the Edit Box!');
	  exit;
	end;
	MyStream := TMemoryStream.Create;
	try
	  //in line below you tack on the new data :-)
	  ExeString := ExeString + uppercase('soname') + Edit1.Text +
		uppercase('soname');
	  MyStream.Clear;
	  MyStream.WriteBuffer(Pointer(ExeString)^, Length(ExeString));
	  //string 2 stream
	  newname := application.exename; //change name to make it a clone!
	  Insert('_clone', newname, length(application.exename) - 3);

	  MyStream.savetofile(newname); //save stream to file as a temporary clone!
	finally
	  MyStream.Free;
	end;
	ShellExecute(Handle, 'open', //run the clone you just saved!
	  pchar(newname), nil, nil, SW_SHOWNORMAL);
	application.terminate; //die little proggie die! :-)
  end;
end;

end.

هذا الموضوع مغلق.

مواضيع مشابهة