5

別のバイナリ「helper.dll」を使用するバイナリ「api.dll」があります。デジタル署名を使用して各 DLL の信頼性を検証したいのですが、正しい方法がわかりません。コンテキストとして、DLL は Visual Studio 2010 を使用してビルドされており、[依存関係] タブを介してリンクされています。リンクはスタブの helper.lib を介して行われるため、明示的LoadLibraryに api.dll コードを呼び出しません。これに関する問題の一部は、 helper.dll がどこから読み込まれるのか正確にわからないことです。私の最初の考えは次のとおりです。

  1. 現在のプロセスへのハンドルを取得する
  2. ロードされたすべてのモジュールを列挙する
  3. 「helper.dll」という名前のものを見つけ (この情報が enum モジュール API を介して利用可能な場合)、次の ようなものを使用して署名を検証します。

これが最善の方法ですか?

第二に、デジタル署名/証明書に関する私のやや漠然とした理解に基づいて、検証には認証局への接続が必要であるか、証明書がマシンで信頼できるものとして既にリストされている必要があるようです。外部接続が嫌われたり、明示的に許可されていない場合、これは通常どのように処理されますか? アプリケーションと一緒に「インストール」されるものでしょうか? または、そのような場合、安全性の低い別の検証方法が必要になりますか?

4

1 に答える 1

7

DLL をロードする前に署名を検証したい。それらがロードされると、すでにプロセス内で任意のコードを実行する時間があり (「参考文献」を参照DllMain)、あなたは損をしています。

DLL の遅延読み込みが必要になる場合があります。LoadLibraryこのように、すべての関数に対して手動で/を実行する必要はありませんがGetProcAddress、DLL が読み込まれる前にコードを実行する機会が得られ、検証が失敗した場合は救済されます。

いいえ、WinVerifyTrustライブのインターネット接続は必要ありません。すべての Windows マシンには、信頼されたルート証明書のリストがあります。検証とは、署名とバイナリに添付された証明書を抽出し、署名が有効であること (ファイルの内容が署名されたものと実際に一致すること) を検証し、証明書が信頼されたルートの 1 つにつながる有効なチェーンを形成していることを検証することです。

ファイルがあなたのWinVerifyTrust会社によって署名されていることを確認しないことに注意してください。既知の CA のいずれかから証明書を購入した誰かによって署名されており、その後改ざんされていないことだけです。ファイルが実際に自分のものであることを確認したい場合は、追加の手順を実行する必要があります。

于 2013-07-17T01:00:01.103 に答える