Delphi-PRAXiS

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)

Meflin 11. Feb 2004 15:36


exe in die exe integrieren
 
Hi,
ich müsste eine exe in meine anwendung einbinden, sodass ich zur laufzeit darauf zugreifen kann. dazu wären mir als möglichkeit zum einen resourcen bekannt. mein rs-compiler geht aber wegen xp net so toll (der is ja konsole). dann kenn ich noch die möglichkeit aus der delphi source library. die fällt auch weg, da ich mein programm komprimiere und somit die dateigröße nicht angeben kann! jetzt such ich dringend irgend ne möglichkeit, eine exe in mein programm zu integrieren! Gibts da vielleicht irgend ne kompo?

*MFG*

The-X 11. Feb 2004 15:58

Re: exe in die exe integrieren
 
Hi,
Du kannst dir ne Kopie einer vorhandenen .res datei machen und diese mit dem Resource-Hacker bearbeiten d.h. alle anderen Resourcen löschen und deine Exe hinzufügen

so hab ich das jedenfalls das erste mal gemacht

ansonsten versuch es doch mal mit cmd/bat dateien
meist funktioniert das nicht weil das Anfangsverzeichnis nicht richtig ist

ustra 11. Feb 2004 15:58

Re: exe in die exe integrieren
 
Hi,

ich habe auch das Problem so ähnlich gehabt. Ich wollte eine exe ins Programm einbinden und bei Bedarf extrahieren. Dazu suche hier mal nach Hier im Forum suchenPutbintores. Das extrahiert dir eine exe aus einer exe wieder raus. Vielleicht Dir das weiter.

Beste Grüße
Ulrich

Meflin 11. Feb 2004 17:22

Re: exe in die exe integrieren
 
das einzige was ich da finde ist ein verfahren, die anwendung zu kopieren. bei mir handelt es sich aber um zwei verschiedene anwendungen!
@the-x: das problem ist, dass sich der compiler schliesst, bevor ich irgendwas machen kann!

The-X 11. Feb 2004 17:25

Re: exe in die exe integrieren
 
Code:
@echo off
cdd D:\bla
rem alternativ D: und danach cd \bla
brcc32 bla.rc
Pause
Dann siehst auch was da steht und erst nach einem tastendruck wird das Fenster geschlossen

Meflin 11. Feb 2004 17:45

Re: exe in die exe integrieren
 
wie muss denn die resourceart der exe im rs file heissen?

Jens Schumann 11. Feb 2004 17:55

Re: exe in die exe integrieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
im Download ist ein Beispiel, wie man aus einer EXE eine EXE startet.
Also aus einer Resource heraus.

ustra 11. Feb 2004 17:56

Re: exe in die exe integrieren
 
Hi,

ich habe mich vertan. Die Funktion heißt Hier im Forum suchenPutBinResto.

Das hilft Dir auf jedenfall weiter: Seite

Ulrich

Meflin 11. Feb 2004 17:58

Re: exe in die exe integrieren
 
ok thx ich denke das sollte reichen! eine komfortablere möglichkeit wie die mit dem ressourcencompiler gibts eigentlich nicht?

Luckie 11. Feb 2004 20:25

Re: exe in die exe integrieren
 
@Jens Schumann: Du startest aber nicht aus der Ressource raus, sondern von der Platte. Du schreibst die Ressource ja erst auf die Platte bevor du sie startest. Wenn du sehen willst, wie man eine Exe "aus" der Ressource ausführt, also ohne sie auf der Platte zu speichern, dann kuck dir mal hier: http://www.luckie-online.de/files/exports/inmemexe.zip von Nico an.

Zitat:

mein rs-compiler geht aber wegen xp net so toll (der is ja konsole).
Start -> Ausführen -> cmd -> Return. Dan gib mal in der Konsole brcc32 /? ein. :roll:

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:05 Uhr.

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