Копирование Jacarta LT и esmart

На авторство не претендую, честно всё скопировал. Сохраняю для себя чтоб не потерять. Тотальный респект и уважуха авторам.

Проверялось на windows 10 x86 под hyper-V, Jacarta-LT прокидывалась USB Redirector.

https://asadagar.ru/2023/03/03/kopiruem-neeksportiruemyy-konteyner-s-jacarta-lt/

Копируем неэкспортируемый контейнер с JaCarta LT

  • Примечание:

Автор ПО и методики — Сергей Солдатов

Данный способ работает не только на JaCarta LT и ESMART Token (нет личного опыта только сторонний отзыв, и непонятно какая именно модель 64K или ГОСТ).

Данное способ точно не работает на токенах Рутокен ЭЦП 2.0 и токенами формата PKCS#11

Что понадобится:
  1. Исходный токен JaCarta LT (на который записан оригинальный контейнер).
  2. Второй токен Rutoken Lite (сейчас удобней их юзать)
  3. Флешка (хотя по идеи и внешний HDD подойдет)
  4. Нужен чистый ПК желательно с Windows 7 x86/64 (я использовал x86). Потому что если включён Secure Boot (версии Windows 8 и выше), то инфраструктура AppInit_DLLs выключена.
Подготовка ПК для работы:
  1. Скачать и поставить Microsoft Visual C++ 2010 x86
  2. Скачать и поставить Strawberry Perl 5.32.1.1 32bit
  3. Скачать и поставить Единый Клиент JaCarta 3.0 32bit
  4. Скачать и поставить КриптоПро CSP 5.0.12600
  5. Скачать и распаковать WinHex
  6. Скачать и поставить Total Commander (просто с ним удобней)
    • Конфигурация => Настройка => Табуляторы => Размеры в панелях => «в байтах»
  7. Tokens.exe + CertFix.000032.exe
  8. Скачать 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
  1. Скачать файл writeBinaryAPDU.pl (Копия проекта внизу)
    • Кидаем его в «C:\SmartcardSniffer\»
  2. Перезагружаем ПК
Получаем дамп диалога приложения с токеном:
  1. Вставляем наш ключ JaCarta LT в ПК, и выполняем любую операцию требующую работу с ключом, например тестирование.
    • Открываем КриптоПро и запускаем тестирование: КриптоПро CSP -> Сервис -> Протестировать -> Выбираем копируемый сертификат -> Дожидаемся окончания тестирования -> Закрываем КриптоПро CSP
  2. После этого в папке «C:\SmartcardSniffer\», появится файл rundll32.exe.txt, в котором сохранён дамп диалога приложения с токеном.
  3. Разбиваем дамп на отдельные бинарные файлы:
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:

  1. Все полученные ключи кидаем в отделённую папку (числового вида, формата «2560») на флешку.
  2. Разблокируем
  3. Копируем на новый носитель.

Готово.

Переносим непереносимое и экспортируем не экспортируемое 2. Или «Как скопировать не экспортируемый ключ ЭП из ESMART Token и JaCarta?»

Автор: Lex 

Ранее, я написал статью, как выдернуть новые, не экспортируемые ключи ЭП из RuToken.

Сейчас же, я хочу описать свой опыт на тему «выдёргивания» ключа из esmart.

В этих наших интернетах, есть несколько статей по выдёргиванию ключей из JaCarta LT. В них, мельком упоминалось, что примерно так же, можно извлечь ключи и из esmart, но никаких подробностей не было. 

Тут мне понадобилось извлечь ключик из esmart и я столкнулся с некоторыми моментами, а учитывая, что я не то, чтобы «кулхацкер» — некоторые моменты были мне не понятны.

Поэтому, после того, как всё получилось — я решил написать свою, более подробную инструкцию.

UPD1: Поправил сылку на Strawberry Perl 5.32.1.1 32bit 

UPD2: Добавил заметки к части про файл header.key

UPD3: Добавил ещё немного инфы про файл header.key

