如何从内存中运行任意脚本或可执行文件?

时间:2018-08-17 19:43:17

标签: c executable

我知道我可以使用execl("/bin/sh", "-c", some_string, 0)之类的系统调用来使用特定的外壳程序/解释程序来解释外壳程序代码的“片段”。但就我而言,我在内存中有一个任意字符串,它代表一些需要运行的完整脚本。也就是说,此字符串/内存缓冲区的内容可能是:

#! /bin/bash

echo "Hello"

或者它们可能是:

#! /usr/bin/env python

print "Hello from Python"

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

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

似乎所有我发现的系统调用都期望到现有可执行文件的 path ,而不是某种低级别的文件,它本身需要一个可执行文件。我不想自己解析shebang或其他任何内容。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

  

我的问题是:有什么方法可以让系统启动   直接从我给它的内存缓冲区中进行子处理,无需编写   它到一个临时文件?或者至少是一种将字符串赋予   shell并将其路由到适当的解释器?

     

看来,我找到的所有系统调用都期望有一条通往   现有的可执行文件,而不是低级的可执行文件   可执行文件本身。我不想解析shebang或其他任何东西   我自己。

简单答案:否。

详细答案:

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

exec-family函数都希望从文件中加载过程映像 。此外,一旦成功,它们就会用新映像替换调用它们的过程的内容,包括分配给它的所有内存。

通常,几乎所有现代操作系统都强制执行进程隔离,而进程隔离的中心支柱之一是,没有进程可以访问另一个人的内存。