【发布时间】:2017-11-23 01:13:24
【问题描述】:
假设我在编译过程中将一个二进制文件包含到我的程序中,所以我将它保存在一个变量中,例如
var myExec =[]byte{'s','o','m','e',' ','b','y','t','e','s'}
所以我的问题是,是否有一种方法可以在我的程序中执行这个二进制文件,而无需将其写回磁盘并在其上调用 exec 或 fork?
我正在用 Golang 编写我的应用程序,所以我正在寻找的方法是使用 Go 或 C(使用 CGO)来完成。
基本上,我正在寻找类似将 bash 脚本通过管道传输到 bash 之类的东西,只是我不知道在哪里可以通过管道传输本机可执行文件的字节来运行它并将其写回磁盘,然后让 os 再次读取它似乎还有很多额外的工作要做
【问题讨论】:
-
您是如何遇到没有存储在磁盘上的可执行二进制文件的情况的?只是问,因为我认为可能有更好的方法来解决原始问题...
-
这只是一个假设问题。我打算制作一个需要此类信息的应用程序,基本上我可以在我的应用程序中打包一些工具,并根据需要从我的应用程序的仪表板运行它们,而无需将它们写入光盘,当我完成时,不会有临时文件在磁盘上全部在内存中@FelixPalmen
-
我认为你不应该这样做。例如。在 linux 系统上,您只需创建一个包,将这些工具安装到
$(prefix)/lib/$(package)/或$(prefix)/libexec/$(package)/。在 Windows 上,它们会位于程序目录中的某个位置。 -
“打包一些工具”?就像在预编译程序中一样?忘了它。通过更改区域上的内存保护来执行任意代码段并不是很困难。正确解析程序,正确地将程序加载到内存中的正确偏移量,正确设置堆栈以供执行是完全不同的野兽。您需要在这里实现的一半事情甚至没有正确记录。即使它是静态链接的 PIE 二进制文件,它仍然需要大量工作。最好的办法是让“应用程序”成为主程序的一部分,并将它们作为普通函数调用。
-
这可能与以下问题重复:stackoverflow.com/questions/3553875/… 和 stackoverflow.com/questions/305203/…。另外,我不明白,为什么您接受了答案,甚至几乎没有回答您的问题。
标签: c go binary executable