【问题标题】:Checking if an executable is 32-bit or 64-bit with a python3 script on Windows/Linux在 Windows/Linux 上使用 python3 脚本检查可执行文件是 32 位还是 64 位
【发布时间】:2020-09-11 22:06:51
【问题描述】:

我正在用 Python3 编写软件(更具体地说:Python 3.8.1)。在某些时候,软件需要检查某个任意可执行文件是 64 位还是 32 位。经过一番研究,我发现了以下帖子:

Checking if an exe is 32 bit or 64 bit

在这篇文章中,提供了以下解决方案:

subprocess.call(['dumpbin', '/HEADERS', 'test2.exe', '|', 'find', '"machine"'])

很遗憾,这在Python 3.8.1 中不起作用。那篇帖子已经有将近 8 年的历史了,可以追溯到 Python 2.x 时代。

如何在 Python 3.x 中测试 64 位?我需要适用于 Linux 和 Windows 10 的解决方案。

编辑:
Windows 相关说明:
显然DumpBin 解决方案(请参阅Checking if an exe is 32 bit or 64 bit 帖子)需要安装 Visual Studio。这对我来说是禁忌。我的 Python3 软件应该可以在任何 Windows 10 计算机上运行。

Linux 相关说明:
在 Linux 上,我不需要测试 PE 格式的可执行文件。只需 Linux 可执行文件即可。

【问题讨论】:

  • DumpBin 是 Visual Studio 的东西,来自内存。这意味着它不会在所有 Windows 安装中普遍可用,当然在 Linux 下也不可用。
  • 在 Linux 的解决方案中,您是否还要检查 PE 格式的程序(即 windows 二进制文件)?或者你想测试 linux 二进制文件的 64 位吗?
  • @paxdiablo => 感谢您提供的信息。我不知道这个。是否有一些解决方案只使用 Windows 上普遍可用的东西? L3viathan => 在 Linux 上我只需要测试 linux 二进制文件。

标签: python python-3.x exe 32bit-64bit


【解决方案1】:

检测 ELF 二进制文件(即 Linux)的 64 位很容易,因为它始终位于标头中的同一位置:

def is_64bit_elf(filename):
    with open(filename, "rb") as f:
        return f.read(5)[-1] == 2

我没有 Windows 系统,所以我无法对此进行测试,但这可能适用于 Windows:

def is_64bit_pe(filename):
    import win32file
    return win32file.GetBinaryType(filename) == 6

【讨论】:

  • 太棒了!这从第一次尝试就起作用了!我测试了大约 6 个我知道位数的可执行文件,结果都很完美。非常感谢!
  • 您可能还想检查它们是否也是可执行文件。根据记忆,Linux 领域的前三个字符应该是ELF,Windows 世界的前两个应该是MZ
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2010-10-10
相关资源
最近更新 更多