【问题标题】:Execute .exe file embedded in Python script执行嵌入在 Python 脚本中的 .exe 文件
【发布时间】:2021-12-14 18:37:40
【问题描述】:

如何将存储为 base64 编码字符串的 exe 文件加载到内存中并在不写入磁盘的情况下执行它?

重点是,放置某种控制/密码/串行系统并使用 py2exe 编译它。然后我可以随时在我的代码中执行该嵌入文件。

【问题讨论】:

  • Windows 我猜?为什么不在 python 中实现二进制片的诞生?
  • tMC:这是一个闪存可执行文件。
  • 为什么要避免将其写入磁盘?
  • abarnert:因为我不希望人们在不通过我的控制的情况下复制它,如果我将它写入磁盘,他们所要做的就是执行创建的文件或复制它。我太容易了。
  • @leferreyra:大多数用户会被只是将文件隐藏在临时目录中而被愚弄。而那些不会……好吧,任何读过基本破解教程的人都会知道如何在内存中抓取图像并将其保存到磁盘和/或只是从源代码中对其进行 b64 解码,所以充其量是添加一些分钟到他们破解您的软件所需的时间。这是否值得您花费数小时的工作(并且很可能是您的合法用户的错误)?

标签: python process binary exe


【解决方案1】:

Python 用于执行子进程的所有机制都需要一个文件名。

Win32 API 中的底层CreateProcess 函数也是如此,所以甚至没有简单的方法通过降到该级别来解决它。

一种方法可以通过下拉到ZwCreateProcess/NtCreateProcess 来做到这一点。如果您知道如何使用低级 NT API,那么您只需了解this post 即可。如果您不这样做……在 SO 答案中解释太多了。

当然,您也可以创建或使用 RAM 驱动器,甚至模拟一个虚拟文件系统,但为了避免创建文件,这样做有点愚蠢。

所以,正确的答案是将exe写入文件,然后执行。例如,像这样:

fd, path = tempfile.mkstemp(suffix='.exe')
code = base64.b64decode(encoded_code)
os.write(fd, code)
os.fchmod(fd, 0o711)
os.close(fd)
try:
    result = subprocess.call(path)
finally:
    os.remove(path)

这应该适用于 Windows 和 *nix,但它完全未经测试,并且可能在至少一个平台上存在错误。

显然,如果你想多次执行它,在你完成之前不要remove它。或者只是使用一些适当的持久目录,并且仅在它丢失或过期时才写入。

【讨论】:

  • 好的,所以似乎没有简单的方法可以做到这一点,我不想太深入Windows API,所以。我想我只需要把它写在一个不起眼的临时文件中。
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 2011-06-06
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多