Программно получить сведения о сертификате исполняемого файла

641
Claudiu Dragan

Можно каким-то образом программно экспортировать тему цифрового сертификата файла, если сам сертификат не установлен на рабочей станции, а используется только для подписи этого конкретного файла?

Мне нужно как-то извлечь эту информацию из файла и проверить, если это правильно. Предпочтительно использовать Python / CMD / PowerShell

What I need

РЕДАКТИРОВАТЬ:

Извините за отсутствие деталей.

В настоящее время я использую этот скрипт на python (который я изменил для запуска на Python 3.6): http://www.zedwood.com/article/python-openssl-x509-parse-certificate для анализа файла .cer, который я извлек из оригинальный исполняемый файл с этим небольшим инструментом, который я нашел (который я также модифицировал для работы с Python 3): https://blog.didierstevens.com/programs/disitool/, но только после того, как я преобразовал его из двоичного кода, закодированного в DER на базу-64 с сертификатом Windows.

Однако проблема со сценарием disitool заключается в том, что он буквально обрезает байтовый массив «сигнатуры» из самого исполняемого файла с помощью модуля pefile python, что делает извлеченный файл .cer недействительным в соответствии с ошибкой python, которую я продолжаю получать при попытке загрузить сертификат с модулем OpenSSL.crypto:

 [('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error'), ('asn1 encoding routines', 'asn1_template_noexp_d2i', 'nested asn1 error'), ('PEM routines', 'PEM_ASN1_read_bio', 'ASN1 lib')] 

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

Parsing works just fine]

Итак, мне просто нужен способ извлечь сертификат из исполняемого файла, я думаю. Или, если вы нашли мое решение слишком сложным, если у вас есть идея, как я могу получить этот текст «Редмонд» из поля «Тема» сертификата, я очень открыт для идей :)

0
Так как мы не являемся сервисом написания скриптов. Был бы признателен, если вы включите, что вы пытались. Ramhound 6 лет назад 0
@ Ramhound Я знаю, что я ужасный человек ... EBGreen 6 лет назад 0
@EBGreen - Любые проблемы, с которыми я сталкиваюсь в этом вопросе, касаются исследовательских усилий автора, вы, по-моему, можете ответить на них. Ramhound 6 лет назад 0
Комментарий был шуткой. :) EBGreen 6 лет назад 0
@EBGreen - Время от времени юмор полностью ускользает от меня. Ramhound 6 лет назад 0
@ Честно говоря, мой юмор часто ускользает от большинства людей. EBGreen 6 лет назад 0
Извините за отсутствие деталей. Claudiu Dragan 6 лет назад 0
Я отредактировал основной пост для уточнения Claudiu Dragan 6 лет назад 0
Если бы вы поместили эту деталь в вопрос о стековом потоке, он, вероятно, не был бы закрыт там. EBGreen 6 лет назад 0

1 ответ на вопрос

2
EBGreen

В Powershell:

Get-AuthenticodeSignature C:\Path\TO\File.exe 

Итак, используя ваш пример explorer.exe, вы получите Redmond:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split(',')[2].split('=')[1] 

Поскольку вы запросили детализацию, Get-AuthenticodeSignatureвозвращает объект System.Management.Automation.Signature. Вы можете узнать это несколькими способами. Лично я предпочитаю назначать его переменной, чтобы я мог поиграть с возвращенным объектом дальше. После того, как вы присвоили ей переменную, вы можете узнать о ней кое-что. Get-Memberдолжен быть одним из ваших командлетов в Powershell. В этом случае:

