|
|
枚举 PE 文件中的数字证书的颁发者名称
- ;此封装函数用于枚举目标 PE 文件中的数字证书的颁发者名称
- ;第一个参数为目标文件(此参数路径支持 Win32 文件命名空间), 第二个参数用于接收返回信息(证书颁发者名称列表)
- _SUB EnumPEFileCertIssuer
- TEAM ENVI$ &NL=0d 0a| ENVI &PEFile=%~1| ENVI &CertIssuerList=
- ENVI-ptr &phCertStore=0
- CALL $--qd --bool --ret:&ret Crypt32.dll,CryptQueryObject,#1,$%&PEFile%,#0x400,#2,#0,#0,#0,#0,*&phCertStore,#0,#0
- IFEX #%&ret%=0,!
- {
- ENVI?ptr &phCertStore=&hCertStore
- IFEX #%&hCertStore%>0,
- {
- ENVI &CERT_CONTEXT=0
- LOOP #1=1,
- {
- CALL $--qd --ret:&CERT_CONTEXT Crypt32.dll,CertEnumCertificatesInStore,#%&hCertStore%,#%&CERT_CONTEXT%
- IFEX #%&CERT_CONTEXT%=0,EXIT LOOP!
- {
- ENVI$ &NameString=*208 0
- CALL $--qd --ret:&ret Crypt32.dll,CertGetNameStringW,#%&CERT_CONTEXT%,#4,#1,#0,*&NameString,#208
- IFEX #%&ret%>0,ENVI &CertIssuerList=%&CertIssuerList%%&NameString%%&NL%
- }
- }
- }
- CALL $--qd --bool Crypt32.dll,CertCloseStore,#%&hCertStore%,#0
- }
- ENVI-ret %~2=%&CertIssuerList%
- _END
- ;示例
- EnumPEFileCertIssuer "\\?\HarddiskVolume1\EFI\Microsoft\Boot\bootmgfw.efi" &CertList
- MESS %&CertList%@Certificates Issuer#OK
复制代码 枚举 EFI 变量中的证书的使用者名称
- ;此封装函数用于枚举 EFI 固件中的 db, dbx, PK, KEK 变量中的证书的使用者名称
- ;第一个参数为 EFI 变量名(db, dbx, db, dbx, PK, KEK), 变量名是区分大小写的;
- ;第二个参数为 EFI 变量名对应的 GUID 字符串, GUID 字符串字符不区分大小写
- ;db & dbx => {d719b2cb-3d3a-4596-a3bc-dad00e67656f}; PK & KEK => {8be4df61-93ca-11d2-aa0d-00e098032b8c}
- ;第三个参数用于接收返回信息(证书使用者名称列表)
- _SUB EnumEFIVariableCertName
- TEAM ENVI$ &NL=0d 0a| ENVI &VariableName=%~1| ENVI &GUID=%~2| ENVI &CertNameList=
- ENVI ?&Buffer=FVAR,%&VariableName%;%&GUID%
- ;ENVI$# &tmp=*1 0
- ;CALL $--qd ntdll.dll,RtlAdjustPrivilege,#22,#1,#0,*&tmp
- ;ENVI$# &Buffer=*4194304 0
- ;CALL $--qd Kernel32.dll,GetFirmwareEnvironmentVariableW,$%&VariableName%,$%&GUID%,*&Buffer,#4194304
- ENVI-addr &BufAddr;&BufLen=&Buffer
- IFEX [ #%&BufAddr% > 0 & #%&BufLen% > 0 ],
- {
- LOOP #%&BufLen%>0,
- {
- ENVI?int %&BufAddr%=&SignatureListSize:16
- ENVI?int %&BufAddr%=&SignatureHeaderSize:20
- ENVI?int %&BufAddr%=&SignatureSize:24
- IFEX #%&SignatureListSize%=0,EXIT LOOP
- CALC #&SignatureDataAddr = %&BufAddr% + 28 + %&SignatureHeaderSize% + 16
- CALC #&SignatureDataSize = %&SignatureSize% - 16
- CALL $--qd --ret:&CERT_CONTEXT Crypt32.dll,CertCreateCertificateContext,#0x10001,#%&SignatureDataAddr%,#%&SignatureDataSize%
- IFEX #%&CERT_CONTEXT%>0,
- {
- ENVI$ &NameString=*208 0
- CALL $--qd --ret:&ret Crypt32.dll,CertGetNameStringW,#%&CERT_CONTEXT%,#4,#0,#0,*&NameString,#208
- IFEX #%&ret%>0,ENVI &CertNameList=%&CertNameList%%&NameString%%&NL%
- CALL $--qd --bool Crypt32.dll,CertFreeCertificateContext,#%&CERT_CONTEXT%
- }
- CALC #&BufAddr = %&BufAddr% + %&SignatureListSize%
- CALC #&BufLen = %BufLen% - %&SignatureListSize%
- }
- }
- ;CALL $--qd ntdll.dll,RtlAdjustPrivilege,#22,#0,#0,*&tmp
- ENVI-ret %~3=%&CertNameList%
- _END
- ;示例
- CALL EnumEFIVariableCertName db {d719b2cb-3d3a-4596-a3bc-dad00e67656f} &CertList
- MESS %&CertList%@Signature Database (db)#OK
复制代码 从 EFI 变量中的证书中提取其使用者名称部分参考了 527104427 老大在隔壁群提供的开源代码;
PS: 527104427 老大的源代码所返回的信息非常详细, 如果你需要更详细的信息, 建议使用他的源代码
|
|