你是一个python程序员,你需要用python写一个完整代码,可以提取一个.exe文件的metadata,包括软件的版本号、作者、开源协议、发布日期等信息到文本文件
时间: 2024-04-29 19:25:25 浏览: 138
下面是一个Python程序,可以提取一个.exe文件的metadata,并将其保存到文本文件中:
```python
import os
import sys
import argparse
import datetime
import pefile
def get_metadata(exe_file, output_file):
pe = pefile.PE(exe_file)
metadata = {
"File name": os.path.basename(exe_file),
"File size": os.path.getsize(exe_file),
"File type": "Executable",
"File format": "Portable Executable",
"File created": datetime.datetime.fromtimestamp(os.path.getctime(exe_file)).strftime('%Y-%m-%d %H:%M:%S'),
"File modified": datetime.datetime.fromtimestamp(os.path.getmtime(exe_file)).strftime('%Y-%m-%d %H:%M:%S'),
"Product name": pe.FileInfo[0].StringTable[0].entries["ProductName"],
"Product version": pe.FileInfo[0].StringTable[0].entries["ProductVersion"],
"File description": pe.FileInfo[0].StringTable[0].entries["FileDescription"],
"Company name": pe.FileInfo[0].StringTable[0].entries["CompanyName"],
"Author": pe.FileInfo[0].StringTable[0].entries["Author"],
"Legal copyright": pe.FileInfo[0].StringTable[0].entries["LegalCopyright"],
"Open source license": "Unknown",
}
if hasattr(pe, 'VS_FIXEDFILEINFO'):
metadata["File version"] = '.'.join(map(str, pe.VS_FIXEDFILEINFO.FileVersion[:-1]))
else:
metadata["File version"] = "Unknown"
for entry in pe.FileInfo:
if entry.Key == b'StringFileInfo':
for st_entry in entry.StringTable:
if "Legal" in st_entry.entries:
metadata["Open source license"] = st_entry.entries["Legal"]
with open(output_file, "w") as f:
for key, value in metadata.items():
f.write(f"{key}: {value}\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Extract metadata from an .exe file")
parser.add_argument("exe_file", help=".exe file to extract metadata from")
parser.add_argument("output_file", help="output file to write metadata to")
args = parser.parse_args()
get_metadata(args.exe_file, args.output_file)
```
这个程序使用了 `argparse` 模块来处理命令行参数,可以通过输入指令 `python metadata_extractor.py <exe_file> <output_file>` 来运行程序,其中 `<exe_file>` 是要提取metadata的.exe文件, `<output_file>` 是保存metadata的文本文件。程序使用了 `pefile` 模块来解析PE文件,并提取了一些常见的metadata,包括文件名、文件大小、文件类型、文件格式、创建时间、修改时间、产品名称、产品版本、文件描述、公司名称、作者、版权信息、开源协议等。如果.exe文件包含了VS_FIXEDFILEINFO结构,则会提取版本号信息。如果文件包含了字符串文件信息表,则会尝试提取开源协议信息。最后,程序将metadata保存到指定的文本文件中。
阅读全文