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


0

Можна якось програмно експортувати предмет цифрового сертифіката файлу, якщо сам сертифікат не встановлений на робочій станції, а використовується лише для підписання цього конкретного файлу?

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

Що мені потрібно

Редагувати:

Вибачте за відсутність деталей.

Зараз я використовую цей скрипт 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 Certutil.

Проблема з сценарієм disitool полягає в тому, що він буквально РЕЗУЛЬТУє байт-масив 'підпису' від самого виконуваного файлу за допомогою модуля python 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')] 

Але аналіз хорошого вилученого сертифіката (з першим сценарієм, який я опублікував вище) працює, як ви бачите тут:

Парсинг працює чудово]

Отже, мені просто потрібен спосіб витягнути сертифікат із виконуваного файлу. Або якщо ви знайшли моє рішення занадто складним, якщо ви маєте уявлення, як я міг отримати цей текст "Редмонда" з поля "Тема сертифіката", я дуже відкритий до ідей :)


Оскільки ми не є сервісом написання сценарію. Буде вдячно, якщо ви включите те, що ви намагалися.
Рамхаунд

@Ramhound Я знаю, що я жахлива людина ...
EBGreen

@EBGreen - У мене є будь-які проблеми з цим питанням, що стосуються дослідницьких зусиль автора, ви, на мою думку, добре відповідаєте на це.
Рамхаунд

Коментар був жартом. :)
EBGreen

@EBGreen - Гумор часом мене цілком уникає.
Рамхаунд

Відповіді:


2

У Powershell:

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

Отже, використовуючи ваш приклад explorer.exe, це отримає Редмонда:

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

Оскільки ви попросили розробити, Get-AuthenticodeSignatureповертає об'єкт System.Management.Automation.Signature. Ви можете дізнатися це кількома способами. Особисто я вважаю за краще призначити його змінній, щоб я міг грати з поверненим об'єктом далі. Як тільки ви призначите його змінній, ви зможете дізнатися про неї. Get-Memberмає бути одним із ваших відвідувань cmdlets у 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 {get;}
Path                   Property   string Path {get;}
SignatureType          Property   System.Management.Automation.SignatureType SignatureType {get;}
SignerCertificate      Property   System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {...
Status                 Property   System.Management.Automation.SignatureStatus Status {get;}
StatusMessage          Property   string StatusMessage {get;}
TimeStamperCertificate Property   System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific...

Тож ви можете бачити, що об’єкт має деякі методи та деякі властивості (я знаю, всі об’єкти це роблять). У цьому випадку методи - це всі стандартні, які успадковуються від System.Object. Властивості, хоча цікаві. Сертифікат SignerCertificate виглядає як те, що ви хотіли, тож давайте подивимося, як це виглядає:

$foo.SignerCertificate


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

Thumbrint, очевидно, важливий, тому що це те, що ідентифікує cert, але ви запитували про Редмонда, який є у цій темі. Отже, тепер ми знаємо, як дійти до цього як рядка:

$foo.SignerCertificate.Subject

Тож це просто прямий розбір рядків звідси.

Ще один примх, який я зауважу, оскільки, здається, ви навчитеся Пауершелу. Ще один командлет, який слід регулярно намагатися, - 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

1
До речі, це те саме, що я вам сказав на запитання, яке ви видалили ...
EBGreen

Я видалив інший, тому що він був позначений як поза темою, і було запропоновано, що я поставив своє запитання на суперпользователя. Дякуємо за Ваш коментар! Я спробував вашу команду Powershell, але не знаю, як витягти цей "Редмонд" біт з відбитка пальця сертифіката, який повертає команда. Чи можете ви трохи розробити, будь ласка?
Клавдіу Драган

Якби ви вказали цю деталь в іншій, вона не закрилася б.
EBGreen

Дякуємо за Ваш відповідь! Я позначив вашу відповідь правильною відповіддю, але мені було цікаво: якщо файл підписаний двома різними сертифікатами, яким би був синтаксис PS, щоб отримати тему другого підпису? Я спробував "(Get-AuthenticodeSignature" шлях до файлу "). SignerCertificate [0] .предмет і він повертає перше, але" (Get-AuthenticodeSignature "шлях до файлу"). SignerCertificate [1] .subject схоже, не повертається другий
Клавді Драган

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.