目录
1 前言
最近打算写个python脚本,获取exe文件的数字签名时间戳。
但在网上搜索了许久,基本不是无关信息,就是无法正常运行。搜索大半天,终于发现了 signify 第三方库,特以记录。
(“非主流”的东西,搜索真的费劲……)
2 环境准备
安装 signify 第三方库(需要Python 3.8+):
pip install signify
3 demo代码
from signify.authenticode.signed_pe import SignedPEFile
def get_peFile_digital_signature_times(filename: str):
"""获取pe文件数字签名的时间戳
Args:
filename: str 文件路径
Returns:
list 文件的数字签名时间戳列表
"""
with open(filename, "rb") as f:
pe_file = SignedPEFile(f)
sigs = list(pe_file.signed_datas)
return [sig.signer_infos[0].countersigner.signing_time for sig in sigs]
if __name__ == '__main__':
# 下面的exe路径,需要替换成自己的文件路径
exe_filename = r"D:\\Downloads\SafariSetup.exe"
for s in get_peFile_digital_signature_times(exe_filename):
print(s)
运行效果:
更进一步:获取数字签名基本信息列表(签名者名称,签名算法,签名时间戳)
from signify.authenticode.signed_pe import SignedPEFile
def get_peFile_digital_signature_times(filename: str):
"""获取pe文件数字签名的时间戳
Args:
filename: str 文件路径
Returns:
list 文件的数字签名基本信息列表(签名者名称,签名算法,签名时间戳)
"""
with open(filename, "rb") as f:
pe_file = SignedPEFile(f)
sigs = list(pe_file.signed_datas)
return [[sig.certificates[-1].subject.rdns[0][1],
sig.signer_infos[0].digest_algorithm().name,
str(sig.signer_infos[0].countersigner.signing_time)] for sig in sigs]
if __name__ == '__main__':
# 下面的exe路径,需要替换成自己的文件路径
exe_filename = r"D:\\Downloads\SafariSetup.exe"
for s in get_peFile_digital_signature_times(exe_filename):
print(s)
运行效果:
与【属性】中的【数字签名】展示的基本信息一致:
4 更多的其他参考
signify库还可以获取 PE类型文件 更多详细的数字签名信息内容,可以查看源码或下面链接,自行探索:
signify库的PyPI链接:signify · PyPIModule to generate and verify PE signatures
https://pypi.org/project/signify
signify库的GitHub链接:
其他博客的教程: