2008-11-19 6 views
15

Estoy escribiendo una función para una DLL de instalación para verificar la firma Authenticode de los archivos EXE ya instalados en el sistema.Validar firma de Authenticode en EXE - C++ sin CAPICOM

la función necesita:

a) verificar que la firma es válida.
B) verificar que el firmante es nuestra organización.

Debido a que este se encuentra en un instalador, y debido a esto tiene que funcionar en instalaciones Win2k mayores, que No quiere depender de CAPICOM.dll, ya que no puede estar en el sistema de destino.

La API WinVerifyTrust funciona muy bien para resolver (A).

Necesito encontrar una forma de comparar un certificado conocido (o propiedades) con el que firmó el EXE en cuestión.

+0

1 ... si alguien puede crear una biblioteca que lo haga incluso en una plataforma que no sea de Windows. Seré feliz. Me gustaría poder verificar que un .EXE esté firmado por Microsoft desde Linux. – bobince

+2

@bobince, Mono tiene las herramientas ** signcode ** y ** chktrust ** que funcionan (si instala los certificados raíz necesarios) en cada plataforma compatible con Mono (S390x si lo desea ;-) – poupou

Respuesta

25

Debe usar CryptQueryObject.

Este artículo de KB demuestra el uso: How To Get Information from Authenticode Signed Executables.

Para el autor del comentario que le preguntó acerca de cómo hacerlo sin la API de Windows, no estoy al tanto de cualquier biblioteca que puede hacerlo, pero el formato está documentado aquí: Windows Authenticode Portable Executable Signature Format

+0

aplausos para el doctor, supongo que tendré que hacerlo en el largo camino ... – bobince

0

Si la firma es válida, su cadena de certificados contendrá su certificado. CertGetCertificateChain obtendrá esa cadena.

+1

¿Quiere decir eso? la estructura WINTRUST_DATA contiene el certificado? O tal vez CertGetCertificateChain se puede utilizar directamente en un archivo; simplemente no puedo entender cómo. Debo estar perdiendo algo obvio. Gracias de antemano por más detalles. –

Cuestiones relacionadas