write anything to the executable (1分)

  • 主题发起人 主题发起人 savenight
  • 开始时间 开始时间
S

savenight

Unregistered / Unconfirmed
GUEST, unregistred user!
今天在borand社区瞎溜的时候看到一篇文章不错,拿来一起分享:
源地址:Article ID: 27979 ; Publish Date: November 26, 2001 ;Last Modified: November 26, 2001

Writing custom data to executable files in Windows and Linux
; ; ; ; ___________________
; ; ; ; |headers ; ; ; ; ;|
; ; ; ; -------------------
; ; ; ; |section/segments |
; ; ; ; -------------------
; ; ; ; |custom data ; ; ;| ;/here comes our custom data
; ; ; ; -------------------

; ; ; ; ; ; ; ; ; ; ; ; ; |---exebuf ; ; (our custom data)
; ; ; ; ; ;custom data--->|
; ; ; ; ; ; ; ; ; ; ; ; ; |---exebufFooter (footer with the original size of the EXE and our signature)
const
; //our ExeBuffer signature
; ExeBufSig = 'EB1.0';

type
; //the Footer for our executable format
; TExeBufFooter = record
; ; OriginalSize : Integer;
; ; Sig : Array[0..4] of char;
; end;
/////////////////////////////
procedure SetExeData (ExeName : String; ExeBuf : TExeBuf);
var
; F : File;
; BufSz,OrigSz : Integer;
; Footer : TExeBufFooter;
begin
; AssignFile (F,ExeName);
; Reset (F,1);
; try
; ; //obtaining the original file size
; ; OrigSz := FileSize(F);
; ; //go to the EOF of the file
; ; Seek (F,OrigSz);
; ; //Writing our custom data beyond the EOF
; ; BufSz := Length(ExeBuf);
; ; BlockWrite (F,Pointer(ExeBuf)^,BufSz);
; ; //Writing our footer
; ; FillChar (Footer,SizeOf(Footer),0);
; ; Footer.OriginalSize := OrigSz;
; ; Footer.Sig := ExeBufSig;
; ; BlockWrite (F,Footer,Sizeof(Footer));
; finally
; ; CloseFile (F);
; end;
end;
/////////////////////////////////////////////
procedure GetExeData (ExeName : String; var ExeBuf : TExeBuf);
var
; F : File;
; CurrSz, BufSize : Integer;
; OldFileMode : Integer;
; Footer : TExeBufFooter;
begin
; AssignFile (F,ExeName);
; //Saving the old FileMode
; OldFileMode := FileMode;
; //Setting the FileMode to ReadOnly
; FileMode := 0;
; try
; ; Reset (F,1);
; ; try
; ; ; //Getting the current file size
; ; ; CurrSz := FileSize (F);
; ; ; //Seeking to the footer position
; ; ; //and reading it
; ; ; Seek (F,CurrSz-SizeOf (Footer));
; ; ; BlockRead (F,Footer,Sizeof(Footer));
; ; ; //if there's no signature, boom!
; ; ; //no data in this executable!
; ; ; if Footer.Sig <> ExeBufSig then
; ; ; ; raise EExeBuf.Create ('No Data in EXE!');
; ; ; //calculating the buffer size that was written
; ; ; //to this executable file
; ; ; BufSize :=CurrSz-Footer.OriginalSize-SizeOf(Footer);
; ; ; SetLength (ExeBuf,BufSize);
; ; ; //seek and read!
; ; ; Seek (F,Footer.OriginalSize);
; ; ; BlockRead(F,Pointer(ExeBuf)^, BufSize);
; ; finally
; ; ; CloseFile (F);
; ; end;
; finally
; ; //returning to the previous saved
; ; //FileMode
; ; FileMode := OldFileMode;
; end;
end;
/////////////////////////////////////
/////////////////////////////
 
接受答案了.
 
后退
顶部