UPD4: Добавил в разделе III инфу, что если используется сторонний фаервол, либо фаервол вообще отключен — нужно настраивать блокировку в стороннем фаерволе, либо отключать доступ в интернет.

UPD5: Добавил ещё вконце примечание №3 про header.key

Нам понадобится:

1) Windows 7 (x86/x64), либо более поздние ОС, но с отключенным Secure Boot. Иначе, SmartcardSniffer работать не будет.

2) Редист Microsoft Visual C++ 2010 x86 (если не установлен) 

3) Strawberry Perl 5.32.1.1 32bit — Нужен для работы скрипта, разделяющего дамп по действиям. 

4) Драйвера esmart.
Легче всего, вставить esmart в USB, зайти на i.kontur.ru и настроить рабочее место, например, под работу с Диадок. Тогда установятся все нужные компоненты. Кстати! Самое главное — не устанавливать компоненты по RDP, да и вообще не работать по RDP! Компоненты не запустятся. Если нужно работать удалённо — запустите AnyDesk, либо VNC (ну, или чем вы там любите подключаться?). Если не хотите лишнего ставить — попробуйте стянуть драйвера на сайте esmart 

4.1) Драйвера JaCarta.
Ставятся точно так же, как и драйвера esmart через i.kontur.ru.

5) КриптоПро (Если зайдёте на i.kontur.ru — то криптопро скачается сама. Если ставите руками — то вот свежая версия)

6) WinHEX

7) Некоторые советуют Total Commander, но мне удобнее пользоваться Q-Dir
В нём нужно настроить: Меню Настройки\Размер файлов, там поставить галочки: «Внутренний алгоритм Q-Dir» и «Размер в байтах». 

Готовую, настроенную версию можно стянуть тут.

8) Smartcard Sniffer качаем SmartcardSniffer и оттуда достаём «SmartcardSniffer.dll» в моём случае, т.к. у меня Win7x86 — дёргаю файлик из папки SmartcardSniffer-0.1\SmartcardSniffer\bin\x86.
Его кидаем на диск C:\, в папку «SmartcardSniffer» (Желательно, сделать именно так, как в инструкции, т.к. команды, в дальнейшем, будут опираться именно на этот путь).
Так же, нужно поправить реестр:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
«AppInit_DLLs»=»C:\\SmartcardSniffer\\SmartcardSniffer.dll»
«LoadAppInit_DLLs»=dword:00000001
«RequireSignedAppInit_DLLs»=dword:00000000

Вот готовый файлик реестра

9) Файл writeBinaryAPDU.pl (готовый файл лежит здесь)
Помещаем его в “C:\SmartcardSniffer\”

10) CertFix версии 1.1.27.3154. Нужен для конвертации ключа в экспортируемый. Про более старые — ничего не скажу, а вот новые уже не могут конвертировать. И самое поганое — при первом же запуске — программа сама обновится до новой версии. Поэтому, ей нужно обломать доступ в интернеты. 

11) Firewall App Blocker. Нужен для блокировки доступа в интернет CertFix.

Устанавливаем все компоненты и ОБЯЗАТЕЛЬНО перезагружаем компьютер.

I. Собственно, сам процесс извлечения ключа из ESMART:

1) Получаем дамп диалога КриптоПро с токеном:
1.1) Вставляем ключ в ПК,
1.2) Запускаем КриптоПро,
1.3) Открываем вкладку «Сервис»,
1.4) Нажимаем «Протестировать»
1.5) Выбираем ключ и вводим пароль (кто не знал — стандартный пароль от ruToken и ESMART Token  — 12345678, от JaCarta 1234567890 (в старых версиях (до 15.01.2019) стоял 1eToken), админские пароли можно глянуть тут и тут),
1.6) В открывшемся окне, смотрим пункт «Экспорт ключа» и убеждаемся, что он действительно не экспортируемый. Жмём «Готово» и закрываем программу.

1.7) В папке “C:\SmartcardSniffer\” появится дамп-файл «rundll32.exe.txt»

