【问题标题】:How can i execute an executable from memory?如何从内存中执行可执行文件?
【发布时间】: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


【解决方案1】:

在 C 和假设 Linux 中,您可以通过 mprotect() 系统调用更改对内存区域的保护,以便可以执行(即:将 数据区域 变为代码区域)。之后,您可以通过 跳转 执行该内存区域。

【讨论】:

  • 这只是简单的部分。 .so 文件等外部组件的重定位和加载呢?
  • 添加一小段代码让我很容易理解。我从下面的手册页中了解到ws1.sinaimg.cn/large/006tKfTcgy1fgrzfy90qtj31260qemyr.jpg 我需要传递地址长度和 prot_exec 但仍然存在问题为了获得内存地址我需要使用不安全指针并自己 malloc 它因为使用 go afaik 有没有办法手动处理地址,假设我已经做到了,我如何才能真正执行字节,这就是你所说的如何跳转到那里的挑战@neroku
  • @MichaelWalz 如果您的二进制文件是用纯 go 编写的,那并不是真正的问题,因为它是静态链接的,它所需要的只是它自己
  • @nikoss 您可以通过函数指针开始执行 C 中的代码:通过将指针设置为代码所在的地址并执行调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2012-06-20
  • 2021-04-28
相关资源
最近更新 更多