Pregunta ¿Cómo verificar si un binario es de 32 o 64 bits en Windows?


¿Hay alguna manera fácil de verificar si un binario es de 32 o 64 bits en Windows? Necesito verificar antes de mover el programa a una máquina de 32 bits y experimentar una falla espectacular.


257


origen


Esta pregunta es similarSin embargo, requiere un poco de trabajo para comprobarlo. - ST3
@Guillaume: las imágenes ejecutables no son procesos. El Administrador de tareas solo muestra procesos. - IInspectable


Respuestas:


Después de examinar los valores del encabezado de La respuesta de Richard, Se me ocurrió una solución que es rápida, fácil y solo requiere un editor de texto. Incluso notepad.exe predeterminado de Windows funcionaría.

  1. Abra el ejecutable en el editor de texto. Es posible que tengas que arrastrar y soltar o usar el editor Open... diálogo, porque Windows no muestra Open with... opción en el menú contextual para ejecutables.

  2. Compruebe los primeros caracteres imprimibles después de la primera aparición de PE. Es probable que esta parte esté rodeada, al menos, por un espacio en blanco (podría ser una gran cantidad), por lo que se puede realizar fácilmente visualmente.

Esto es lo que vas a encontrar:

x86:

PE  L

x64:

PE  d†

Una palabra de advertencia: usar el Bloc de notas predeterminado en archivos grandes puede ser muy lento, así que mejor no usarlo para archivos de más de un megabyte o pocos. En mi caso, tomó aproximadamente 30 segundos para mostrar un archivo de 12 MiB. Notepad ++, sin embargo, fue capaz de mostrar un ejecutable 120 MiB casi al instante.

Esta solución puede ser útil en caso de que necesite inspeccionar un archivo en una máquina en la que no puede instalar ningún software adicional.

Información adicional:

Si tiene un HEX-Editor disponible, el desplazamiento de PE Signature se encuentra en offset 0x3C. La firma es PE\0\0 (letras "P" y "E" seguidas de dos bytes nulos), seguidas por un tipo de máquina de dos bytes en Little Endian.

Los valores relevantes son 0x8664 para x64 ejecutable y 0x14c para x86. Hay muchos más valores posibles, pero probablemente nunca encontrará ninguno de estos, o podrá ejecutar dichos ejecutables en su PC con Windows.

La lista completa de tipos de máquinas, junto con el resto de las especificaciones .exe se puede encontrar en Especificación de Microsoft PE y COFF  Tipos de máquinas sección.


269



Oye, esto es bastante hacky. Y para mejor, ya que esta parece ser la solución más rápida y fácil para la gran mayoría de los casos :) - Septagram
Ejemplo raro cuando el bloc de notas golpea el bloc de notas ++. El Bloc de notas muestra esto a la derecha, en el bloc de notas se ha perdido la codificación para que se muestre, ¡pero funcionó! - zar
@CoDEmanX esta opción significa que IDE o JIT hacen la elección por usted. Ver esta pregunta o esto entrada en el blog para más detalles. - Alexander Revo
@Inspectable si realmente se hubiera tomado la molestia de leer toda la publicación antes de rechazarla, habría visto el enlace a Microsoft PE and COFF Specification, que es tanto un contrato documentado como se puede obtener, así como las instrucciones sobre cómo encontrar la dirección exacta del encabezado PE en cualquier .exe archivo. Si tiene una fuente más confiable que la especificación oficial de Microsoft en el formato ejecutable propio de Microsoft, me gustaría saber de qué se trata. - Alexander Revo
Para los archivos que comienzan con "MZ", debe buscar un poco más. Encontré PE..L en offset 0x110, justo después de "RichMQ _........". - jnnnnn


La herramienta SDK dumpbin.exe con el /headers opción incluye esta información, compare estos dos (he agregado negrita para la información clave)

PS [64] E: \ # 4> dumpbin / headers C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Dumper versión 10.00.40219.01
Copyright (C) Microsoft Corporation. Todos los derechos reservados.


Volcado del archivo C: \ Windows \ system32 \ cmd.exe

Se encontró una firma de PE

Tipo de archivo: IMAGEN EJECUTABLE

VALORES DE LA CABEZA DEL ARCHIVO
             Máquina 8664 (x64)
               6 cantidad de secciones
        4CE798E5 sello de fecha y hora sáb 20 nov 09:46:13 2010
               0 puntero de archivo a la tabla de símbolos
               0 cantidad de símbolos
              Tamaño F0 del encabezado opcional
              22 características
                   Ejecutable
                   La aplicación puede manejar direcciones grandes (> 2 GB)
[...]

y

PS [64] E: \ # 5> dumpbin / headers C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper versión 10.00.40219.01
Copyright (C) Microsoft Corporation. Todos los derechos reservados.


Volcado del archivo C: \ Windows \ syswow64 \ cmd.exe

Se encontró una firma de PE

Tipo de archivo: IMAGEN EJECUTABLE

