none
Windows 7 x64 での CryptQueryObject API の利用について RRS feed

  • 質問

  • いつもお世話になっております。

    現在、CryptQueryObject API を利用したプログラムを作成しています。

    32ビットOS環境では、正しく動作しているのですが、Windows 7 x64 にて以下の現象となりました。

    こちらは、CryptQueryObject API の不具合でしょうか、それとも 64ビットOS上では使用方法に何らかの注意が必要なのでしょうか?

    何か情報をお持ちでしたら、ご教示お願いします。

    現象:

    1. 32ビットアプリケーション内で、CryptQueryObject API の第二引数にファイルリダイレクションが適用されるファイルパスを指定して呼び出すと、CryptQueryObject API が FALSE を返し、エラーコードに CRYPT_E_NO_MATCH が設定されてしまいます。
    2. 但し、上記呼び出しよりも先に同じプロセスでファイルリダイレクションが適用されないパスを指定して API の呼び出しを成功させた後であれば、ファイルリダイレクションが適用されるパスを指定しても、正常に動作します。

     実際のコードは次のように記載しています。

    // ▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
    
    // (A)先に32ビットプロセスからでも普通にアクセスできるパスのファイルを指定する。
    
    ::CryptQueryObject(CERT_QUERY_OBJECT_FILE,
    
    	L"C:\\Users\\user\\Desktop\\dummy.exe",
    
    	CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
    
    	CERT_QUERY_FORMAT_FLAG_BINARY,
    
    	0, &dwEncoding, &dwContentType, &dwFormatType, &hStore, &hMsg, NULL);
    
    // △△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△
    
    
    
    // ファイルリダイレクションを無効化
    
    ::Wow64DisableWow64FsRedirection(&pOldValue);
    // (B)ファイルリダイレクションが必要なパスを指定する。
    ::CryptQueryObject(CERT_QUERY_OBJECT_FILE,
    
    	L"C:\\WINDOWS\\system32\\drivers\\hogehoge.exe",
    
    	CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
    
    	CERT_QUERY_FORMAT_FLAG_BINARY,
    
    	0, &dwEncoding, &dwContentType, &dwFormatType, &hStore, &hMsg, NULL);
    
    

     開発環境:Visual Studio 2003

    何卒よろしくお願いします。

    4/22 追記: 上述のコードで(A)がないと(B)で失敗します(1の現象)

    2010年4月14日 8:15

回答

  • 今件、有効な対応方法が判明しましたので、その方法を掲載のうえ、クローズとさせていただきます。

    本問題について、考えを巡らせていただきました方々、誠にありがとうございました。

    本件、WOW64アプリにて、ファイルリダイレクトを無効にした上で CryptQueryObject API を呼び出すと、CryptQueryObject API 内部の処理に影響を及ぼし結果として、CRYPT_E_NO_MATCH のエラーとなっている様子です。

    ついては、今回の署名チェックを実現するためにはファイルリダイレクトを無効にすることなく、WOW64プロセスから System32 フォルダにアクセスする必要があるようです。これには以下に示す URL に掲載されているように、WOW64 機能によって提供される system32 の代替名である Sysnative を使用することで対応できそうです。

    http://msdn.microsoft.com/ja-jp/library/aa384187(VS.85).aspx

    • 回答としてマーク takuya.k 2010年5月10日 9:51
    2010年5月10日 9:51

すべての返信

  • ※ そもそもですが、モジュールに施されたデジタル署名の検証を試みたものとなります。情報の不足失礼しました。

    さらに調査しましたところ、以下の事象を確認しました。そもそもファイルリダイレクションを無効化していると、CryptQueryObject API の動作に問題があるように思います。

    例えば、ファイルリダイレクションを無効化していると、デスクトップなどのファイルリダイレクションの必要が無いパスに置いているファイルであっても、APIの呼び出しに失敗し 、エラーコードにCRYPT_E_NO_MATCH が設定されます。※ファイルリダイレクションを無効にして『いなければ』 API の呼び出しが成功することは確認しています。

    この動作について何か、情報をお持ちではないでしょうか?

    また、CryptQueryObject API の第一引数に、CERT_QUERY_OBJECT_BLOB を指定することで、対象のデータをファイルパスではなくバッファポインタで指定できると認識しています。

    こちらの指定方法を利用することで、CryptQueryObject API の呼び出し前にファイルリダイレクションを無効にする必要は無くなり、Windows  7 x64 環境でも API 呼び出しに成功する事は確認できましたが、今度は XP x86 で失敗して CRYPT_E_NO_MATCH が設定されます。

    これについては、CryptQueryObject API の利用方法として、第二引数は CERT_BLOB 構造体で指定することになるかと思いますが、こちらは、pbData にバッファポインタ(ファイルの全体をメモリに読み込んだもの)を指定して、cbData にpbData が指すデータのサイズを設定するので、使用方法としてあっていますでしょうか?

    今件、何卒よろしくお願いします。

    2010年4月22日 4:42
  • 今件、有効な対応方法が判明しましたので、その方法を掲載のうえ、クローズとさせていただきます。

    本問題について、考えを巡らせていただきました方々、誠にありがとうございました。

    本件、WOW64アプリにて、ファイルリダイレクトを無効にした上で CryptQueryObject API を呼び出すと、CryptQueryObject API 内部の処理に影響を及ぼし結果として、CRYPT_E_NO_MATCH のエラーとなっている様子です。

    ついては、今回の署名チェックを実現するためにはファイルリダイレクトを無効にすることなく、WOW64プロセスから System32 フォルダにアクセスする必要があるようです。これには以下に示す URL に掲載されているように、WOW64 機能によって提供される system32 の代替名である Sysnative を使用することで対応できそうです。

    http://msdn.microsoft.com/ja-jp/library/aa384187(VS.85).aspx

    • 回答としてマーク takuya.k 2010年5月10日 9:51
    2010年5月10日 9:51