1. Установить Smartcard Sniffer
Если включён Secure Boot (версии Windows 8 и выше), то инфраструктура AppInit_DLLs выключена.
Я делал на Windows 7 x64.
1.1. Скачать
https://code.google.com/p/smartcard-sniffer/1.2. Библиотеку необходимой разрядности SmartcardSniffer.dll положить в папку
1.3. Прописать в реестре загрузку SmartcardSniffer.dll и значения переменных
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"AppInit_DLLs"="C:\\1\\SmartcardSniffer.dll"
"LoadAppInit_DLLs"=dword:00000001
"RequireSignedAppInit_DLLs"=dword:00000000
2. Получить дамп диалога приложения с токеном
Для этого выполнить любую операцию, требующую передачу ключа в приложение.
Например, выполнить КриптоПро CSP ➔ Сервис ➔ Протестировать.
После этого в папке, где лежит SmartcardSniffer.dll, появляется файл rundll32.exe.txt, в котором сохранён дамп диалога приложения с токеном.
2.1. Разобрать дамп на отдельные файлы
2.1.1. Скачать writeBinaryAPDU.pl -
https://github.com/votadlos/Antitoken/blob/master/writeBinaryAPDU.pl2.1.2. Скачать и установить Perl -
https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi2.1.3. Запустить
perl writeBinaryAPDU.pl < rundll32.exe.txt
В результате rundll32.exe.txt будет разобран на бинарные файлы вида "001_out(4)39_6A_42_32", где
001 - идентификатор последовательности запрос-ответ;
out - направление передачи: out - из токена в приложение, in - от приложения в токен;
(4) - количество переданных/полученных байтов;
39_6A_42_32 - первые 4 байта.
3. Собрать контейнер
3.1. primary.key - размер 36 байт, начинается с 30_22_04_20
Ищем файлы вида №_out(36)30_22_04_20.
У меня таких было 2 штуки, размером 68 байт и 80 байт, начало одинаковое, потом нули, взял один и обрезал до 36 байт.
3.2. masks.key - размер 56 байт, начинается с 30_36_04_20
Ищем файлы вида №_out(56)30_36_04_20.
У меня таких было 2 штуки, размером по 64 байта, одинаковые, в конце нули, взял один и обрезал до 56 байт.
3.3. header.key - самый большой файл.
Находим файлы с самым большим объёмом, плюс берём кусок до и кусок после.
У меня он передавался два раза, состоял из 16 частей - 10 байт (379_out(10)30_82_0B_26)+ 14 * 200 байт + 48 байт (394_out(48)1F_E6_2E_0D), всего 2 858 байт. Соединил все части.
copy /B 379_out(10)30_82_0B_26 + ... + 394_out(48)1F_E6_2E_0D header.key
Либо, если положить все эти файлы в отдельную директорию
copy /B * header.key
3.4. name.key - просто взял от другого контейнера
Автор ПО и методики - Сергей Солдатов (
https://www.securitylab.ru/blog/personal/reply-to-all/155893.php)