Entwickler-Ecke

Windows API - Zwei Exe verschmelzen ??


scrooge - Sa 18.10.03 18:55
Titel: Zwei Exe verschmelzen ??
Hi,

weiß jemand, wie man zwei Exe miteinander verschmelzen lässt ?? (Um schon mal vorher die Frage zu beantworten: Nein, ich will keinen Virus oder sowas in der Art schreiben). Hab mal gehört man müsste die in eine Datei quetschen, den Einsprungspunkt auf die hinzugekommenene Anwendung umleiten und dann per jmp den eigentlichen Einsprungspunkt
der breits vorhandenen Anwendung aufrufen (Und wenn das jetzt alles Quatsch war - Habt Mitleid mit nem Asembler-ANFÄNGER).


toms - Sa 18.10.03 18:59

Hi!


Das geht z.B mit EXE Bundle:

http://www.webtoolmaster.com/downloadd.htm


Ja-Pa - So 19.10.03 10:23

Wenn die beiden Exes nur selten aufgerufen werden sollen oder es nicht schlimm ist, wenn es ein bisschen länger dauert (z.B. bei einem Setup-Programm), dann könnte man auch (habe ich so gemacht) die beiden Exes in ein selbstentpackendes Archiv, das sich ohne einen Dialog in einen temporären Ordner entpackt, packen. Das geht zum Beispiel mit WinRAR. Assembler kann ich allerdings auch nicht :)


scrooge - So 19.10.03 13:36

Exe-Bundle ist ganz gut, aber ich wollte kein Program, was zwei Exe zusammenfügt und sich dann als Installationsprogramm ausgibt, ich wollte ein Programm schreiben, was auch zwei Exe zusammenführt, aber so, dass sie nacheinander ausgeführt werden, wenn man die so neu enstandene Exe ausführt.


Delete - So 19.10.03 15:10

Pack die zweite Exe als Binär-Ressource in die erste rein und extrahier sie zur Laufzeit. Ausführen kannst du sie dann mit Shellexecute(Ex) oder CreateProcess.


scrooge - So 19.10.03 19:00

Heißt extrahieren, lesen und speichern (irgendwo auf der Festplatte), oder einfach nur in den Speicher laden


Delete - So 19.10.03 22:14

Lesen und Speichern auf der Fetsplatte. Unter NT könnte man die Exe auch aus dem Speicher starten, aber warum?


Motzi - Mo 20.10.03 10:16

Luckie hat folgendes geschrieben:
Unter NT könnte man die Exe auch aus dem Speicher starten, aber warum?

Nicht direkt... gestartet werden muss sie auch von der Festplatte, aber man kann im Nachhinein das MMF-File der Exe freigeben und das neue Image in den Adressraum laden. (Vorgehensweise von inmemexe)


Delete - Mo 20.10.03 14:51

Nope, ist schon richtig aus dem Speicher: http://www.luckie-online.de/files/exports/ -> immemexe.zip Ist von Nico.


Motzi - Mo 20.10.03 18:27

Nope... erstens ist es nicht wirklich von Nico sondern von Gary Nebbett, Nico hat es nur auf Delphi übersetzt, und zweitens startet sich das Prog einfach nur selbst wieder:

Delphi-Quelltext
1:
if CreateProcess(nil, PChar(ParamStr(0)), nilnil, False, CREATE_SUSPENDED, nilnil, StartupInfo, ProcessInfo) then                    

Holt sich den Thread-Context und anhand des Thread-Context die Adresse an der die MMF der Exe erstellt wurde und gibt dieses frei (per native API):

Delphi-Quelltext
1:
2:
3:
4:
5:
Context.ContextFlags := CONTEXT_INTEGER;
      if GetThreadContext(ProcessInfo.hThread, Context) and
         ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
          @BaseAddress, SizeOf(BaseAddress), BytesRead) and
        (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0then

Reserviert dann per VirtualAllocEx Speicher an der ImageBase-Adresse der Exe die in den Speicher geladen werden soll (diese Adresse muss der ImageBase entsprechen, da man ja die Exe sonst verschieben und etliche Adressen neu berechnen müsste (-> Realloc-Table)), dann wird die neue Exe direkt in den Adressraum geschrieben (WriteProcessMemory), der Thread-Context entsprechend geändert und wieder gesetzt und der Thread gestartet (resumed).


scrooge - Mo 20.10.03 19:35

Schon mal danke für die reichlcieh Posts. Hab mir mal die Methode mit dem als binär-Ressource in die Exe... ausgesucht. Fragt sich jetzt nur, wie ich erstens (wollte da ganze ja selbst machen) die zweite Exe in die erste reinkriege (Kenn mich zum Them Ressourcen nämlcih nur sehr schwach aus) und die zur Laufzeit auslese, speichere etc. Außerdem könnte ich mir denken, dass das sehr viel Aufwand darstellt. Wäre da die Methode (weiß jemand wie ??) die Einsprungsadresse zu ändern usw. nicht vielleicht schneller und sogar weniger Arbeit ??