Exe mal anders starten
-
Hi!
Ich spinne mal wieder ein bißchen rum und habe mir ausgedacht wie
man Programme von Hand starten kann. Wenn ich mich nicht irre,
ist das Programm während es ausgeführt wird immer im Speicher.
Also lädt man die ganze Exe in einen char-Array und versucht aus
den Daten das Byte zu kriegen wo die main() anfängt
(glaube die ASM-Freaks können sowas).
Die Adresse dieses chars/Bytes castet man dann als
int(__cdecl *)(void)-Pointer und ruft sie auf.
Da die Adresse wirklich auf den Code des Proggs zeigt und
Speicherinhalte Interpretationssache sind, könnte das funzen.Frage an euch Gurus:
Geht das??
-
Speicher allokieren und die EXE dort reinkopieren wäre nicht das Problem. Auch den EntryPoint (main()) könnte man aus dem PE Header auslesen. Man könnte auch die benötigten DLLs auslesen und manuell laden. Schwieriger wird es dann schon die Importtabelle der EXE zu füllen. Da bin ich mir nicht sicher, aber es könnte auch gehen. Die EXE könnte man übrigens nicht einfach so laden, sondern man müsste sich die Section Header angucken und dann die einzelnen Section an die vorbestimmten Adressen (die sind relativ zur ImageBase) laden und das auch mit den vorbestimmten Attributen. Noch ein kleines Problem: die ImageBase. Die ist bei EXE Dateien vorgeschrieben und standardgemäß 0x00400000. Die EXE MUSS an dieser Adresse geladen werden. DLLs haben eine Relocation Section mit der irgendwie die DLL auch an einer anderen ImageBase geladen werden kann. Somit müsste dein Programm eine andere ImageBase besitzen. Mehr fällt mir gerade nicht ein und ich weiß nicht ob das klappen würde. Ehrlich gesagt bezweifle ich das irgendwie.
-
Mit *.com's wärs einfacher.
-
COM Dateien werden zwar in einem Stück in den Speicher geladen, aber sie laufen ja als DOS Programme. Unter DOS wäre es sicher nicht allzu schwer eine COM Datei manuell zu laden, denn soweit ich mich erinnere gibt es da auch eine Interruptfuntion zum erstellen des PSP. Aber wie soll man sowas unter Windows machen? Schließlich müsste das Ganze auch noch im Realmode, also im Virtual x86 Mode laufen. Außerdem: Wer will heutzutage schon was mit COM Dateien machen?
-
@malfunction:
Woher weißt du so gut uber exe-files bescheit? (Assembler-Freak??)@cheopz: Sorry, aber COM's wären nicht das ideale.
Wenn man das alles in DOS macht, würde es doch viel einfacher, oder?
So als Test würde ich sowas schon mal gerne probieren. Muß man dazu Assembler können?
-
@Kane: Nun, ich programmiere in Assembler, ja. Ich hab mir mal einen Text über den Aufbau des PE Files durchgelesen und auch schon das eine oder andere an so einer EXE manipuliert. Als freak würde ich mich nicht gerade bezeichnen ... dafür kann ich viel zu wenig
-
Es geht zwar am aktuellen Problem etwas vorbei, aber vielleicht kann man einige Techniken von Buffer overflow exploits einsetzen. Wie z.B. Speicher mit NOP auffüllen, um den instruction pointer auf die "richtige" Speicherstelle zu kriegen. ´ne c´t hat dazu mal einen interessanten Artikel rausgebracht.
P.S.: Warum nicht system(), unschön aber es tut´s !?
[edit]
Hier der c´t Artikel: http://www.heise.de/ct/01/23/216/default.shtml
[/edit][ Dieser Beitrag wurde am 27.05.2002 um 12:03 Uhr von c++==d editiert. ]
-
wenn du ne exe datei selber laden willst und ausführen, dann viel spass dabei, das wird mehr probleme aufwerfen als dir lieb ist.
1. exe dateien können grösser sein als 64 kb und passen somit nicht mehr am stück ein segment. was zur folge hat, das sprünge über die 64 kb grenze nicht mehr relativ von staten gehen Können, sondern nur noch direkt, und dafür wurde ein sogenter loader davorgeschalten, der diese sprünge dann auf die richtigen adressen umbiegt.
auserdem unterstüten moderne betriebsysteme das sogente paging, soll heissen es werden nur die programm pages im speicher gehalten, die wirklich gebraucht werden, die anderen ausgelagert und bei bedarf nachgeladen. (effizienter)
ich wünsch dir nochmals viel spass dabei. geht ja schon fast in die os programmierung was du da vorhast. aber ich fag mich wirklich wieso man sowas sleber schreiben will, wenn das betriebsystem einem sowas schon zur verfügung stellg.
gruss termite
-
Bei den Problemen lasse ich es wohl doch besser sein.
thx für die Bemühungen
-
@c++==d: "´" ist ein Akut, der Apostroph ist "'".