有谁知道如何找到传递给我的函数的二进制文件的版本?
我从 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 是不一样,你也应该为其他惊喜做好准备。
