Einzelnen Beitrag anzeigen

NicoDE
(Gast)

n/a Beiträge
 
#11

Re: exe in die exe integrieren

  Alt 12. Feb 2004, 00:29
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]
  Mit Zitat antworten Zitat