查找二进制文件的版本

2024-01-26

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

我从以下代码中得到了这一页 http://www.linuxquestions.org/questions/programming-9/reading-binary-file-in-python-804296/:

def version(fpath):
    f = open(fpath, 'rb')

    s = f.read(1024)
    print s

    f.close()

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

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


您有一个用于解析 EXE 文件的现成模块:http://code.google.com/p/pefile/ 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 的人。

Edit:

让事情变得更复杂的是,PE 字符串表中的这两个字符串并不是 Windows 编译器保存版本的唯一位置。 EXE 中还存储了两个附加的 FileVersion 和 ProductVersion 值,只不过它们存储为 32 位整数对,每个值又依次分解为两个 16 位整数(Windows API 中的 WORD)。总之,每个版本值(FileVersion 和 ProductVersion)都有 4 个 16 位字,表示版本的点分隔部分。您也可以使用 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 and pe.OPTIONAL_HEADER.MinorImageVersion.

所有这些值(5 个不同的值,如果我数正确的话)通常是等效的(如果您忽略字符串表中的值有时具有的额外自由格式字符串值),但看到 FileVersions 和 ProductVersions 不相同的情况很常见,并且您还应该准备好迎接其他惊喜。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找二进制文件的版本 的相关文章

随机推荐