Announcement

Collapse
No announcement yet.

Text an eine kompilierte exe anhängen bzw. auslesen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Text an eine kompilierte exe anhängen bzw. auslesen?

    Hallo. Ich möchte an eine bestehende Datei (z.Bsp Notepad.exe) einen kurzen Textstring anhängen und in einer späteren Sitzung auch wieder auslesen. In diese Richtung habe ich bisher noch keinerlei Erfahrung. Ist so etwas überhaupt möglich? Und wie lässt es sich verwirklichen? Vielen Dank im voraus.

  • #2
    Unter www.delphi-forum.de gibts in der FAQ einen Beitrag über sowas

    Comment


    • #3
      Also wenn man davon ausgehen kann, das die ausführbare Datei:<br>
      (1) eine PE/COFF -Datei ist (alle mit Delphi erzeugten binaries),<br>
      (2) die Segmente in der Tabelle im PE-Header die gesamte Datei beschreiben (ditto).<br>
      Dann folgt auf das letzte Segment der angehängte Text (so-genannte Overlay)<p>
      <pre><p><b>function</b> GetAttachedDataOffset(Image: PImageDosHeader): DWORD; <b>stdcall</b>;
      <b>type</b>
      PImageSectionHeaderArray = ^TImageSectionHeaderArray;
      TImageSectionHeaderArray = <b>array</b> [1..96] <b>of</b> TImageSectionHeader;
      <b>var</b>
      NtHeaders: PImageNtHeaders;
      SectionHeaders: PImageSectionHeaderArray;
      Section: Integer;
      SectionEnd: DWORD;
      <b>begin</b>
      Result := 0;
      <b>try</b>
      <b>if</b> Assigned(Image) <b>then</b>
      <b>if</b> (Image.e_magic = IMAGE_DOS_SIGNATURE) <b>then</b>
      <b>begin</b>
      NtHeaders := Pointer(DWORD(Image) + DWORD(Image^._lfanew));
      <b>if</b> (NtHeaders.Signature = IMAGE_NT_SIGNATURE) <b>then</b>
      <b>begin</b>
      SectionHeaders := Pointer(DWORD(NtHeaders) +
      DWORD(NtHeaders^.FileHeader.SizeOfOptionalHeader) +
      DWORD(@NtHeaders^.OptionalHeader) - DWORD(@NtHeaders^));
      <b>for</b> Section := 1 <b>to</b> NtHeaders^.FileHeader.NumberOfSections <b>do</b>
      <b>begin</b>
      SectionEnd := SectionHeaders^[Section].PointerToRawData +
      SectionHeaders^[Section].SizeOfRawData;
      <b>if</b> (SectionEnd > Result) <b>then</b>
      Result := SectionEnd;
      <b>end</b>;
      <b>end</b>;
      <b>end</b>;
      <b>except</b>
      Result := 0;
      <b>end</b>;
      <b>end</b>;<p></pre>

      Dieser Funktion wird die Adresse übergeben, an der die Datei im Speicher liegt (ich benutze diese öfter bei SFX-Modulen und verwende dort memory mapped files).<br>
      Als Ergebnis bekommt man den Dateioffset zurück, an der das Overlay beginnt.<br>
      Ist dieser Offset mit der Dateigröße identisch (oder 0 bei Fehler), dann ist kein Overlay vorhanden.

      Gruß Nic

      Comment

      Working...
      X