在Windows Crypto API中跟踪CSP调用

时间:2013-07-22 17:21:08

标签: windows windbg cryptoapi mscapi

我正在使用Windows Server 2008 R2证书颁发机构进行私钥存档。在客户端,我有兴趣知道当客户端请求启用存档的证书时,Windows进程会调用哪些Crypto API函数。特别是,我的重点是跟踪此处列出的函数调用,http://msdn.microsoft.com/en-us/library/aa922849.aspx,存在于Advapi32.dll中。

我在这里尝试了windbg / cdb脚本(http://blogs.msdn.com/b/alejacma/archive/2007/10/31/cryptoapi-tracer.aspx)。我在发出证书请求时将其附加到mmc.exe但我无法检测到在此过程中进行的任何CSP调用。我还尝试通过certreq.exe请求证书,但windbg无法跟踪任何CSP调用。我还尝试了其他形式的跟踪,如stackoverflow线程中提到的“监视应用程序对DLL的调用”

请告诉我需要附加哪个Windows进程/服务,以便了解如何进行这些调用。是否有可能在进行函数调用时进行跟踪,而不管进行哪个进程?

欢迎任何关于如何追踪这些CSP电话的建议!

1 个答案:

答案 0 :(得分: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中的函数上。 E.g:

> bu CRYPTSP!CryptAcquireContextW
> bu CRYPTSP!CryptAcquireContextA
> bu CRYPTSP!CryptDecrypt
> ... and so on ...
> g