【摘要】 签名信息中有许多有用的信息,可以帮助安全检测二进制软件。读者可以从这个博客中了解到pe如何组织和使用文件中的签名信息?python代码从pe获取嵌入式签名信息等知识。
什么是pe文件签名信息:
以windows系统中NDIS.sys以驱动程序为例,如果文件右键属性窗口中包含数字签名属性页面,则表示pe签名信息嵌入文件,如下图所示:
双击签名列表时,可查看数字签名信息的细节,如下图所示:
包含在细节中签名者信息以及签名时间戳在查看高级属性页面时,可以看到更丰富的签名信息,如下图所示:
其中包括与密码学问题相关的信息,如摘要算法、摘要加密算法等。
点击查看证书时,可查看证书详情,如下图所示:
由此可见重要信息。
点击查看证书时,可查看证书详情,如下图所示:
由此可见重要信息
利用peview.exe工具来查看Ndis.sys在驱动程序中看到签名信息存在IMAGE_NT_HEADER结构里面,如下图所示:
分析签名结构后,可以在文件中获得签名信息偏移地址和数据长度
信息,
python代码如下:security_entry = pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]sig_off = pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[security_entry].VirtualAddresssig_len = pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[security_entry].Size
with open(file_path, 'rb') as fh: fh.seek(sig_off) sig_raw_data = fh.read(sig_len)# 签名数据的结构如下:# DWORD dwLength 签名证书数据长度# WORD wRevision 签名证书版本号# WORD wCertificateType 签名证类型# BYTE bCertificate[dwLength]签名证书数据# 签名证书版本号# Version 1 is the legacy version of WIN_CERTIFICATE.WIN_CERT_REVISION_1_0 = 0x0100# Version 2 is the current version of WIN_CERTIFICATE.WIN_CERT_REVISION_2_0 = 0x0200# 签名证类型# X.509 CertificateWIN_CERT_TYPE_X509 = 0x0001# PKCS SignedData structureWIN_CERT_TYPE_PKCS_SIGNED_DATA = 0x0002# ReservedWIN_CERT_TYPE_RESERVED_1 = 0x0003# Terminal Server Protocol Stack Certificate signingWIN_CERT_TYPE_TS_STACK_SIGNED = 0x0004
使用ASN.1 Editor工具可查看签名证数据,如下图所示:Python中可以利用
asn1crypto组件解决签名证书析,python样例代码如下:info = cms.ContentInfo.load(seq_data)signed_data = info['content']cert_set = signed_data["certificates"cert_set您可以获取所有证书的详细信息for cert in cert_set:cert_data = cert.dump()cert = x509.Certificate.load(cert_data)#解析cert通过以通过搜索获取证书细节#id-ct-TSTInfo content type 1.2.840.113549.1.9.16.1.4.获取签名时间信息encap_content_info = signed_data['encap_content_info']# id-ct-TSTInfo content typetst_info = tsp.TSTInfo.load(encap_content_info['content'].parsed.dump())signing_time = tst_info['gen_time'].native.astimezone().strftime('%Y-%m-%d %H:%M:%S';)此外,非签名数据属性包含在签名数据中,python样例代码如下:signer_info = cms.SignerInfo.load(obj.contents)attrs = signer_info['unsigned_attrs']
需要注意的是,获取签名时间戳等信息的方法不同,常见属性有:
counter_signature
、microsoft_nested_signature、
microsoft_time_stamp_token这些属性中嵌套有其他签名证书结构数据
通过对这些层层数据结构的分析,可以获得证书的所有详细信息,如下图所示【总结】利用python分析方便pe文件中的签名信息,以验证软件的签名信息是否符合相关安全规范的要求,实现安全检测。电脑知识