exe im eingenen speicher starten
-
Hi, mal ne kleinere frage..
Hat eine von euch ne idee wie ich hin bekommen könnte ein 2. prog aus meinem prozessbereich heraus zu starten? Ich möchte die exe wie ne dll behandeln können, d.h sie in meinen prozess laden (funzt auch mit Loadibrary). Was jetzt noch fehlt ist ein aufruf der WinMain. Einer idee wie die an die Adresse von dem ding komme?
-
Dafür gibt es logischerweise nichts vorgefertigtes, das mußt Du selbst machen. Im MSDN gibt es die Beschreibung zum PE-Format, als Basis dient Dir das Instanzen-Handle. Viel Spaß.
Aber was soll das? Wenn Du den fremden StartupCode aufrufst, bleibt Dein Thread solange hängen, bis eben dieser fremde Code die Kontrolle an Dich zurückgibt. Damit hast Du doch gar nichts gewonnen.
-
Jo, das PE zeug hab ich schon gefunden... nur halte ich WinMainCRTStartup (der entry point) für die falsche adresse. Die CRT wurde je schon mal initialisiert, ich möchte gern direkt in die WinMain...
Sinn der sache:
Ich habe ein prog 1 welches mit nem speiziellen verfaren aus files liest und nun möchte ich der prog 2 auch dieses verfahren verwendet.. ok kein problem denkt sich jeder bis ich folgende punkt aufliste:
Das initialisieren von dem ding duart ewig, kann es also nicht einfach in ne dll packen, per hook an prog 2 hängen und die RVA so umbiegen das die calls bei mir landen.
Aus prog 1 nen socket/pipe server basteln an den sich die dll hängt, ist mir zu viel arbeit, das sind x funktionen sind die gehookt werden und ich muss dafür dann ein protokoll ect. bauen...
Wenn ich prog 2 im adressraum von prog 1 habe, hooke ich mich selbst und kann dann über einen direkten call der funktion (in prog 1 - aus der hook dll) die sache erledigen. Auf den ersten blick am wenigsten arbeit (lasse mich aber gern vom gegenteil überzeugen
)<nur_so_als_info> das ganze soll nur ne kleine hilfe sein und ich will da nicht tage an arbeit rein stecken.. also etweder es geht schnell ich ich lass es ganz..
</nur_so_als_info>
-
CMatt schrieb:
Das initialisieren von dem ding duart ewig, kann es also nicht einfach in ne dll packen, per hook an prog 2 hängen und die RVA so umbiegen das die calls bei mir landen.
Das kapier ich nicht. Weil das andere Programm lange zur Initialisierung braucht, kannst Du es nicht hooken? Welchen Zusammenhang siehst Du da?
CMatt schrieb:
<nur_so_als_info> das ganze soll nur ne kleine hilfe sein und ich will da nicht tage an arbeit rein stecken.. also etweder es geht schnell ich ich lass es ganz..
</nur_so_als_info>Dann lass es, das geht nicht so einfach. Direkt an _tWinMain kommst Du nicht ran.
-
Das kapier ich nicht. Weil das andere Programm lange zur Initialisierung braucht, kannst Du es nicht hooken? Welchen Zusammenhang siehst Du da?
Wenn ich aus prog 1 ne dll mit hook-procs baue und diese an prog 2 hänge muss ich den code jedes mal initialisieren wenn ich prog 2 starte -> dauert ewig. Prog 2 soll nur über meinem code arbeiten wenn prog 1 auch läuft (sonst bleibt alles beim alten) und so wärs natürlich praktisch wenn ich aus prog 2 den initialisierten code aus prog 1 verwenden könnte (was nur geht wenn der prog 2 code im adressraum von prog 1 leigt, denn ein funktionsaufruf über prozessgrenzen hinweg geht bekanntlich nicht..)
Noch als zusatz info: prog 2 ist nicht ein beliebiges progamm sondern immer das selbe, müsste also nur einmal an die adress von WinMain, das muss ncht dynamisch laufen..
-
CMatt schrieb:
, müsste also nur einmal an die adress von WinMain, das muss ncht dynamisch laufen..
Da kommst Du so nicht ran, dazu brauchst du Debug-Info, bzw. das Map-File. Woher weißt Du überhaupt, daß es bei Deinem Prog2 auch WinMain gibt? Ist wWinMain tatsächlich ausgeschlossen?
-
Nö, ist nicht ausgeschlossen, aber hab sie jetzt.. ein hoch auf die guten alten disassembler

-
hi,
ich will sowas ähnliches machen (also auch eine exe in meiner eigenen exe starten).
ich lade die 2. exe mit loadlibrary und springe dann an den entrypoint aus dem header. leider beendet sich mein programm dann aber sofort.gut hab ich mir gedacht, liegt sicher an dem falschen aufruf von GetModuleHandleA(), weil beim start des programms GetModuleHandleA(NULL) aufgerufen wird und somit die adresse von meiner 1. exe zurückgegeben wird.
ich habe jetzt einen hook draufgesetzt, so dass jetzt die richtige adresse zurückgegeben wird. leider funktioniert mein programm immer noch nicht

kann mir irgendwer sagen, wie sich sowas richtig implementieren lässt?
thx, eof
-
was soll den dein zweites programm machen?
vielleicht wär ne pipe oder sowas ähnliches etwas für dich.
-
Soweit ich das mal gelesen hab funktioniert soetwas nur wenn wenn die exe eine relocation-section hat(was bei wahrshceinlich 99% nicht der fall is). Auserdem musst du exit() hooken sonst beendet das "slave" programm dein "master" programm beim beenden gleich mit. Da gibts auch ne gute seite auf der das jemand schonmal gemacht hat sogar mit code und tutorial... ich werd die mal schnell suchen.
-
hi,
ich lade das image der exe an die richtige ImageBase im speicher, eine relocation sollte also nicht nötig sein.
ich hab auch ein wenig rumprobiert. mein ziel soll später sein, dass ich ein beliebiges programm an meins hängen kann und sich beide ausführen (im gleichen prozess). aber auch wenn ich bei einem speziellen programm (ich habe notepade genommen) die WinMain() direkt aufrufe (mit dasm die adresse rausgefunden), dann beendet sich der prozess zwar nicht mehr selbst, aber es wird mir auch kein fenster von notepad angezeigt

naja, wenn irgendwer papers dazu hat: her damit

thx, eof
-
Guck dir hier http://www.luckie-online.de/Delphi/Importe/Nico/ mal von Nico die inmemexe an. Ist zwar Delphi Code, aber die API Aufrufe sind die gleichen. Für mich stellt sich allerdings die Frage wozu das gut sein soll.

-
vielen dank!
es ist zwar weiterhin notwenig, dass ich 2 prozesse laufen hab, aber diese methode hilft mir trotzdem weiter! thx!
ciao, eof