python通过PE文件获取版本信息
时间: 2023-10-07 11:05:20 浏览: 183
可以使用Python内置的`ctypes`模块来读取PE文件的版本信息。
以下是一个示例代码:
```python
import ctypes
class VS_FIXEDFILEINFO(ctypes.Structure):
_fields_ = [
("dwSignature", ctypes.c_uint32),
("dwStrucVersion", ctypes.c_uint32),
("dwFileVersionMS", ctypes.c_uint32),
("dwFileVersionLS", ctypes.c_uint32),
("dwProductVersionMS", ctypes.c_uint32),
("dwProductVersionLS", ctypes.c_uint32),
("dwFileFlagsMask", ctypes.c_uint32),
("dwFileFlags", ctypes.c_uint32),
("dwFileOS", ctypes.c_uint32),
("dwFileType", ctypes.c_uint32),
("dwFileSubtype", ctypes.c_uint32),
("dwFileDateMS", ctypes.c_uint32),
("dwFileDateLS", ctypes.c_uint32),
]
def get_file_version(filename):
"""
获取PE文件的版本信息
"""
try:
# 打开文件
with open(filename, "rb") as f:
# 读取文件头
data = f.read(0x40)
# 获取PE文件的偏移量
pe_offset = data.find(b"PE\0\0") + 4
# 获取文件头
file_header = data[pe_offset+4:pe_offset+24]
# 获取Optional Header的大小
optional_header_size = data[pe_offset+20] + data[pe_offset+21]*256
# 获取Optional Header
optional_header = data[pe_offset+24:pe_offset+24+optional_header_size]
# 获取Version Info的偏移量
version_info_offset = optional_header.find(b"\0\0\0\0\0\0\0\0\xFF\xFF\x00\x00")
# 获取Version Info的大小
version_info_size = optional_header[version_info_offset+12] + optional_header[version_info_offset+13]*256
# 获取Version Info
version_info = data[pe_offset+24+optional_header_size+version_info_offset:pe_offset+24+optional_header_size+version_info_offset+version_info_size]
# 获取FixedFileInfo结构体
fixed_file_info = VS_FIXEDFILEINFO.from_buffer_copy(version_info[0x28:])
# 获取版本号
major_version = fixed_file_info.dwFileVersionMS >> 16
minor_version = fixed_file_info.dwFileVersionMS & 0xFFFF
build_number = fixed_file_info.dwFileVersionLS >> 16
revision_number = fixed_file_info.dwFileVersionLS & 0xFFFF
version = f"{major_version}.{minor_version}.{build_number}.{revision_number}"
return version
except:
return None
```
这个函数接受一个PE文件的路径作为输入,返回该文件的版本号,如果无法读取版本号则返回`None`。
以下是一个示例用法:
```python
filename = "C:\\Windows\\notepad.exe"
version = get_file_version(filename)
print(f"{filename}: {version}")
```
输出:
```
C:\Windows\notepad.exe: 10.0.19041.1
```
阅读全文