LoadLibrary と GetProcAddress を使用して、いずれかの製品のプラグイン アーキテクチャを実装するコードがあります。ロードしようとしている DLL がコード署名キーで署名されていることを確認します。
代わりに COM を使用するようにプラグイン アーキテクチャを変更しています。COM オブジェクトをインスタンス化するときに、(できれば証明書を使用して) コード署名を強制する方法はありますか?
LoadLibrary と GetProcAddress を使用して、いずれかの製品のプラグイン アーキテクチャを実装するコードがあります。ロードしようとしている DLL がコード署名キーで署名されていることを確認します。
代わりに COM を使用するようにプラグイン アーキテクチャを変更しています。COM オブジェクトをインスタンス化するときに、(できれば証明書を使用して) コード署名を強制する方法はありますか?
これは、Authenticode API を使用して DLL レベルで行う必要があります。標準 API はWinVerifyTrust()と呼ばれ、そこに文書化されたサンプルがあります。別のKB 記事番号 323809があり、DLL に添付された認証コード情報から他の詳細を取り出す方法の例が示されています。
もちろん、これらの API は DLL 自体へのパスが渡されることを想定していますが、COM プラグインのシナリオでは、通常は直接触れず、代わりに登録に依存して適切なバイナリを見つけます。ロード シナリオを手動でロールする (つまり、LoadLibrary() を使用して DLL をロードし、DllGetClassObject()を自分で呼び出す) か、API のユーザーに、登録に関係なく特定の場所に DLL を配置するなどの追加のルールに従うように単純に要求することができます。
または、Rob Walker が提案したように、自分でレジストリの CLSID 登録を検索し、それを使用して正しい DLL を見つけて検証します。
これを直接行うことはできないと思いますが、CLSID がレジストリで使用する DLL を検索し、CoCreateInstance 呼び出しを発行する前にその署名を確認することはできます。