2) Разбиваем дамп на отдельные файлы:
2.1) Запускаем консоль (Win+R, пишем CMD и жмём «Enter»)
2.2) В консоли меняем папку командой: cd C:\SmartcardSniffer

2.3) Пишем команду perl writeBinaryAPDU.pl < rundll32.exe.txt

2.4) Появится папка с кучей файлов

2.5) Сразу, чтоб облегчить жизнь, в папке, жмём Ctrl+F, в поиске вбиваем «in» и удаляем все файлы, содержащие в названии это слово.

3) Собираем контейнер:
3.1) Первым идёт primary.key
3.1.1) Ищем файл, содержащий в названии 30_22

У меня он один, но у вас могут быть их несколько.
3.1.2) Выбираем тот, что по меньше и перетаскиваем в WinHEX.

3.1.3)Видим, что в конце стоят нули. Подрезаем файл до 36 байт (у меня это были все нули):
3.1.3.1) Ставим курсор на последний ноль, зажимаем клавишу Shift и стрелочками двигаем курсор, выделяя данные (лучше выделить не все нули, а оставить сначала половину и посмотреть, сколько данных обрезали).
3.1.3.2) Жмём клавишу Del и смотрим сколько отрезали. Должно остаться 36 байт.

3.1.4) Сохраняем файл под именем primary.key куда-нибудь отдельно (я сохранил в C:\SmartcardSniffer\2)

3.2) Далее, идёт файл masks.key:
3.2.1) Ищем файл с именем, содержащем 30_36

3.2.2) Подрезаем его до 56 байт (так же как предыдущий) и сохраняем под именем masks.key.

3.3) Ну и самый геморный файл — header.key:

3.3.1) Ищем самые большие файлы (для этого нам и понадобится Q-Dir с настройкой отображения байтов). (UPD: почитайте в самом низу Примечания)

3.3.2) Берём файл, идущий перед ними (весит обычно, 16 байт и в названии содержит 83_02 (по крайней мере, у меня во всех случаях так было)) и тот, что идёт после них (он чуть меньше самых больших файлов (бывает так, что в конце, может быть два одинаковых по размеру файла. Берём любой(см скриншот ниже))) (см. примечание 1).

Распишу подробнее: нам нужен первый файл, обычно, в ESMART Token он называется *_out(16)30_82_0A_BE, в JaCarta, называется *_out(16)30_82_0A_32.
После 30_82, названия могут быть разными, однако, «out(16)30_82» присутствует всегда (по крайней мере, на моей тачке, у ESMART Token и JaCarta — точно.

В моём случае, их было 12. Может быть 14 (например, как у JaCarta)

3.3.3) Копируем эти файлы в отдельную папку (в данном случае, я скопировал в C:\SmartcardSniffer\3)

3.3.4) В консоли меняем рабочую папку на C:\SmartcardSniffer\3 (ну, или на ту, в которую вы скопировали файлы) командой cd C:\SmartcardSniffer\3

3.3.5) Пишем команду copy /B * header.key и жмём энтер

3.3.6) В папке C:\SmartcardSniffer\3 появился файл header.key

3.3.7) Его помещаем в папку к другим файлам.

3.4) Остаётся получить файл name.key. Конечно, можно его как-то вытащить из того сборища файлов, но легче взять готовый. Например, вот здесь. Отображаться в КриптоПро он будет как «Test_123», но потом, ключ легко будет переименовать после того, как вы сделаете его экспортируемым.
Если хотите — то вот вам файл с именами: esmart_1, esmart_2, esmart_3? jakarta_1, jakarta_2, jakarta_3, Export_1, Export_2, Export_3

3.4.1) Копируем файл в папку с primary.key, masks.key и header.key.

3.5) Переименовываем папку в «1234» (можно использовать любые 12 символов, (цифры и ТОЛЬКО латинские буквы) и закидываем папку на любую флешку или жёсткий диск, имеющий любую букву, кроме диска C:\ (я использую виртуальный диск (VHD). Примонтировал такую виртуальную «флешку» и балуешься).

3.6) Снова запускаем КриптоПро и находим сертификат.

