如何用PowerShell判断.cat文件是Attestation签名还是WHQL签名
区分Authenticode签名中的WHQL与Attestation签名(无需枚举颁发者)
要区分WHQL签名和Attestation签名,无需枚举所有可能的颁发者名称,可通过检查签名证书的增强密钥用法(EKU)或证书策略中的固定OID来实现——这两类签名的证书会携带微软定义的专属标识OID,比依赖颁发者名称更可靠。
核心原理
- WHQL签名:微软对通过硬件兼容性测试的驱动颁发的签名,证书包含特定的EKU或策略OID(如
1.3.6.1.4.1.311.10.3.5或1.3.6.1.4.1.311.21.20)。 - Attestation签名:硬件厂商完成自测后提交微软签名的证书,不会包含上述WHQL专属OID。
实现代码
$catalogFilePath = "C:\path\to\your\driver.cat" $signature = Get-AuthenticodeSignature -FilePath $catalogFilePath # 先检查签名有效性 if ($signature.Status -ne 'Valid') { Write-Host "文件签名无效或未签名" return } # 定义WHQL专属的OID $whqlEkuOid = "1.3.6.1.4.1.311.10.3.5" # Windows Hardware Driver Verification $whqlPolicyOid = "1.3.6.1.4.1.311.21.20" # Windows Hardware Compatibility Policy # 检查增强密钥用法(EKU)扩展 $ekuExt = $signature.SignerCertificate.Extensions | Where-Object { $_.Oid.Value -eq "2.5.29.37" } $hasWhqlEku = $ekuExt -and ($ekuExt.Format(0) -match $whqlEkuOid) # 检查证书策略扩展 $policyExt = $signature.SignerCertificate.Extensions | Where-Object { $_.Oid.Value -eq "2.5.29.32" } $hasWhqlPolicy = $policyExt -and ($policyExt.Format(0) -match $whqlPolicyOid) # 判断签名类型 if ($hasWhqlEku -or $hasWhqlPolicy) { Write-Host "该目录文件为WHQL签名" } else { Write-Host "该目录文件为Attestation签名" }
优势说明
相比枚举颁发者名称的方法,该方案依赖证书的标准扩展字段,不受颁发者名称变更影响,覆盖所有合法的WHQL签名场景,准确性和稳定性更高。
内容的提问来源于stack exchange,提问作者SendETHToThisAddress
相关产品推荐
相关产品推荐

