什么是pe文件的簽名信息:
以windows系統(tǒng)中NDIS.sys驅(qū)動(dòng)程序?yàn)槔谠撐募挠益I屬性窗口中,若包含數(shù)字簽名屬性頁(yè),則表示該pe文件內(nèi)嵌有簽名信息,如下圖所示:
當(dāng)雙擊簽名列表時(shí),可以查看數(shù)字簽名信息詳情,如下圖所示:
在詳情中包含了__簽名者信息__以及__簽名時(shí)間戳__等重要的信息,同時(shí)查看高級(jí)屬性頁(yè)時(shí),可以看到更加豐富的簽名信息,如下圖所示:
其中包括__摘要算法、摘要加密算法等重要的密碼學(xué)問(wèn)題相關(guān)的信息__。
同時(shí)點(diǎn)擊查看證書時(shí),可以查看到證書詳情信息,如下圖所示:
從中可以看到__頒發(fā)者、證書有效期、公鑰長(zhǎng)度等重要信息__。安全工具可以通過(guò)分析以上這些重要信息來(lái)判斷是否存在安全風(fēng)險(xiǎn)。比如是否使用了不安全密碼學(xué)算法、密鑰長(zhǎng)度是否滿足安全規(guī)范、證書有效期是否有效等等。
pe文件如何保存這些簽名信息數(shù)據(jù)的:
利用peview.exe工具來(lái)查看Ndis.sys驅(qū)動(dòng)程序,可以看到簽名信息存在于__IMAGE_NT_HEADER結(jié)構(gòu)__里面,如下圖所示:
該簽名結(jié)構(gòu)解析后可以得到簽名信息在文件中的__偏移地址和數(shù)據(jù)長(zhǎng)度__信息, python代碼如下 :
security_entry = pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
sig_off = pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[security_entry].VirtualAddress
sig_len = pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[security_entry].Size
根據(jù)偏移地址和數(shù)據(jù)長(zhǎng)度獲取簽名數(shù)據(jù),python代碼如下:
with open(file_path, 'rb') as fh:
fh.seek(sig_off)
sig_raw_data = fh.read(sig_len)
# 簽名數(shù)據(jù)的結(jié)構(gòu)如下:
# DWORD dwLength 簽名證書數(shù)據(jù)長(zhǎng)度
# WORD wRevision 簽名證書的版本號(hào)
# WORD wCertificateType 簽名證書類型
# BYTE bCertificate[dwLength] 簽名證書數(shù)據(jù)
# 簽名證書的版本號(hào)
# 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工具可以查看簽名證書數(shù)據(jù),如下圖所示:
Python中可以利用__asn1crypto組件來(lái)實(shí)現(xiàn)對(duì)簽名證書的解__析,python樣例代碼如下:
info = cms.ContentInfo.load(seq_data)
signed_data = info['content']
cert_set = signed_data["certificates"]
#通過(guò)遍歷cert_set可以獲取所有證書詳情信息for cert in cert_set:
cert_data = cert.dump()
cert = x509.Certificate.load(cert_data)
#解析cert就可以獲取證書詳情信息
#通過(guò)查找id-ct-TSTInfo content type 1.2.840.113549.1.9.16.1.4來(lái)獲取簽名時(shí)間信息
encap_content_info = signed_data['encap_content_info']
# id-ct-TSTInfo content type
tst_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')
另外在簽名數(shù)據(jù)中包含有非簽名的數(shù)據(jù)屬性,python樣例代碼如下:
signer_info = cms.SignerInfo.load(obj.contents)
attrs = signer_info['unsigned_attrs']
需要注意的是不同的簽名屬性,獲取簽名時(shí)間戳等信息的方法是不同的,常見的屬性有:
counter_signature 、 microsoft_nested_signature 、microsoft_time_stamp_token
這些屬性中嵌套有另外的簽名證書結(jié)構(gòu)數(shù)據(jù)
通過(guò)這些層層數(shù)據(jù)結(jié)構(gòu)的解析就可以獲取到所有的證書詳情信息,如下圖所示
審核編輯:湯梓紅
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3551瀏覽量
88916 -
PE文件
+關(guān)注
關(guān)注
0文章
4瀏覽量
5457 -
信息檢測(cè)
+關(guān)注
關(guān)注
0文章
4瀏覽量
5835
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論