2017-06-20 7 views
5

Lassen Sie uns sagen, ich habe eine Binärdatei in mein Programm während der Kompilierung, so dass ich es in einer Variablen so etwas wie var myExec =[]byte{'s','o','m','e',' ','b','y','t','e','s'} Also meine Frage ist, ob es eine Möglichkeit gibt, diese Binärdatei in meinem Programm auszuführen, ohne es zurück auf die Disc zu schreiben und rufen exec oder fork auf es? Ich schreibe meine App in Golang, also suche ich nach Go oder C (mit CGO).Wie kann ich eine ausführbare Datei aus dem Speicher ausführen?

Im Grunde bin ich auf der Suche nach etwas wie die Bash-Skript in bash nur ich weiß nicht, wo kann ich die Bytes einer nativen ausführbaren Datei zu leiten und es wieder auf die Festplatte schreiben und dann os wieder lesen lassen eine Menge zusätzlicher Arbeit scheint

+2

Wie sind Sie in die Situation gekommen, eine ausführbare Binärdatei zu haben, die nicht auf der Festplatte gespeichert ist? Ich frage nur, weil ich denke, dass es vielleicht einen besseren Weg gibt, das ursprüngliche Problem zu lösen ... –

+0

Dies ist nur ein hypothetisches Problem. Ich plane, eine App zu machen, die diese Art von Informationen im Grunde benötigt, kann ich einige Tools mit meiner App packen und sie nach Bedarf aus dem Dashboard meiner App ausführen, ohne sie auf die CD zu schreiben, und wenn ich fertig bin, werden keine temporären Dateien sein auf der CD alle im Speicher @FelixPalmen – nikoss

+0

Ich glaube nicht, dass Sie dies tun sollten. Z.B. Auf einem Linux-System würden Sie einfach ein Paket erstellen, das diese Tools in '$ (Präfix)/lib/$ (Paket) /' oder '$ (Präfix)/libexec/$ (Paket) /' installiert. Unter Windows würden sie irgendwo in Ihr Programmverzeichnis gehen. –

Antwort

1

In C und unter der Annahme, Linux getan werden, können Sie den Schutz eines Speicherbereichs mit Hilfe des mprotect() Systemaufruf ändern, so dass es (dh ausgeführt werden kann: wiederum ein Datenbereich in einen Code-Bereich). Danach können Sie diesen Speicherbereich ausführen, indem Sie springen hinein.

+0

Das ist nur der einfache Teil. Was ist mit dem Verschieben und Laden von externen Komponenten wie .so-Dateien? –

+0

Hinzufügen eines kleinen Stück Code könnte so nett mir zu verstehen. was ich von der man-Seite unten verstehe https://ws1.sinaimg.cn/large/006tKfTcgy1fgrzfy90qtj31260qemyr.jpg Ich muss die Adresslänge und prot_exec übergeben, aber es gibt immer noch ein Problem, um die Speicheradresse zu bekommen, die ich brauche Unsichere Zeiger zu verwenden und malloc es selbst seit der Verwendung von go afaik gibt es keine Möglichkeit, mit den Adressen manuell umzugehen und lässt annehmen, dass ich das getan habe, wie kann ich tatsächlich die Bytes ausführen, das ist die Herausforderung, wie man dort springt, wie Sie @neroku – nikoss

+0

sagen @MichaelWalz das ist nicht wirklich ein Problem, wenn Ihre Binärdatei rein geschrieben wird, da es statisch verknüpft ist alles, was es braucht, ist – nikoss

Verwandte Themen