3

Windows Server 2008 R2 認証局を使用して秘密キーのアーカイブに取り組んでいます。クライアント側では、クライアントがアーカイブ対応の証明書を要求したときに、Windows プロセスによってどの Crypto API 関数呼び出しが行われるかを知りたいと思っています。特に、 Advapi32.dllにあるhttp://msdn.microsoft.com/en-us/library/aa922849.aspxにリストされている関数呼び出しを追跡することに重点を置いています。

ここで windbg/cdb スクリプトを試しました ( http://blogs.msdn.com/b/alejacma/archive/2007/10/31/cryptoapi-tracer.aspx )。証明書の要求を行っているときに mmc.exe に添付しましたが、プロセス中に行われた CSP 呼び出しを検出できませんでした。また、certreq.exe を介して証明書を要求しようとしましたが、windbg は CSP 呼び出しを追跡できませんでした。「DLLへのアプリケーション呼び出しの監視」というタイトルのstackoverflowスレッドに記載されているように、他の形式のトレースも試しました

これらの呼び出しがどのように行われているかを調べるために、どの Windows プロセス/サービスにアタッチする必要があるか教えてください。どのプロセスがそれを行うかに関係なく、関数呼び出しが行われるたびにトレースすることは可能ですか?

これらの CSP 呼び出しを追跡する方法に関する提案は大歓迎です!

4

1 に答える 1

1

以前は advapi32.dll に暗号化の実装が含まれていましたが、現在、この機能は cryptsp.dll に移動されています。Windows チームは、パブリック メソッドの実装をある DLL から別の DLL に移動することがあります。The Old New Thing Blogでこれに関する他の例を参照してください。Advapi32.dll は、cryptsp.dll 内の対応する関数を呼び出すだけです。

明らかに、デバッグしようとしていた mmc の証明書 API は、cryptsp.dll を直接呼び出しています。Windows 8 のコール スタックの例:

0:000> k
Child-SP          RetAddr           Call Site
00000000`0059c278 000007fd`6c1b7d8b CRYPTSP!CryptAcquireContextA
00000000`0059c280 000007fd`6c1ace66 CRYPT32!I_CryptGetDefaultCryptProv+0xbc
00000000`0059c2d0 000007fd`6c1ae1b3 CRYPT32!FastCreateCtlElement+0x4a6
00000000`0059c4e0 000007fd`6c1a248a CRYPT32!CreateCtlElement+0x23
00000000`0059c530 000007fd`6c1a2297 CRYPT32!CreateStoreElement+0x139
00000000`0059c610 000007fd`6c1abaa4 CRYPT32!LoadStoreElement+0x244
00000000`0059c6f0 000007fd`6c1a2c76 CRYPT32!OpenFromRegistry+0x39e
00000000`0059c950 000007fd`6c1a2e7c CRYPT32!OpenAllFromRegistryEx+0x96
00000000`0059c9d0 000007fd`6c1a394b CRYPT32!I_CertDllOpenRegStoreProv+0xfc
00000000`0059ca20 000007fd`6c196926 CRYPT32!I_CertDllOpenSystemRegistryStoreProvW+0x28b
00000000`0059cb20 000007fd`6c1a3b72 CRYPT32!CertOpenStore+0x296
00000000`0059cba0 000007fd`6c1a3dc2 CRYPT32!OpenPhysicalStoreCallback+0xc2
00000000`0059cc70 000007fd`6c1a4512 CRYPT32!EnumPhysicalStore+0x648
00000000`0059ce00 000007fd`6c196926 CRYPT32!I_CertDllOpenSystemStoreProvW+0x162
00000000`0059cee0 000007fd`6c1a3b72 CRYPT32!CertOpenStore+0x296
00000000`0059cf60 000007fd`6c1a3dc2 CRYPT32!OpenPhysicalStoreCallback+0xc2
00000000`0059d030 000007fd`6c1a4512 CRYPT32!EnumPhysicalStore+0x648
00000000`0059d1c0 000007fd`6c196926 CRYPT32!I_CertDllOpenSystemStoreProvW+0x162
00000000`0059d2a0 000007fd`47371a27 CRYPT32!CertOpenStore+0x296
00000000`0059d320 000007fd`47363611 certmgr!CCertStore::GetStoreHandle+0xc7

advapi32.dll はコール スタックにも存在しないことに注意してください。

したがって、解決策は、cryptsp.dll の関数に直接ブレークポイントを設定することです。例えば:

> bu CRYPTSP!CryptAcquireContextW
> bu CRYPTSP!CryptAcquireContextA
> bu CRYPTSP!CryptDecrypt
> ... and so on ...
> g
于 2013-07-24T04:23:31.793 に答える