Отслеживание вызовов 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. Я также пробовал другие формы трассировки, как упоминалось в потоке stackoverflow под названием «Мониторинг вызовов приложений в DLL».

Скажите, пожалуйста, к какому процессу/службе Windows мне нужно подключиться, чтобы узнать, как выполняются эти вызовы. Можно ли отслеживать всякий раз, когда выполняется вызов функции, независимо от того, какой процесс его выполняет?

Приветствуются любые предложения по отслеживанию этих вызовов CSP!


person pandey3    schedule 22.07.2013    source источник
comment
Проверьте, действительно ли установлены точки останова, вставив bl; непосредственно перед G в последней строке. Сколько точек останова он показывает?   -  person Marc Sherman    schedule 23.07.2013


Ответы (1)


Некоторое время назад advapi32.dll содержал реализацию криптографии, но теперь эта функциональность была перенесена в cryptsp.dll. Команда Windows иногда перемещает реализацию общедоступных методов из одной библиотеки DLL в другую. Дополнительные примеры см. в блоге 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
person seva titov    schedule 24.07.2013
comment
Большое спасибо! Это решает мою проблему. :) Я не знал о cryptsp dll. - person pandey3; 24.07.2013
comment
Привет Сева, еще один вопрос. Я пытаюсь наблюдать за аргументами функции, передаваемыми таким функциям, как CryptGenKey, CryptImportKey. Я попытался напечатать разыменованные значения указателя стека, т.е. через poi(esp+4) , poi(esp+8) и т. д., однако я не получаю значения аргументов. это либо ноль, либо какой-то мусор. Не могли бы вы сказать, как правильно это сделать? - person pandey3; 27.07.2013