代码之家  ›  专栏  ›  技术社区  ›  natevw

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

  •  1
  • natevw  · 技术社区  · 6 年前

    我知道我可以像 execl("/bin/sh", "-c", some_string, 0) 使用特定的shell/解释器解释shell代码的“片段”。但在我的例子中,内存中有一个任意字符串,表示需要运行的某个完整脚本。也就是说,这个字符串/内存缓冲区的内容可以是:

    #! /bin/bash
    
    echo "Hello"
    

    #! /usr/bin/env python
    
    print "Hello from Python"
    

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

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

    我发现所有的系统调用 路径 要分析 shebang 或者我自己。

    2 回复  |  直到 6 年前
        1
  •  1
  •   John Bollinger    6 年前

    我的问题是:有没有办法让系统启动 是临时文件吗?或者至少,一种将字符串 shell并让它将其路由到适当的解释器?

    似乎我找到的所有系统调用都希望 现有的可执行文件,而不是需要 可执行文件本身。我不想解析shebang之类的东西 我自己。

    简单的回答是:不。

    详细答案:

    execl the exec -family functions 这个 一个用户空间程序导致另一个程序运行的方式。其他接口,如 system() popen() 在这些基础上实现。

    exec系列函数都希望加载进程映像 . 此外,在成功时,它们用新图像替换调用它们的进程的内容,包括分配给它的所有内存。

    更普遍地说,基本上所有的现代操作系统都强制执行进程隔离,进程隔离的中心支柱之一是任何进程都不能访问另一个进程的内存。

        2
  •  2
  •   Barmar    6 年前

    您尚未指定操作系统,但从 #!

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