Skip to main content
 首页 » 编程设计

python之查找二进制文件的版本

2025年05月04日12zengkefu

有谁知道如何找到传递给我的函数的二进制文件的版本?

我从 this page 得到以下代码:

def version(fpath): 
    f = open(fpath, 'rb') 
 
    s = f.read(1024) 
    print s 
 
    f.close() 

但是,这并没有给我任何类似于上述网站显示的有用输出。

编辑:@BoazYaniv 告诉我文件格式在这个问题中起着重要作用。这是一个windows EXE文件

请您参考如下方法:

你有一个现成的用于解析 EXE 文件的模块: http://code.google.com/p/pefile/

您可以使用以下代码阅读它:

import pefile 
 
pe = pefile.PE(r'C:\Windows\notepad.exe') 
FileVersion    = pe.FileInfo[0].StringTable[0].entries['FileVersion'] 
ProductVersion = pe.FileInfo[0].StringTable[0].entries['ProductVersion'] 

如您所见,Windows EXE(和 DLL)文件存储两种不同的版本,FileVersion 和 ProductVersion。很多时候它们是相同的,但有时它们可​​能不同 - 这完全取决于真正制作 EXE 的人。

编辑:

让事情变得更复杂的是,PE 字符串表中的这两个字符串并不是 Windows 编译器可以保存版本的唯一位置。 EXE 中存储了两个附加的 FileVersion 和 ProductVersion 值,只是它们以 32 位整数对的形式存储,每个整数又被分解为两个 16 位整数(Windows API 中的 WORD)。总之,每个版本值(FileVersion 和 ProductVersion)都有 4 个 16 位 WORD,代表版本的点分隔部分。您也可以使用 pefile 获取它们:

pe = pefile.PE(r'C:\Windows\notepad.exe') 
FileVersionLS    = pe.VS_FIXEDFILEINFO.FileVersionLS 
FileVersionMS    = pe.VS_FIXEDFILEINFO.FileVersionMS 
ProductVersionLS = pe.VS_FIXEDFILEINFO.ProductVersionLS 
ProductVersionMS = pe.VS_FIXEDFILEINFO.ProductVersionMS 
 
FileVersion = (FileVersionMS >> 16, FileVersionMS & 0xFFFF, FileVersionLS >> 16, FileVersionLS & 0xFFFF) 
ProductVersion = (ProductVersionMS >> 16, ProductVersionMS & 0xFFFF, ProductVersionLS >> 16, ProductVersionLS & 0xFFFF) 
 
print 'File version:    %s.%s.%s.%s' % FileVersion  
print 'Product version: %s.%s.%s.%s' % ProductVersion 

但是等等!这还不是全部:您至少还有一个地方可以找到版本:在另一个称为 OPTIONAL_HEADER 的结构中,您可以找到另外两个值,称为 MajorImageVersion 和 MinorImageVersion。它们代表整个版本的前两个部分,因此一个文件的 ProductVersion 或 FileVersion 为 6.1.7600.150,通常 MajorImageVersion 为 6,MinorImageVersion 为 1。您可以使用 pe 获取它们.OPTIONAL_HEADER.MajorImageVersion 和 pe.OPTIONAL_HEADER.MinorImageVersion。

所有这些值(5 个不同的值,如果我算对的话)通常是等效的(如果您忽略字符串表中的那些有时具有的额外的自由格式字符串值),但是很常见的是看到 FileVersions 和 ProductVersions 是不一样,你也应该为其他惊喜做好准备。