Questão Como verificar se um binário é 32 ou 64 bits no Windows?


Existe uma maneira fácil de verificar se um binário é de 32 ou 64 bits no Windows? Eu preciso verificar antes de mover o programa para uma máquina de 32 bits e experimentar uma falha espetacular.


257


origem


Esta questão é semelhante, no entanto, requer algum trabalho para verificá-lo. - ST3
@ Guillaume: Imagens executáveis ​​não são processos. O Gerenciador de Tarefas mostra apenas processos. - IInspectable


Respostas:


Depois de examinar os valores de cabeçalho de A resposta de RichardEu criei uma solução que é rápida, fácil e requer apenas um editor de texto. Mesmo o notepad.exe padrão do Windows funcionaria.

  1. Abra o executável no editor de texto. Você pode ter que arrastar e soltar ou usar o editor Open... diálogo, porque o Windows não mostra Open with... opção no menu de contexto para executáveis.

  2. Verifique os primeiros caracteres imprimíveis após a primeira ocorrência de PE. É mais provável que essa parte esteja cercada por pelo menos alguns espaços em branco (pode ser muito), por isso pode ser facilmente feita visualmente.

Aqui está o que você vai encontrar:

x86:

PE  L

x64:

PE  d†

Uma palavra de alerta: usar o Bloco de notas padrão em arquivos grandes pode ser muito lento, então é melhor não usá-lo para arquivos maiores que um megabyte ou poucos. No meu caso, levou cerca de 30 segundos para exibir um arquivo de 12 MiB. O Notepad ++, no entanto, conseguiu exibir um executável de 120 MiB quase instantaneamente.

Esta solução pode ser útil caso você precise inspecionar um arquivo em uma máquina na qual não é possível instalar nenhum software adicional.

Informação adicional:

Se você tiver um editor HEX disponível, o deslocamento da assinatura PE está localizado no deslocamento 0x3C. A assinatura é PE\0\0 (letras "P" e "E" seguidas por dois bytes nulos), seguidas por um Tipo de Máquina de dois bytes em Little Endian.

Os valores relevantes são 0x8664 para x64 executável e 0x14c para x86. Há muito mais valores possíveis, mas você provavelmente nunca encontrará qualquer um desses, ou poderá executar tais executáveis ​​no seu PC Windows.

Lista completa de tipos de máquinas, juntamente com o resto das especificações .exe podem ser encontradas em Especificação Microsoft PE e COFF  Tipos de máquinas seção.


269



Ei, isso é bastante hacky. E para melhor, já que isso realmente parece ser a solução mais rápida e fácil para a grande maioria dos casos :) - Septagram
Exemplo raro quando o bloco de notas bateu o notepad ++. Notepad mostra isso direito, no bloco de notas você tem mexer com a codificação para obtê-lo para mostrar, mas funcionou! - zar
@CoDEmanX esta opção significa que o IDE ou JIT faz a escolha para você. Vejo essa questãoou isto postagem no blog para mais detalhes. - Alexander Revo
@Inspectable se você tivesse realmente se dado ao trabalho de ler o post inteiro antes de downvoting, você teria visto o link para Microsoft PE and COFF Specification, que é tanto um contrato documentado quanto possível, bem como instruções sobre como encontrar o endereço exato do cabeçalho PE em qualquer .exe Arquivo. Se você tem uma fonte mais confiável do que a especificação oficial da Microsoft no formato executável da própria Microsoft, eu adoraria saber o que é isso. - Alexander Revo
Para arquivos que começam com "MZ", você precisa procurar um pouco mais. Eu encontrei PE..L no offset 0x110, logo após "RichMQ _........". - jnnnnn


A ferramenta SDK dumpbin.exe com o /headers opção inclui esta informação, compare estes dois (eu adicionei negrito para a informação chave)

PS [64] E: \ # 4> dumpbin / cabeçalhos C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Dumper Versão 10.00.40219.01
Direitos autorais (C) Microsoft Corporation. Todos os direitos reservados.


Despejo do arquivo C: \ Windows \ system32 \ cmd.exe

Assinatura PE encontrada

Tipo de arquivo: IMAGEM EXECUTÁVEL

