Leer y validar el certificado del ejecutable

Leer y validar el certificado del ejecutable

Hay muchas API y enfoques sobre cómo puede obtener y verificar la firma del ejecutable y cómo puede obtener otra información adicional que necesita. El problema es qué nivel eliges (nivel alto como WinVerifyTrust )

La primera API más sencilla que se puede usar para obtener contexto criptográfico del archivo CAT o EXE es la función CryptQueryObject. El ejemplo de código de KB323809 podría darle la idea principal de cómo decodificar la información que necesita. la principal diferencia si trabaja con archivos CAT es que debe modificar algunos parámetros de CryptQueryObject. Te recomiendo que uses CERT_QUERY_CONTENT_FLAG_ALL y CERT_QUERY_FORMAT_FLAG_ALL y CryptQueryObject hará todo lo que necesites internamente:

BOOL bIsSuccess;
DWORD dwEncoding, dwContentType, dwFormatType;
HCERTSTORE hStore = NULL;
HCRYPTMSG hMsg = NULL;
PVOID pvContext = NULL;

// fill szFileName
...

// Get message handle and store handle from the signed file.
bIsSuccess = CryptQueryObject (CERT_QUERY_OBJECT_FILE,
                               szFileName,
                               CERT_QUERY_CONTENT_FLAG_ALL,
                               CERT_QUERY_FORMAT_FLAG_ALL,
                               0,
                               &dwEncoding,
                               &dwContentType,
                               &dwFormatType,
                               &hStore,
                               &hMsg,
                               &pvContext);

El valor dwContentType establecido por el CryptQueryObject obtendrá la información básica sobre el tipo de archivo szFileName . Los pvContext será PCCERT_CONTEXT para la mayoría de los casos que necesites, pero también puede ser PCCRL_CONTEXT o PCCTL_CONTEXT si usa el archivo .ctl o .crl como entrada. Recibirás el hStore lleno con todos los certificados del archivo szFileName . Así que con respecto a pvContext y hStore puede examinar el archivo que contiene con CryptoAPI. Si prefiere la API de masajes de bajo nivel, puede usar hMsg que se establecerá adicionalmente en caso de algunos dwContentType (al menos para CERT_QUERY_CONTENT_PKCS7_SIGNED , CERT_QUERY_CONTENT_PKCS7_UNSIGNED , CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED ).

Para verificar la firma del archivo, le recomendaría usar CertGetCertificateChain y CertVerifyCertificateChainPolicy para verificar no solo que el certificado es válido en general, sino que (o todos sus padres) es válido para el código de autenticación (szOID_PKIX_KP_CODE_SIGNING ). CertGetCertificateChain se puede usar para diferentes escenarios de revocación. Debes hacer dos llamadas separadas con CERT_CHAIN_POLICY_AUTHENTICODE y CERT_CHAIN_POLICY_AUTHENTICODE_TS para verificar que tanto la política de cadena de Authenticode como la política de cadena de marca de tiempo de Authenticode son válidas.

ACTUALIZADO :Releí tu pregunta actual (la parte actualizada). Su problema actual es cómo obtener el firmante/editor del archivo . Entonces solo respondo sobre la pregunta.

Si usa el código de sysinternal para la verificación de la firma, solo debe buscar la línea

if ( !CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0) )

La instrucción establecerá los campos del InfoStruct en caso de que ese archivo sea un archivo de Windows del sistema cuya firma se verifique con respecto a algún archivo .cat. El campo InfoStruct.wszCatalogFile le dará el nombre del archivo .cat.

Por ejemplo en mi Windows 7 si trato de verificar la firma digital del C:\Windows\explorer.exe archivo, el .cat donde se podría encontrar su hash es C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat .

Si usara el código de KB323809 con los parámetros descritos anteriormente de CryptQueryObject decodificarás el SPC_SP_OPUS_INFO_OBJID ("1.3.6.1.4.1.311.2.1.12") atributo del C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat (ver la función GetProgAndPublisherInfo ) y lo sabrás

pwszProgramName: "Windows Express Security Catalogs"
pPublisherInfo: NULL
pMoreInfo->dwLinkChoice: SPC_URL_LINK_CHOICE
pMoreInfo->pwszUrl "http://www.microsoft.com"

Por lo tanto, no se incluye información especial del editor para el archivo. Si examina al firmante del catálogo, descubrirá que:

The signer of the .cat file: "Microsoft Windows"
The signer signed it with the certificate:
    Serial Number: 0x6115230F00000000000A
    Issuer Name: Microsoft Windows Verification PCA
    Full Issuer Name:
        CN = Microsoft Windows Verification PCA
        O = Microsoft Corporation
        L = Redmond
        S = Washington
        C = US
    Subject Name: Microsoft Windows
    Full Subject Name:
        CN = Microsoft Windows
        OU = MOPR
        O = Microsoft Corporation
        L = Redmond
        S = Washington
        C = US
The Date of TimeStamp : 28.02.2011 21:16:36
TimeStamp Certificate: 
    Serial Number: 0x6103DCF600000000000C
    Issuer Name: Microsoft Time-Stamp PCA
    Subject Name: Microsoft Time-Stamp Service

Por lo tanto, debe usar solo el firmante del archivo .cat, porque no hay otro firmante de explorer.exe .


La función WinVerifyTrust realiza una acción de verificación de confianza en un objeto específico. La función pasa la consulta a un proveedor de confianza que admita el identificador de acción, si existe.

Para la verificación de certificados, utilice las funciones CertGetCertificateChain y CertVerifyCertificateChainPolicy.