2008-10-07 15 views
1

Nous avons du code qui utilise LoadLibrary et GetProcAddress pour implémenter une architecture de plugin pour l'un de nos produits. Nous nous assurons que la DLL sur le point d'être chargée est signée avec notre clé de signature de code.Création d'un objet COM uniquement si la DLL qui l'implémente est signée?

Nous modifions l'architecture du plug-in pour utiliser COM à la place. Existe-t-il un moyen d'imposer la signature de code (de préférence avec notre certificat) lors de l'instanciation d'un objet COM?

Répondre

2

Vous devez faire cela au niveau de la DLL en utilisant l'API Authenticode. L'API standard est appelée WinVerifyTrust() et il y a des exemples documentés ici. Il y a un autre KB article number 323809 qui donne un exemple de la façon de décoller les autres détails de l'information authenticode attachée à votre DLL.

Bien sûr, ces API s'attendent à recevoir un chemin vers la DLL elle-même alors que dans un scénario de plugin COM, vous ne touchez pas directement cela mais utilisez plutôt l'enregistrement pour trouver le bon binaire. Vous pouvez soit rouler manuellement votre scénario de chargement (c'est-à-dire charger la DLL en utilisant LoadLibrary() et appeler le DllGetClassObject() vous-même) ou simplement demander aux utilisateurs de votre API de respecter des règles supplémentaires telles que la DLL. Ou, comme Rob Walker l'a suggéré, recherchez vous-même l'enregistrement CLSID dans le registre et utilisez-le comme moyen de trouver la bonne DLL à vérifier.

+0

Nos compléments COM, s'ils sont développés en .NET, semblent se vérifier eux-mêmes (lorsqu'ils ont été signés). Notre hôte non connecté faisait maintenant indirectement un WinVerifyTrust. Nous avons rencontré des problèmes détaillés article de la KB # 936707. Cela pourrait valoir la peine d'être lu pour ceux qui suivent ce chemin. – Aardvark

1

Je ne pense pas que vous pouvez le faire directement, mais vous pouvez rechercher la DLL que le CLSID utilise dans le Registre et vérifier sa signature avant d'émettre l'appel CoCreateInstance.