Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Angeregt durch den Code von Helle aus diesem Thread habe ich eine allgemeine Procedure geschrieben um ASM - Code aus dem Speicher auszuführen. Das sollte z.B. enorm schnelle Eval() - Proceduren oder JIT - Compiler ermöglichen.
Habe nicht gedacht, dass man einfach so einen Speicherblock ausführen kann. Bis jetzt kannte ich nur Jumps auf variable Labels.
Thx für die Codes. Wenn ich ASM könnte, dann würde ich sie gut verwenden
können.
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Josef Sniatecki hat geschrieben: Habe nicht gedacht, dass man einfach so einen Speicherblock ausführen kann.
Naja, der reguläre Code muss ja auch im Speicher liegen. Alles was man machen muss ist die Speicherregion in der der Code liegt als Executable flagen, falls sie das nicht sowieso schon ist.
Auf älteren Systemen funktioniert das sogar ohne das es als Executable markiert ist. Aber seid dem VX-Bit geht das hardwareseitig nicht mehr und ab XP (wenn ich mich nicht irre) gibt es auch eine softwareseitige Prüfung ob der Code ausgeführt werden darf.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Und wie Flag ich jetzt eine Exe im Speicher als Executable und führe sie aus?
Bitte keine Verweis auf die nicht funktionierenden Codes hier im Forum, die
kenne ich.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
ts-soft hat geschrieben:Und wie Flag ich jetzt eine Exe im Speicher als Executable und führe sie aus?
Bitte keine Verweis auf die nicht funktionierenden Codes hier im Forum, die
kenne ich.
Das funktioniert nicht so ohne weiteres ne ganze .exe auszuführen. Jede .exe hat eine Image Base. Das ist die Adresse an die sie im Speicher geladen wird. Nun gibt es Anweisungen in der .exe die absolute Adressen beinhalten und von dieser Image Base ausgehen. Läd man die .exe einfach so in den Speicher, werden diese Anweisungen in die Scheiße greifen. ^^
Das lässt sich aber lösen. Für diesen Fall gibt die sogenannten Relocations. Das sind Informationen über diese Anweisungen mit absoluten Adressen. Man kann die Infos auslesen und die Relocations anwenden. Heisst man ändert die Anweisungen auf die neuen Adressen ab. Allerdings müssen die Relocationinfos nicht in der .exe enthalten sein. Da eine regulär geladene .exe immer an ihre Image Base geladen wird. Viele .exe Packer und Optimierer entfernen die Relocationinfos aus der .exe.
Das zweite Problem sind die Imports von DLL-Funktionen. Die müssen alle initialisiert werden. Es gibt eine Import Table in der .exe auf die der Code der .exe zugreift um DLL-Funktionen aufzurufen. Beim regulären starten einer .exe initialisiert der PE-Loader von Windows die Import Table. Also läd alle benötigten DLL's und trägt die Funktionsadressen in die Import Table ein. Das müsste man auch per Hand machen.
Dann sollte das funktionieren.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!