Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi exe in die exe integrieren (https://www.delphipraxis.net/16156-exe-die-exe-integrieren.html)

NicoDE 11. Feb 2004 23:29

Re: exe in die exe integrieren
 
Zitat:

Zitat von Meflin
die fällt auch weg, da ich mein programm komprimiere und somit die dateigröße nicht angeben kann!

Musst Du doch gar nicht. Folgende Funktion ermittelt, wie groß die Exe vor dem Anhängen der Daten war (zur Laufzeit).
Delphi-Quellcode:
function DetectPE32Overlay(out Offset, Size: DWORD): Boolean;
type
  PImageSectionHeaders = ^TImageSectionHeaders;
  TImageSectionHeaders = array [Word] of TImageSectionHeader;
var
  Hand: THandle;
  Read: DWORD;
  DosHdr: TImageDosHeader;
  NtHdrs: TImageNtHeaders;
  SecHdr: PImageSectionHeaders;
  SecIdx: Word;
begin
  Result := False;
  // Datei zum Lesen oeffnen...
  Hand := CreateFile(PChar(ParamStr(0)), GENERIC_READ, FILE_SHARE_READ,
    nil, OPEN_EXISTING, 0, 0);
  if (Hand <> INVALID_HANDLE_VALUE) then
  try
    // MS-DOS Datei-Header einlesen um den Offset des PE32-Headers zu erhalten
    // (unter einigen OS nicht zwingend; aber in fast allen Faellen vorhanden)
    if not ReadFile(Hand, DosHdr, SizeOf(TImageDosHeader), Read, nil) or
      (Read <> SizeOf(TImageDosHeader)) or
      (DosHdr.e_magic <> IMAGE_DOS_SIGNATURE) then
      DosHdr._lfanew := 0;
    // PE32-Header einlesen (inklusive 'optionalem' Header)
    if (SetFilePointer(Hand, DosHdr._lfanew, nil, FILE_BEGIN) <> DWORD(-1)) and
      (ReadFile(Hand, NtHdrs, SizeOf(TImageNtHeaders), Read, nil) and
      (Read = SizeOf(TImageNtHeaders))) and
      (NtHdrs.Signature = IMAGE_NT_SIGNATURE) then
      // 'Optionalen' Header pruefen
      with NtHdrs, FileHeader, OptionalHeader do
        if (SizeOfOptionalHeader >= IMAGE_SIZEOF_NT_OPTIONAL_HEADER) and
          (OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC) then
        begin
          // Sektionen durchlaufen und letzte merken
          SecHdr := GetMemory(NumberOfSections * SizeOf(TImageSectionHeader));
          if (SecHdr <> nil) then
          try
            if (SetFilePointer(Hand,
              SizeOfOptionalHeader - IMAGE_SIZEOF_NT_OPTIONAL_HEADER,
              nil, FILE_CURRENT) <> DWORD(-1)) and
              ReadFile(Hand, SecHdr^,
              NumberOfSections * SizeOf(TImageSectionHeader),
              Read, nil) and
              (Read = NumberOfSections * SizeOf(TImageSectionHeader)) then
            begin
              Offset := 0;
              for SecIdx := 0 to NumberOfSections - 1 do
                with SecHdr[SecIdx] do
                  if ((PointerToRawData + SizeOfRawData) > Offset) then
                    Offset := (PointerToRawData + SizeOfRawData);
              Size := GetFileSize(Hand, nil) - Offset;
              Result := True;
            end;
          finally
            FreeMemory(SecHdr);
          end;
        end;
  finally
    CloseHandle(Hand);
  end;
end;
Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Offset: DWORD;
  Size: DWORD;
begin
  if DetectPE32Overlay(Offset, Size) then
    ShowMessage('Offset'#9': 0x' + IntToHex(Offset, 8) + #13#10 +
      'Size'#9': 0x' + IntToHex(Size, 8));
end;
Nach dem Kopilieren zeigt es an:
Code:
Offset: 0x00068400
Size : 0x00000000
Nach "COPY /B Project1.exe + /B Projekt1.dpr Foo.exe" zeigt Foo.exe an:
Code:
Offset: 0x00068400
Size : 0x00000107
Nach "upx.exe --best Foo.exe" zeigt Foo.exe an:
Code:
Offset: 0x00029E00
Size : 0x00000107
(letzteres weil UPX die angehängten Daten erkennt und nach dem Komprimieren wieder hinten anhängt)


Gruss Nico

[edit] Typo im Kommentar - sind bestimmt noch mehr :) [/edit]

Meflin 12. Feb 2004 16:24

Re: exe in die exe integrieren
 
ok leute thx, ich habs schon zum laufen gebracht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz