Структура подписи PE (EXE/DLL)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.04.21 02:57
Оценка:
Когда проверяю подписанные EXE/DLL с помощью MS signtool verify /v /kp, оно всегда выдает список Cross Certificate Chain, даже если кросс-сертификат не использовался при подписывании файла. Судя по всему, наличие этой цепочки зависит скорее от ключа /kp, нежели от состава подписи. Где signtool берет эту цепочку — сугубо из локальных хранилищ?

Хочется иметь возможность увидеть объективную структуру подписи, добавленной к файлу. Подписи с кросс-сертификатом и без него различаются и по объему, и по составу. А чем можно посмотреть параметры подписи (хэши, реквизиты сертификатов, даты и прочее)?

Нагуглил "openssl asn1parse -inform der" — оно выдает какие-то невнятные сокращения, и неизменно добавляет "error in encoding".
сертификат certificate подпись signature cross signtool цепочка chain exe dll
Re: Структура подписи PE (EXE/DLL)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.04.21 03:16
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>чем можно посмотреть параметры подписи (хэши, реквизиты сертификатов, даты и прочее)?


Обнаружил, что более-менее подробную информацию о подписи выдает SigCheck от SysInternals, с ключами -i -h (хоть бы одна собака в нескольких десятках найденных статей/постов упомянула об этом).

Но и SigCheck выдает один и тот же список сертификатов и для файлов, подписанных с кросс-сертификатами MS, и без них, а также для файлов, подписанных с разными кросс-сертификатами. Различаются только общие контрольные суммы файлов.

Где-нибудь вообще описано, каким образом кросс-сертификаты указываются в подписи? Или это сугубо внутренняя магия MS?
Re: Структура подписи PE (EXE/DLL)
От: okman Беларусь  
Дата: 11.04.21 06:58
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Где-нибудь вообще описано, каким образом кросс-сертификаты указываются в подписи? Или это сугубо внутренняя магия MS?


А разве они не добавляются в цифровую подпись также, как и все остальные сертификаты?
По моим наблюдениям, именно так это и происходит, без какой-либо магии.

Если сделать две версии одного и того же файла — одну с обычной подписью, другую с кроссом, то можно заметить, что во втором
случае длина "хвостовой" части файла, где лежит подпись, немного больше и там присутствует "Microsoft Code Verification Root".
Ну и "signtool verify /v /kp /tw" в первом случае выводит "Signing Certificate Chain" и "Timestamp Verified by", а во
втором добавляет к этому еще и "Cross Certificate Chain". По крайней мере, у меня так это работает.

Вообще, у Microsoft есть документ "Windows Authenticode Portable Executable Signature Format":
https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx

Там базово изложено, как цифровая подпись добавляется в исполняемый файл.
Правда, для более глубокого вникания потребуется еще проштудировать десяток RFC и разобраться с ASN.1/BER...
Отредактировано 11.04.2021 7:06 okman . Предыдущая версия .
Re[2]: Структура подписи PE (EXE/DLL)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.04.21 15:02
Оценка:
Здравствуйте, okman, Вы писали:

O>А разве они не добавляются в цифровую подпись также, как и все остальные сертификаты?


Я вижу, что какие-то реквизиты кросс-сертификата присутствуют в подписи, но ни SigCheck, ни SignTool verify их не показывают. Показывает только SignTool verify с ключом /kp. Выдачи SigCheck для файла, подписанного с разными кросс-сертификатами, отличаются только хэшами самих файлов — списки сертификатов одинаковые.

O>можно заметить, что во втором случае длина "хвостовой" части файла, где лежит подпись, немного больше и там присутствует "Microsoft Code Verification Root".


Кстати, саму подпись удобно просматривать и извлекать в FAR — ArcLite показывает ее элементом "CERTIFICATE".

O>Ну и "signtool verify /v /kp /tw" в первом случае выводит "Signing Certificate Chain" и "Timestamp Verified by", а во

O>втором добавляет к этому еще и "Cross Certificate Chain". По крайней мере, у меня так это работает.

Вот и я о том, что цепочку кросс-сертификатов в подписи видит только SignTool с ключом /kp, а все остальное видит только основные. Поэтому и хочется разобрать подпись на элементы и понять, как она строится в каждом случае. certutil -asn вроде бы как-то разбирает саму подпись (не PE-файл с нею), но выдает огромное количество самых элементарных записей, и вдобавок не факт, что правильно, поскольку в итоге завершается в "decode error".

O>Вообще, у Microsoft есть документ "Windows Authenticode Portable Executable Signature Format":


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

O>Правда, для более глубокого вникания потребуется еще проштудировать десяток RFC и разобраться с ASN.1/BER...


О чем и речь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.