簡體   English   中英

如何從內存中運行任意腳本或可執行文件?

[英]How to run an arbitrary script or executable from memory?

我知道我可以使用像execl("/bin/sh", "-c", some_string, 0)這樣的系統調用來解釋使用特定shell /解釋器的shell代碼的“片段”。 但在我的情況下,我在內存中有一個任意字符串,代表一些需要運行的完整腳本。 也就是說,此字符串/內存緩沖區的內容可能是:

#! /bin/bash

echo "Hello"

或者他們可能是:

#! /usr/bin/env python

print "Hello from Python"

我認為理論上字符串/緩沖區甚至可以包含有效的二進制可執行文件,盡管這不是特定的優先級。

我的問題是:有沒有辦法讓系統直接從我給它的內存緩沖區啟動子進程,而不將其寫入臨時文件? 或者至少,一種方法將字符串賦予shell並讓它將其路由到正確的解釋器?

似乎我發現的所有系統調用都希望有一條通往現有可執行文件的路徑 ,而不是一個需要可執行文件的低級別。 不想解析家當或任何自己。

你沒有指定操作系統,但是從#! 特定於Unix,我認為這就是你所說的。

據我所知,沒有系統調用會從內存塊而不是文件加載程序。 加載程序的最低級系統調用是execve()函數,它需要加載文件的路徑名。

我的問題是:有沒有辦法讓系統直接從我給它的內存緩沖區啟動子進程,而不將其寫入臨時文件? 或者至少,一種方法將字符串賦予shell並讓它將其路由到正確的解釋器?

似乎我發現的所有系統調用都希望有一條通往現有可執行文件的路徑,而不是一個需要可執行文件的低級別。 我不想自己解析shebang或任何東西。

簡單回答:沒有。

詳細解答:

execl和shebang約定是POSIXisms,所以這個答案將集中在POSIX系統上。 無論您是要執行的程序是利用家當公約或二進制可執行的腳本, exec -家庭功能是一個用戶空間程序,以使不同的程序運行方式。 其他接口,例如system()popen()都是在這些接口之上實現的。

exec-family函數都希望從文件加載過程映像。 此外,在成功時,他們用新圖像替換調用它們的過程的內容,包括分配給它的所有內存。

更一般地說,基本上所有現代操作系統都強制執行進程隔離,而進程隔離的核心之一是沒有進程可以訪問另一個進程的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM