"Форум на сайте Чагадаева"

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

21 января 2012 года 10:00
Похоже, текущая проверка, не робот ли регистрируется (Чтобы удостовериться, что Вы не робот, напишите, пожалуйста, в строке ниже "я не робот" (без кавычек)), стала слишком лёгкой. С начала года убил уже штук 100 пользователей. Сделал чуть более сложную.

Автор Тема: [manual, ПО] JaCarta LT: копирование неэкспортируемого ключа  (Прочитано 13961 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

adc

  • Administrator
  • Новичёк
  • *****
  • Сообщений: 433
    • E-mail

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.pl
2.1.2. Скачать и установить Perl - https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi
2.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)
Записан