2017-07-19 4 views
2

J'essaie de vérifier si une DLL est signée en fonction du chemin du fichier. Je vois qu'il existe des solutions préexistantes pour ce type de problème en utilisant WinVerifyTrust, cependant, quand j'ai essayé de le vérifier par rapport à "C: \ Windows \ System32 \ kernel32.dll" il a dit: "Le fichier" C: \ Windows \ System32 \ kernel32.dll "n'est pas signé." bien que kernel32 soit une DLL signée. Je suis sur Windows 7 fyi.Vérifiez si une DLL est signée C++

Ceci est le code source à la fonction que j'ai appelé: https://msdn.microsoft.com/en-us/library/windows/desktop/aa382384(v=vs.85).aspx

Comment puis-je fixer la fonction?

+0

Lorsque j'ai couru cette application sur Windows 10: 'Le fichier" c: \ windows \ system32 \ kernel32.dll "est signé et la signature a été vérifiée.' – selbie

+0

fwiw, si vous avez compilé ce code en 32 bits (le par défaut pour Visual Studio), mais s'exécutait sur un système d'exploitation 64 bits, l'accès au fichier obtient pour c: \ windows \ system32 est redirigé vers c: \ windows \ syswow64. Pouvez-vous vérifier manuellement que le kernel32.dll dans syswow64 est signé? En outre, étant donné que kernel32.dll est probablement une DLL très spéciale soumise à d'autres possibilités de redirection, copiez-la manuellement dans un autre répertoire et renommez-la. Puis réexécutez le code sur le fichier copié pour voir s'il y a des différences. – selbie

+0

Je dois le compiler en 32 bits, quand j'ai essayé kernel32.dll dans syswow même message "Le fichier" C: \ Windows \ SysWOW64 \ kernel32.dll "n'est pas signé". J'ai essayé de mettre la DLL dans C: \ et le même message. Je suis à la recherche d'une solution globale, alors peut-être que cela ne fonctionne pas sur Windows 7, mais besoin de quelque chose pour tous les systèmes d'exploitation passé vista. –

Répondre

4

Oui WinVerifyTrust est la fonction correcte à utiliser, mais vous devez être prêt à l'appeler deux fois.

D'abord vous l'appelez avec WTD_CHOICE_FILE, celui qui réussit alors vous avez terminé. Sinon, vous devez l'appeler à nouveau avec WTD_CHOICE_CATALOG (CryptCATAdminCalcHashFromFileHandle + CryptCATAdminEnumCatalogFromHash + CryptCATCatalogInfoFromContext) car certains fichiers Windows n'intègrent pas les informations de certificat (en particulier les fichiers non PE). (Vous pouvez également essayer de find the catalog info first pour éviter d'appeler deux fois, mais je suppose que cela est plus lent)

Il y a plusieurs fils (this et this) sur le forum Sysinternals est peut-être la meilleure adresse pour les questions liées à ce sujet.

0

Vous pouvez utiliser le code que vous avez publié pour valider une signature numérique incorporée, assez souvent, en particulier pour les binaires Windows, vous trouverez qu'ils sont signés par catalogue. La validation des binaires signés par le catalogue est très différente, ce qui se passe essentiellement pour les exécutables signés du catalogue, c'est que leurs signatures sont stockées dans un catalogue installé au lieu d'y être incorporées.

Vous pouvez utiliser ce code de référence from process hacker. Regardez PhpVerifyFileFromCatalog.

+0

Était à la recherche de plus de code autonome, le code hacker de processus nécessite un tas de choses. Si personne d'autre ne répond, j'accepterai votre réponse. –