Read and Write to EOF by Xash

Post date: Sep 15, 2010 4:33:42 AM

EOF is the storage method of appending your data to the end of an executable. To recover the data, parse the PE headers to determine the offset at which the file ends and the EOF data begins; then read it.

{ uEOF
  Author: Xash
  Description: Read/Write in EOF
  [FR] hacksecu.com
  [EN] ic0de.org
}
unit uEof;
interface
uses
  Windows;
function ReadFile(FileName: String): AnsiString;
function ReadEof(Delimit1, Delimit2 :String) :String;
function WriteEof(FileName, Res, Delimit1, Delimit2 :String) :String;
implementation
function ReadFile(FileName: String): AnsiString;
var
  F             :File;
  Buffer        :AnsiString;
  Size          :Integer;
  ReadBytes     :Integer;
  DefaultFileMode:Byte;
begin
  Result := '';
  DefaultFileMode := FileMode;
  FileMode := 0;
  AssignFile(F, FileName);
  Reset(F, 1);
  if (IOResult = 0) then
  begin
    Size := FileSize(F);
    while (Size > 1024) do
    begin
      SetLength(Buffer, 1024);
      BlockRead(F, Buffer[1], 1024, ReadBytes);
      Result := Result + Buffer;
      Dec(Size, ReadBytes);
    end;
    SetLength(Buffer, Size);
    BlockRead(F, Buffer[1], Size);
    Result := Result + Buffer;
    CloseFile(F);
  end;
  FileMode := DefaultFileMode;
end;
function ReadEof(Delimit1, Delimit2 :String) :String;
var
  Buffer      :AnsiString;
  ResLength   :Integer;
  i           :Integer;
  PosDelimit  :Integer;
begin
  Buffer := ReadFile(ParamStr(0));
  if Pos(Delimit1, Buffer) > Pos(Delimit2, Buffer) then
    PosDelimit := Length(Buffer)-(Pos(Delimit1, Buffer)+Length(Delimit1))
  else PosDelimit := Length(Buffer)-(Pos(Delimit2, Buffer)+Length(Delimit2));
  Buffer := Copy(Buffer, (Length(Buffer)-PosDelimit), Length(Buffer));
  ResLength := Pos(Delimit2, Buffer)-(Pos(Delimit1, Buffer)+Length(Delimit1));
  for i := 0 to (Reslength-1) do
    Result := Result+Buffer[Pos(Delimit1, Buffer)+(Length(Delimit1)+i)];
end;
function WriteEof(FileName, Res, Delimit1, Delimit2 :String) :String;
var
  F: TextFile;
begin
  AssignFile(F,FileName);
  Append(F);
  Writeln(F,Delimit1+Res+Delimit2);
  CloseFile(F);
end;
end.