Примечание:
Автор ПО и методики — Сергей Солдатов
Данный способ работает не только на JaCarta LT и ESMART Token (нет личного опыта только сторонний отзыв, и непонятно какая именно модель 64K или ГОСТ).
Данное способ точно не работает на токенах Рутокен ЭЦП 2.0 и токенами формата PKCS#11
Что понадобится:
- Исходный токен JaCarta LT (на который записан оригинальный контейнер).
- Второй токен Rutoken Lite (сейчас удобней их юзать)
- Флешка (хотя по идеи и внешний HDD подойдет)
- Нужен чистый ПК желательно с Windows 7 x86/64 (я использовал x86). Потому что если включён Secure Boot (версии Windows 8 и выше), то инфраструктура AppInit_DLLs выключена.
Подготовка ПК для работы:
- Скачать и поставить Microsoft Visual C++ 2010 x86
- Скачать и поставить Strawberry Perl 5.32.1.1 32bit
- Скачать и поставить Единый Клиент JaCarta 3.0 32bit
- Скачать и поставить КриптоПро CSP 5.0.12600
- Скачать и распаковать WinHex
- Скачать и поставить Total Commander (просто с ним удобней)
- Конфигурация => Настройка => Табуляторы => Размеры в панелях => «в байтах»
- Tokens.exe + CertFix.000032.exe
- Скачать Smartcard Sniffer (Копия проекта внизу)
- Библиотеку необходимой разрядности SmartcardSniffer.dll кидаем в папку «C:\SmartcardSniffer\»
- Прописать в реестре загрузку SmartcardSniffer.dll и значения переменных (кому лень ручками, есть .reg файл в архиве SmartSniffer.zip):
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"AppInit_DLLs"="C:\SmartcardSniffer\SmartcardSniffer.dll"
"LoadAppInit_DLLs"=dword:00000001
"RequireSignedAppInit_DLLs"=dword:00000000
- Скачать файл writeBinaryAPDU.pl (Копия проекта внизу)
- Кидаем его в «C:\SmartcardSniffer\»
- Перезагружаем ПК
Получаем дамп диалога приложения с токеном:
- Вставляем наш ключ JaCarta LT в ПК, и выполняем любую операцию требующую работу с ключом, например тестирование.
- Открываем КриптоПро и запускаем тестирование: КриптоПро CSP -> Сервис -> Протестировать -> Выбираем копируемый сертификат -> Дожидаемся окончания тестирования -> Закрываем КриптоПро CSP
- После этого в папке «C:\SmartcardSniffer\», появится файл rundll32.exe.txt, в котором сохранён дамп диалога приложения с токеном.
- Разбиваем дамп на отдельные бинарные файлы:
perl writeBinaryAPDU.pl < rundll32.exe.txt
Для хлебушков, команда выполняется в папке, где лежит файл rundll32.exe.txt
В результате rundll32.exe.txt будет разобран на бинарные файлы (появится отдельная папка) вида «001_out(4)39_6A_42_32», где:
001 — идентификатор последовательности запрос-ответ;
out — направление передачи: out — из токена в приложение, in — от приложения в токен;
(4) — количество переданных/полученных байтов;
39_6A_42_32 — первые 4 байта.
Собираем контейнер:
primary.key — размер 36 байт, начинается с 30_22_04_20
Ищем файлы вида №_out(36)30_22_04_20. У меня таких было 2 штуки, размером по 80 байт, начало одинаковое, в конце нули, взял один и обрезал через WinHex до 36 байт, результат сохранил как primary.key
masks.key — размер 56 байт, начинается с 30_36_04_20
Ищем файлы вида №_out(56)30_36_04_20. У меня таких было 2 штуки, размером по 64 байта, одинаковые, в конце нули, взял один и обрезал через WinHex до 56 байт, результат сохранил как master.key
header.key — самый большой файл.
Находим файлы с самым большим объёмом, плюс берём кусок до и кусок после. У меня таких файлов было много, но их все можно было разбить на группы и получилось 6 групп по 16 файлов (18 если учитывать нулевые).
Копируем все файлы в «C:\SmartcardSniffer\header» и склеиваем их командой:
copy /B * header.key
name.key — тут есть два варианта:
- Просто взять от другого контейнера
- Сгенерировать свой на базе дампа
Если с первым пунктом всё понятно, то со вторым чуть интересней. В дампе ищем файл — следующего вида №_out(длина имени)30_длина имени_16_длина имени — 2.
Интересен тот факт, что содержимое этого файла, в целом, не важно, поэтому можно сгенерить свой файл name.key, с соблюдением формата его первых четырех байт.
У себя я нашел один такой файл, 163_out(10)30_26_16_24. Из него и сделал name.key.
И накидал в него данных, чтобы привести его виду обычного name.key из рабочего контейнера:
Результат сохранил как name.key
Далее схема работы простоя, по аналогии со статьей с Rutoken Lite:
- Все полученные ключи кидаем в отделённую папку (числового вида, формата «2560») на флешку.
- Разблокируем
- Копируем на новый носитель.
Готово.
Можно сделать только п.8, остальное сделает программка на питоне.
https://bmcsoft.ru/forum/viewtopic.php?p=21479#p21479
Это просто шикарно если честно. На днях протестирую и дополню статью.