【发布时间】:2016-02-19 19:36:34
【问题描述】:
我在缓冲区中有一个可执行文件,我想在不将其写入文件的情况下执行它。这可能吗?我的代码示例:
with open("somefile.exe", "rb") as exe_file:
executable_string = exe_file.read()
run(executable_string)
def run(executable_string):
<code to make it run>
【问题讨论】:
-
我不认为这实际上可以通过 python 实现......也许可以制作一个临时文件?
-
这将需要使用 ctypes 或自定义扩展模块来调用未记录的系统服务,例如
NtCreateProcess、NtCreateThread、NtQueryInformationProcess、NtAllocateVirtualMemory、NtWriteVirtualMemory和NtDuplicateObject命令创建进程和线程并设置进程参数和堆栈。我无法想象你为什么要经历所有这些而不是简单地创建一个临时文件。请注意,该文件可以指定FILE_ATTRIBUTE_TEMPORARY以让缓存管理器在内存充足的情况下避免将数据写入磁盘。 -
在 Windows 上,您可以创建 Python RAM disk 并将文件复制到其中。其他操作系统似乎也有类似的模块。
-
@eryksun:为了执行任意可执行文件,操作系统必须能够从存储设备中读取它——在 Windows 中设置这样的内存回传设备是相当复杂的 AFAIK。至少按照我的建议,这一切都是通过记录的(和支持的)系统接口完成的,而不是像你建议的那样调用一堆未记录的系统服务。还不清楚为什么 OP 要将可执行文件中已经存在的内容复制到内存中然后从那里执行,而不是让操作系统将文件读入内存并像往常一样执行它。
-
@martineau 我的伪代码对解释我的动机没有多大帮助,抱歉。我希望能够做到这一点,因为我正在从一个单独的进程接收作为 base64 编码字符串的可执行文件,我想知道是否有一种简单的方法可以在解码后处理它而不将其写入磁盘上的文件无论如何都会被删除。 Tempfile 似乎可以解决我的问题。感谢大家的回复。
标签: python windows memory executable portable-executable