【问题标题】:How to run an arbitrary script or executable from memory?如何从内存运行任意脚本或可执行文件?
【发布时间】:2018-08-17 19:43:17
【问题描述】:

我知道我可以使用像 execl("/bin/sh", "-c", some_string, 0) 这样的系统调用来使用特定的 shell/解释器来解释 shell 代码的“sn-p”。但在我的情况下,我在内存中有一个任意字符串,它代表一些需要运行的完整脚本。也就是说,这个字符串/内存缓冲区的内容可能是:

#! /bin/bash

echo "Hello"

或者他们可能是:

#! /usr/bin/env python

print "Hello from Python"

我想理论上字符串/缓冲区甚至可以包含一个有效的二进制可执行文件,尽管这不是一个特别的优先级。

我的问题是:有没有办法让系统直接从我给它的内存缓冲区启动子进程,而不将其写入临时文件?或者至少,一种将字符串提供给 shell 并将其路由到正确解释器的方法?

似乎我发现的所有系统调用都期望现有可执行文件的路径,而不是需要可执行文件本身的低级别。我确实想自己解析shebang 或任何东西。

【问题讨论】:

标签: c executable


【解决方案1】:

您尚未指定操作系统,但由于 #! 是特定于 Unix 的,我认为这就是您所说的。

据我所知,没有系统调用会从内存块而不是文件中加载程序。加载程序的最低级别的系统调用是execve() 函数,它需要加载文件的路径名。

【讨论】:

    【解决方案2】:

    我的问题是:有什么方法可以让系统启动 直接从我给它的内存缓冲区中子进程,无需写入 它到一个临时文件?或者至少,一种将字符串提供给 shell 并让它路由到正确的解释器?

    似乎我发现的所有系统调用都希望有一个路径 现有的可执行文件,而不是需要 可执行本身。我不想解析shebang或任何东西 我自己。

    简单的回答:没有。

    详细回答:

    execl 和 shebang 约定是 POSIX 主义,所以这个答案将集中在 POSIX 系统上。无论您要执行的程序是使用 shebang 约定的脚本还是二进制可执行文件,the exec-family functions 都是用户空间程序导致不同程序运行的方式。 system()popen() 等其他接口都是在这些接口之上实现的。

    所有 exec 系列函数都希望从文件中加载进程映像。此外,如果成功,它们会用新图像替换调用它们的进程的内容,包括分配给它的所有内存。

    更一般地说,基本上所有现代操作系统都强制执行进程隔离,进程隔离的核心支柱之一是没有进程可以访问另一个进程的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2013-05-08
      • 2023-01-18
      相关资源
      最近更新 更多