$foo = Get-AuthenticodeSignature C:\Windows\explorer.exe Get-Member -InputObject $foo TypeName: System.Management.Automation.Signature  Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() IsOSBinary Property bool IsOSBinary  Path Property string Path  SignatureType Property System.Management.Automation.SignatureType SignatureType  SignerCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {... Status Property System.Management.Automation.SignatureStatus Status  StatusMessage Property string StatusMessage  TimeStamperCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific... 

Таким образом, вы можете видеть, что у объекта есть некоторые методы и некоторые свойства (я знаю, все объекты имеют). В этом случае все методы являются стандартными, которые унаследованы от System.Object. Свойства, хотя и интересны. Сертификат Signer выглядит так, как вы хотели, поэтому давайте посмотрим, как это выглядит:

$foo.SignerCertificate   Thumbprint Subject ---------- ------- 419E77AED546A1A6CF4DC23C1F977542FE289CF7 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US 

Очевидно, что отпечаток пальца важен, потому что именно он идентифицирует сертификат, но вы спросили о Redmond, который находится в теме. Итак, теперь мы знаем, как добраться до этого в виде строки:

$foo.SignerCertificate.Subject 

Так что это просто разбор строки прямо отсюда.

Еще один кусочек, который я добавлю, так как кажется, что вы, возможно, изучаете Powershell. Другой командлет, который вы должны регулярно использовать, - это Get-Command. В этом случае я даже не знал, что командлет Get-AuthenticodeSignature существовал до того, как вы задали вопрос. Итак, я сделал это:

Get-Command *signature*  CommandType Name Version Source ----------- ---- ------- ------ Function Update-MpSignature 1.0 Defender Cmdlet Get-AuthenticodeSignature 3.0.0.0 Microsoft.PowerShell.Security Cmdlet Save-VolumeSignatureCatalog 1.0.0.0 ShieldedVMDataFile Cmdlet Set-AuthenticodeSignature 3.0.0.0 Microsoft.PowerShell.Security 
Кстати, это то же самое, что я сказал вам в вопросе, который вы удалили ... EBGreen 6 лет назад 1
Я удалил другой, потому что он был помечен как не по теме, и было предложено разместить мой вопрос на суперпользователе. Спасибо за ваш комментарий! Я попробовал вашу команду Powershell, но я не знаю, как извлечь этот бит "Redmond" из отпечатка пальца сертификата, который возвращает команда. Можете ли вы уточнить немного, пожалуйста? Claudiu Dragan 6 лет назад 0
Если бы вы поместили эту деталь в другую, она бы не закрылась. EBGreen 6 лет назад 0
Спасибо за ваш ответ! Я пометил ваш ответ как правильный ответ, но мне было интересно: если файл подписан двумя разными сертификатами, какой будет синтаксис PS для получения субъекта второй подписи? Я пытался '(Get-AuthenticodeSignature "путь к файлу"). SignerCertificate [0] .subject и возвращает первый, но' (Get-AuthenticodeSignature "путь к файлу"). SignerCertificate [1] .subject кажется, не возвращает второй Claudiu Dragan 6 лет назад 0
https://i.stack.imgur.com/nciTM.png Claudiu Dragan 6 лет назад 0
@ClaudiuDragan Не уверен, чтобы быть честным с вами. Я не много работаю с сертификатами. Это похоже на два разных метода хеширования для одного сертификата. Если на самом деле есть два сертификата, то я ожидаю, что это получит второе `(Get-AuthenticodeSignature" path-to-file ") [1] .SignerCertificate.subject` EBGreen 6 лет назад 0
Это не работает, но спасибо за предложение :) Claudiu Dragan 6 лет назад 0
Что ж, если вы знаете о системном файле, который я должен иметь на компьютере с Windows, который демонстрирует такое поведение, я, вероятно, мог бы понять это, но, если не считать, у меня, вероятно, нет идей. EBGreen 6 лет назад 0
@ClaudiuDragan - у меня нет времени, чтобы пройти через это, но эта статья выглядит как то, что вам нужно делать: https://www.sysadmins.lv/blog-en/reading-multiple-signatures-from-signed- файл-с-powershell.aspx EBGreen 6 лет назад 0
Да, сейчас, пройдя через шаги. Спасибо! Claudiu Dragan 6 лет назад 0