Programaticamente obtendo detalhes do certificado de um executável

0

É possível, de alguma forma, exportar programaticamente o assunto de um certificado digital de um arquivo se o próprio certificado não estiver instalado na estação de trabalho, mas for usado apenas para assinar esse arquivo específico?

Eu preciso de alguma forma extrair essa informação de um arquivo e verificar se está correto. De preferência usando Python / CMD / PowerShell

EDITAR:

Desculpepelafaltadedetalhes.

Atualmente,estouusandoestescriptpython(quemodifiqueiparaexecutarnoPython3.6): link para analisar um arquivo .cer que extraí do arquivo executável original com essa pequena ferramenta que encontrei (que também modifiquei para trabalhar com o Python 3): link mas somente depois de convertê-lo de um binário codificado por DER para um base-64 com o certutil do Windows.

O problema com o script disitool, entretanto, é que ele literalmente gera uma 'assinatura' por meio do próprio executável usando o módulo python pefile, o que torna o arquivo .cer extraído inválido, conforme o erro python que continuo recebendo ao tentar carregar o certificado com o módulo 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')] 

Mas a análise de um bom certificado extraído (com o primeiro script que postei acima) funciona, como você pode ver aqui:

Então,eusóprecisodeumamaneiradeextrairocertificadodeumexecutável,euacho.Ou,sevocêachouaminhasoluçãomuitocomplicada,sevocêtemalgumaideiadecomoeupoderiaobterotexto"Redmond" do campo Assunto do certificado, estou muito aberto a idéias:)

    
por Claudiu Dragan 12.04.2018 / 15:45

1 resposta

2

Em Powershell:

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

Então, usando o seu exemplo de explorer.exe, isso teria Redmond:

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

Como você solicitou a elaboração, Get-AuthenticodeSignature retorna um objeto System.Management.Automation.Signature. Você pode descobrir isso de algumas maneiras. Pessoalmente eu prefiro atribuí-lo a uma variável para que eu possa brincar com o objeto retornado ainda mais. Depois de ter atribuído a uma variável, você pode aprender coisas sobre ela. Get-Member deve ser um dos seus cmdlets em Powershell. Neste caso:

$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...

Então você pode ver que o objeto tem alguns métodos e algumas propriedades (eu sei, todos os objetos). Nesse caso, os métodos são todos os padrões herdados de System.Object. As propriedades são interessantes. O SignerCertificate parece com o que você queria, então vamos ver o que parece:

$foo.SignerCertificate


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

O thumbrint é obviamente importante porque é o que identifica o certificado, mas você perguntou sobre o Redmond que está no assunto. Então agora sabemos como chegar a isso como uma string:

$foo.SignerCertificate.Subject

Portanto, é apenas uma análise de sequência direta daqui.

Mais um pedacinho que vou jogar, pois parece que você está aprendendo o Powershell. Outro cmdlet que você deve tentar regularmente é Get-Command. Neste caso, eu nem sabia que o cmdlet Get-AuthenticodeSignature existia antes de você fazer a pergunta. Então eu fiz isso:

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
    
por 12.04.2018 / 15:47