VALORES DE CABEÇALHO DE ARQUIVO
             8664 máquinas (x64)
               6 número de seções
        4CE798E5 data date stamp Sat Nov 20 09:46:13 2010
               0 ponteiro de arquivo para a tabela de símbolos
               0 número de símbolos
              Tamanho F0 do cabeçalho opcional
              22 características
                   Executável
                   Aplicação pode lidar com endereços grandes (> 2GB)
[...]

e

PS [64] E: \ # 5> dumpbin / cabeçalhos C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper Versão 10.00.40219.01
Direitos autorais (C) Microsoft Corporation. Todos os direitos reservados.


Despejo do arquivo C: \ Windows \ syswow64 \ cmd.exe

Assinatura PE encontrada

Tipo de arquivo: IMAGEM EXECUTÁVEL

VALORES DE CABEÇALHO DE ARQUIVO
              Máquina 14C (x86)
               4 número de seções
        4CE78E2B data e hora marcadas Sat Nov 20 09:00:27 2010
               0 ponteiro de arquivo para a tabela de símbolos
               0 número de símbolos
              Tamanho E0 do cabeçalho opcional
             102 características
                   Executável
                   Máquina de 32 bits
[...]

108



Você também pode ver (IA64) para um exe Itanium de 64 bits. - Darryl Braaten
como eu li em outro lugar no superusuário, usando dumpbin /headers | findstr "machine" simplifica muito a apresentação do que o QA está procurando ... - user1055604
Dumpbin.exe está localizado aqui: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David: não necessariamente (versão diferente do VS, não usando o local de instalação padrão, usando a versão do Windows SDK): é por isso que não especifiquei. - Richard
É mais fácil usar o dumpbin se você iniciá-lo a partir da linha de comando do visual studio: stackoverflow.com/a/477389/1390430 - Ben


Se você não tem ou quer todo o Windows SDK ou Visual Studio, você pode usar sigcheck.exe de SysInternals:

sigcheck.exe C:\Windows\Notepad.exe

Saída:

Sigcheck v2.1 - File version and signature viewer
Copyright (C) 2004-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\windows\notepad.exe:
    Verified:       Signed
    Signing date:   8:59 AM 8/22/2013
    Publisher:      Microsoft Windows
    Description:    Notepad
    Product:        Microsoft« Windows« Operating System
    Prod version:   6.3.9600.16384
    File version:   6.3.9600.16384 (winblue_rtm.130821-1623)
    MachineType:    64-bit

40



Parece não ser sempre preciso: Tente usá-lo com LinqPad.exe (versão AnyCPU-64bit) e Sigcheck dirá que é "32 bit" ... - Matt
@Matt interessante. LinqPad soa como um aplicativo .net; Gostaria de saber se sigcheck só funciona corretamente em executáveis ​​nativos (para este fim). - briantist
Sim, é um aplicativo .NET. No .NET, se não for pré-compilado, você pode segmentar "x86" ou "AnyCPU". "x86" sempre será executado como 32 bits, mas AnyCPU será executado como 64 bits em um sistema de 64 bits, mas como 32 bits em um sistema de 32 bits. O SigCheck deve considerar isso e mostrar pelo menos ".NET 32 bit ou 64 bit (AnyCPU)". O ILSpy, por exemplo, diz neste caso "Architecture: AnyCPU (64-bit preferred)" - mas o ILSpy não funcionará para EXEs que não sejam .NET. - Matt
Esse pode ser o caso, como o velho cabeçalho "MZ", que está lá apenas para o sistema operacional não-Windows ("DOS") dizendo "Esta aplicação requer o Microsoft Windows" ... ;-) - Matt
Sim, nos bons velhos tempos, onde você tinha um depurador DOS no shell e poderia desmontar o código (que continha apenas uma única chamada do DOS imprimindo esta mensagem) ... e substituir o texto por "A resposta é 42". :-D - Matt


Posso confirmar que o file utilitário (por exemplo, do cygwin) distinguirá entre executáveis ​​de 32 e 64 bits. Eles aparecem da seguinte maneira:

32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows

Como você pode ver, é muito óbvio qual é qual. Além disso, distingue entre executáveis ​​de console e GUI, também óbvio qual é qual.


32



Esta solução é comumente disponível para qualquer desenvolvedor que tenha instalado o msysgit. - FrontierPsycho
Por que arquivos executáveis ​​no Windows MZ ao invés de PE? - Mohammadreza Panahi


