Отслеживание вызовов CSP в Windows Crypto API
Я работаю над архивированием закрытого ключа с помощью центра сертификации Windows Server 2008 R2. На стороне клиента мне интересно знать, какие вызовы функций Crypto API выполняются процессами Windows, когда клиент запрашивает сертификат с поддержкой архивирования. В частности, я сосредоточен на отслеживании вызовов функций, перечисленных здесь, 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. Я также пробовал другие формы трассировки, как упомянуто в потоке stackru под названием "Мониторинг обращений приложений к DLL"
Скажите, пожалуйста, к какому процессу / службе Windows мне нужно подключиться, чтобы узнать, как выполняются эти вызовы. Можно ли отследить всякий раз, когда выполняется вызов функции, независимо от того, какой процесс это делает?
Любые предложения о том, как отследить эти вызовы CSP, приветствуются!
1 ответ
Некоторое время назад advapi32.dll содержал реализацию криптографии, но теперь эта функциональность была перенесена в cryptsp.dll. Иногда команда Windows переносит реализацию открытых методов из одной DLL в другую. Смотрите другие примеры в блоге The Old New Thing. Advapi32.dll просто вызывает соответствующие функции в cryptsp.dll.
По-видимому, API-интерфейсы сертификатов в mmc, которые вы пытались отлаживать, вызывают непосредственно в 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