2017-06-20 114 views
5

假设我在编译过程中将一个二进制文件包含到了我的程序中,所以我将其保存在一个变量中,如 var myExec =[]byte{'s','o','m','e',' ','b','y','t','e','s'} 所以我的问题是是否有一种方法可以在我的程序中执行此二进制文件而无需将其写回到光盘并调用exec或fork? 我在Golang写我的应用程序,所以我正在寻找的方法是使用Go或C(使用CGO)。如何从内存执行可执行文件?

基本上,我正在寻找类似的管道bash脚本到bash的只是我不知道我在哪里可以管一个本地可执行的字节来运行它,并写回磁盘,然后让OS读一遍似乎有很多额外的工作要做

+2

你是怎么进入一个没有存储在磁盘上的可执行二进制文件的情况?只是问,因为我*认为*可能有更好的办法来解决原来的问题... –

+0

这只是一个假设的问题。我打算制作一个需要这种信息的应用程序,基本上我可以用我的应用程序打包一些工具,然后根据需要从我的应用程序的仪表板运行它们,而无需将它们写入光盘,并且在完成后没有临时文件在光盘上的所有内存@FelixPalmen – nikoss

+0

我不认为你应该这样做。例如。在Linux系统上,您只需创建一个将这些工具安装到'$(prefix)/ lib/$(package)/'或'$(prefix)/ libexec/$(package)/'的软件包。在Windows上,他们会去你的程序目录中的某个地方。 –

回答

1

在C和假设Linux中,您可以通过系统调用mprotect()系统调用来更改内存区域的保护,以便它可以执行(即:打开一个数据区域转换成代码区域)。之后,你可以通过跳入来执行该区域的内存。

+0

那只是简单的部分。如何重新定位和加载诸如.so文件等外部组件? –

+0

添加一小段代码可以让我很好理解。 我从下面的手册页了解到https://ws1.sinaimg.cn/large/006tKfTcgy1fgrzfy90qtj31260qemyr.jpg 我需要传递地址长度和prot_exec,但仍然有问题以获取我需要的内存地址使用不安全的指针和malloc它自己使用去afaik没有办法手动处理地址,让我们假设我已经这样做,我怎么能够实际执行的字节这就是挑战如何跳转,如你说@neroku – nikoss

+0

@MichaelWalz如果你的二进制文件是纯粹编写的,因为它是静态链接的,它所需要的只是它自己 – nikoss