VALORES DE LA CABEZA DEL ARCHIVO
              Máquina 14C (x86)
               4 cantidad de secciones
        4CE78E2B sello de fecha y hora sáb 20 de noviembre a las 09:00:27 2010
               0 puntero de archivo a la tabla de símbolos
               0 cantidad de símbolos
              E0 tamaño del encabezado opcional
             102 características
                   Ejecutable
                   Máquina de palabras de 32 bits
[...]

108



También podría ver (IA64) para un exe Itanium de 64 bits. - Darryl Braaten
como lo leí en otra parte en superusuario, usando dumpbin /headers | findstr "machine" simplifica enormemente la presentación de lo que el QA está buscando ... - user1055604
Dumpbin.exe se encuentra aquí: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David: no necesariamente (versión diferente de VS, no usa la ubicación de instalación predeterminada, usa la versión del SDK de Windows): es por eso que no especifiqué. - Richard
Es más fácil usar dumpbin si lo ejecutas desde la línea de comandos del estudio visual: stackoverflow.com/a/477389/1390430 - Ben


Si no tiene o no quiere todo el Windows SDK o Visual Studio, puede usar sigcheck.exe de SysInternals:

sigcheck.exe C:\Windows\Notepad.exe

Salida:

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 que no siempre es preciso: intente utilizarlo con LinqPad.exe (versión AnyCPU-64bit) y Sigcheck le dirá que es "32 bit" ... - Matt
@Matt interesante. LinqPad suena como una aplicación .net; Me pregunto si sigcheck solo funciona correctamente en ejecutables nativos (para este propósito). - briantist
Sí, es una aplicación .NET. En .NET, si no está precompilado, puede apuntar a "x86" o a "AnyCPU". "x86" siempre se ejecutará como 32 bits, pero AnyCPU se ejecutará como 64 bits en un sistema de 64 bits, pero como 32 bits en un sistema de 32 bits. SigCheck debería considerar esto y mostrar al menos ".NET 32 bit o 64 bit (AnyCPU)". ILSpy, por ejemplo, dice en este caso "Arquitectura: AnyCPU (preferido de 64 bits)", pero ILSpy no funcionará para los EXE que no son de .NET. - Matt
Ese podría ser el caso, como el viejo encabezado "MZ" que simplemente está ahí para sistemas operativos que no son de Windows ("DOS") diciendo "Esta aplicación requiere Microsoft Windows" ... ;-) - Matt
Sí, los buenos viejos tiempos, donde tenía un depurador de DOS en el shell y podía desensamblar el código (que solo contenía una sola llamada de DOS imprimiendo este mensaje) ... y reemplazar el texto por "La respuesta es 42". :-RE - Matt


Puedo confirmar que el file la utilidad (por ejemplo, de cygwin) distinguirá entre ejecutables de 32 y 64 bits. Ellos aparecen de la siguiente manera:

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

Como puede ver, es muy obvio cuál es cuál. Además, distingue entre la consola y los ejecutables GUI, también es obvio cuál es cuál.


32



Esta solución es bastante común disponible para cualquier desarrollador que haya instalado msysgit. - FrontierPsycho
Por qué los archivos ejecutables en Windows tienen MZ en lugar de PE? - Mohammadreza Panahi


Un método simple es ejecutarlo (suponiendo que confíes en él) y echar un vistazo a la pestaña del proceso en el administrador de tareas. Los procesos de 32 bits mostrarán "* 32" al final del nombre del proceso. Si no es algo que estés dispuesto a ejecutar en tu computadora, puedes probar EXE Explorer. Mostrará una gran cantidad de información sobre ejecutables, incluyendo si es de 32 o 64 bits.


30



Desafortunadamente, esto requiere que ejecutes el ejecutable. Quizás necesite verificar la arquitectura del programa como un método de solución de problemas sobre por qué no se está ejecutando. - Mike Christiansen
Como hacer tú ejecutar una DLL? - user34660
@ user34660 RUNDLL32.EXE <dllname>, <entrypoint> - samsara
@samusarin que debería estar en la publicación. - user34660
@ user34660 Estás técnicamente correcto, una DLL no tiene una main punto de entrada y por lo tanto no se ejecutará como un proceso independiente. Hay una función de inicialización llamada cuando se carga, pero que no es "principal". - samsara


La versión de 64 bits de Process Explorer puede decirte. Simplemente ejecute el ejecutable y abra la ventana de propiedades del proceso. En la pestaña principal hay una entrada que dice "Imagen: 32 bits" o "Imagen: 64 bits".

enter image description here


18



Simply run the executable Y que tal si no quieres correr ¿el programa? - Synetech
@Synetech La pregunta original no implica que ese sea el caso. - Andrew Lambert
Este es el método más fácil para mí, creo, a menos que el ejecutable salga demasiado rápido. - starbeamrainbowlabs
Como hacer tú ejecutar una DLL? - user34660


Mucha gente tiene el excelente 7-zip instalado, y han agregado la carpeta 7-Zip a su PATH. 7-zip entiende formatos de archivo distintos de ZIP y RAR, como archivos MSI y ejecutables PE. Simplemente usa la línea de comando 7z.exe en el archivo PE (Exe o DLL) en cuestión:

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

La salida incluirá líneas de la siguiente manera, con el CPU línea de lectura ya sea x86 o x64, que es lo que se pregunta aquí:

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