Um método simples é executá-lo (supondo que você confie nele) e dê uma olhada na guia do processo no gerenciador de tarefas. Processos de 32 bits mostrarão "* 32" no final do nome do processo. Se não é algo que você está disposto a correr no seu computador, você pode tentar EXE Explorer. Ele mostrará um monte de informações sobre executáveis, incluindo 32 ou 64 bits.


30



Infelizmente, isso requer que você execute o executável. Talvez você precise verificar a arquitetura do programa como um método de solução de problemas por que ele não está sendo executado. - Mike Christiansen
Como você executar uma DLL? - user34660
@ user34660 RUNDLL32.EXE <dllname>, <entrypoint> - samsara
@ samusarin que deveria estar no post. - user34660
@ user34660 Você está tecnicamente correto, uma DLL não tem main ponto de entrada e, portanto, não será executado como um processo autônomo. Há uma função de inicialização chamada quando é carregada, mas não é "principal". - samsara


A versão de 64 bits do Process Explorer posso te dizer. Basta executar o executável e abrir a janela de propriedades do processo. Na aba principal há uma entrada que diz "Image: 32 Bit" ou "Image: 64 Bit".

enter image description here


18



Simply run the executable E se você não quiser corre o programa? - Synetech
@Synetech A questão original não implica que seja o caso. - Andrew Lambert
Este é o método mais fácil para mim, a menos que o executável saia rápido demais. - starbeamrainbowlabs
Como você executar uma DLL? - user34660


Muitas pessoas têm o excelente 7-zip instalados e adicionaram a pasta 7-Zip ao seu PATH. O 7-zip entende formatos de arquivo diferentes de ZIP e RAR, como arquivos MSI e executáveis ​​PE. Basta usar a linha de comando 7z.exe no arquivo PE (Exe ou DLL) em questão:

7z l some.exe | more
7z l some.exe | findstr CPU

A saída incluirá linhas da seguinte maneira, com o CPU leitura de linha quer x86 ou x64, que é o que está sendo perguntado aqui:

Path = C:\Extra\AV\neroAacEnc.exe
Type = PE
CPU = x86
Characteristics = Executable 32-bit

Path = C:\Extra\AV\LAME\lame_enc.dll
Type = PE
CPU = x86
Characteristics = Executable DLL 32-bit

Path = C:\Extra\AV\FFmpeg\bin\ffmpeg.exe
Type = PE
CPU = x64
64-bit = +
Characteristics = Executable LargeAddress NoRelocs NoLineNums NoLocalSyms NoDebugInfo

Path = C:\Extra\AV\FFmpeg\bin\avcodec-56.dll
Type = PE
CPU = x64
64-bit = +
Characteristics = Executable DLL LargeAddress NoLineNums NoLocalSyms NoDebugInfo

18





O método de executar um executável e, em seguida, verificar no processo explorer ou ferramenta semelhante, tem algumas desvantagens óbvias:

  1. Temos que executar o processo.
  2. Para os processos de curta duração (como echo hello world types.), O explorador de processos pode nem mesmo registrar que um novo processo foi iniciado.

O método Dumpbin.exe pode resolver o propósito provavelmente.

Outra alternativa seria usar o cygwin Arquivo comando. No entanto, eu não testei no windows. Funciona bem em Linuxes.

Usage: file program_under_test.exe

EDIT: apenas testado file.exe na janela. funciona bem. :)


13



Só queria dizer que há algumas situações em que o método de Dracs não será muito útil. - anishsane
>> Isso ainda requer a execução do programa que o autor queria evitar: Não .. nós executamos como: file.exe program_under_test.exe - anishsane
E aqueles que desejam evitar instalar o todo cygwin pacote pode pegar o gnuwin32 file pacote. - Bob
@anishsane Completamente errado. file simplesmente lê dados do disco em formato binário e verifica se há números mágicos identificando-os, comparando com um banco de dados. Os programas de 32 bits do Windows surgem como PE32, e ambos os programas de 64 bits e .NET aparecem como PE32 +. A pontinha de file em si faz absolutamente diferença zero - aplicativos de 32 bits e 64 bits podem ler dados do disco, o que é tudo o que precisa. - Bob
@MarcH Ha! que é interessante. Eu estou supondo que isso significa que o stub de tempo de execução do .NET é de 32 bits. Portanto, ele executa um processo de 32 bits por uma fração de segundo, mas todo esse processo inicia o tempo de execução do .NET, que cria um processo nativo de 64 bits. - clacke