3.7) Убеждаемся, что ошибок не обнаружено.

3.8) В принципе, ключ уже можно использовать так. Многие так и делают: закидывают папку на флешку и спокойно работают. Но можно пойти дальше и сделать ключ экспортируемым (на сколько это видно госорганам, когда подключаешься к их порталам — я не знаю. Но есть люди, которым принципиально нужно скопировать ключ на токен и использовать его как раньше.

Описание по конвертации ключа в экспортируемый, перейдите в раздел III. 

II. Процесс извлечения ключа из JaCarta:

1) Выполняем пункты с 1 по 3.2.2, пункт 3.3 тоже похож, только файлов может быть меньше и после удаления файлов *in*, нужные нам файлы будут идти практически по порядку.

2) Ровно таким же способом, как описано в пунктах с 3.3.1 по 3.3.7 собираем  header.key

3) И так же, используем любой name.key

III. Конвертация не экспортируемого ключа в экспортируемый.

1) Запускаем Firewall App Blocker (Это если у Вас используется стандартный фаервол. Если стоит какой-нибудь KIS, или EIS, или вообще фаервол отключен — то либо настраивайте запрет в них, либо отключайте интернет)  и запрещаем CertFix выход в интернет (я на всякий случай запретил как входящие, так и исходящие подключения. А можно просто выключить интернет и не настраивать файрвол).

2) Запускаем CertFix от имени администратора и находим наш ключ. Смотрим на столбец «Экспорт закрытого ключа» и видим параметр «DENIED».

3) Зажимаем клавишу «Shift» на клавиатуре, нажимаем правой кнопкой мыши по ключу и выбираем пункт «Сделать экспортируемым (файловая система)».

4) После чего, получаем уведомление, что всё прошло успешно и резервная копия лежит в папке контейнера.

Если зайти в папку с ключом — можно увидеть каталог бэкапа.

5) Ну а дальше всё просто:

    5.1) Запускаем КриптоПро, там жмём вкладку Сервис;
    5.2) Жмём кнопку «Скопировать…»
    5.3) Затем, кнопку «Обзор…»
    5.4) Выбираем контейнер и жмём кнопку «Ок»
    5.5) Можем задать другое имя контейнеру (я оставил по умолчанию), жмём «Готово»
    5.6) Выбираем носитель (у меня Rutoken Lite), жмём «Ок»
    5.7) Готово!
    5.8) Тестируем сертификат.

Вот в виде видео:

https://www.blogger.com/video.g?token=AD6v5dzXWV5RylHdq1FuI_MmyDO25iKbsq6fvGOBSMIVtPIbFxCwBRO4Wp7VUWupHyk7GtORHjk6tzCDmaO5bkYNnwNDwHDsZbhs5WScQolxEURKiTdGI1GkKzMke9Zfyn02z1gPLBYq

Ну, и собственно всё. Позже, выложу ссылки на сборник программ в одном архиве и образ виртуалки VMWare с настроенной виндой под ESMART и JaCarta.

—————-
Примечания

Примечание 1: 
Может быть и так, что последний файл, будет весить меньше 71 байта.

Например, недавно попался eSmart с двумя подписями (старая и новая) и там, при создании header.key, последний файл весил 6 байт, а на другом, 56 байт.

Лучше всего, ориентироваться на последний большой файл (больше 100 байт), после него идёт ненужный файл, после него, идёт файл, оканчивающийся на «01___» и следующий файл, скорее всего, наш. Если не получается с ним — пробуйте один из файлов, весящих 71 байт.

Примечание 2: А может быть и так, что файлы будут идти по очереди. Пробуйте варианты.

Вот недавно, у меня было вот так:


Примечание 3: А может быть и так, что первый набор больших файлов собираешь в header.key, проверяешь, а тебе пишет, что контейнер не содержит ключей.

Тогда ищем дальше. У меня бывает и так, что второй набор больших файлов нормально собирается в header.key.