492 votes

Comment vérifier si un binaire est 32 ou 64 bits sous Windows ?

Existe-t-il un moyen simple de vérifier si un binaire est 32 ou 64 bits sous Windows ? J'ai besoin de vérifier avant de déplacer le programme sur une machine 32 bits et de subir un échec spectaculaire.

0 votes

Cette question est similaire Cependant, il faut un peu de travail pour le vérifier.

4 votes

@Guillaume : Les images exécutables ne sont pas des processus. Le gestionnaire de tâches n'affiche que les processus.

586voto

Alexander Revo Points 5588

Après avoir examiné les valeurs d'en-tête de La réponse de Richard J'ai trouvé une solution rapide, facile et qui ne nécessite qu'un éditeur de texte. Même le notepad.exe par défaut de Windows peut fonctionner.

  1. Ouvrez l'exécutable dans un éditeur de texte. Vous devrez peut-être faire un glisser-déposer ou utiliser de l'éditeur Open... parce que Windows n'affiche pas Open with... dans le menu contextuel des exécutables.

  2. Vérifier les premiers caractères imprimables après la première occurrence de PE . Il est fort probable que cette partie soit entourée d'au moins un espace blanc (voire de beaucoup d'espaces blancs), de sorte qu'elle peut être facilement visualisée.

Voici ce que vous allez trouver :

32 bits :

PE  L

64 bits :

PE  d†

Un mot d'avertissement : L'utilisation du Bloc-notes par défaut sur des fichiers volumineux peut être très lente, il est donc préférable de ne pas l'utiliser pour des fichiers de plus d'un mégaoctet ou quelques uns. Dans mon cas, il a fallu environ 30 secondes pour afficher un fichier de 12 MiB. Notepad++, en revanche, a été capable d'afficher un exécutable de 120 MiB presque instantanément.

Cette solution peut être utile dans le cas où vous devez inspecter un fichier sur une machine sur laquelle vous ne pouvez pas installer de logiciel supplémentaire.

Informations supplémentaires :

Si vous disposez d'un éditeur HEX, l'offset de la signature PE est situé à l'offset 0x3C . La signature est PE\0\0 (lettres "P" et "E" suivies de deux octets nuls), suivi d'un type de machine de deux octets en Little Endian.

Les valeurs pertinentes sont 0x8664 pour un exécutable 64 bits et 0x014c pour un 32 bits ( 64 86 y 4c 01 respectivement lorsqu'ils sont ajustés pour l'endiannité, mais tout éditeur hexagonal décent gère automatiquement l'endiannité lorsque vous recherchez une valeur hexagonale). Il existe beaucoup d'autres valeurs possibles, mais vous ne les rencontrerez probablement jamais, et vous ne serez pas en mesure d'exécuter de tels exécutables sur votre PC Windows.

La liste complète des types de machines, ainsi que le reste des spécifications de .exe, se trouve dans Spécification Microsoft PE et COFF Types de machines section.

37 votes

Hé, c'est plutôt bidon. Et c'est tant mieux, puisque cela semble être la solution la plus rapide et la plus simple dans la grande majorité des cas :)

8 votes

Rare cas où notepad a battu notepad++. Notepad l'affiche correctement, dans notepad vous devez vous embrouiller avec l'encodage pour qu'il s'affiche mais ça a marché !

0 votes

@zadane c'est intéressant. D'après mon expérience, Notepad++ utilise toujours l'encodage ANSI lors de l'ouverture d'un exécutable, mais il est certain que cela complique un peu la recherche du fragment nécessaire en affichant des octets nuls comme NUL à la place des espaces blancs.

168voto

codemac Points 689

L'outil SDK dumpbin.exe avec le /headers comprend ces informations, comparez les deux (j'ai ajouté des caractères gras pour les informations clés).

PS \[64\] E:\\ #4> dumpbin /headers C:\\Windows\\system32\\cmd.exe
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file C:\\Windows\\system32\\cmd.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            **8664 machine (x64)**
               6 number of sections
        4CE798E5 time date stamp Sat Nov 20 09:46:13 2010
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
              22 characteristics
                   Executable
                   Application can handle large (>2GB) addresses
\[...\]

y

PS \[64\] E:\\ #5> dumpbin /headers C:\\Windows\\syswow64\\cmd.exe
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file C:\\Windows\\syswow64\\cmd.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             **14C machine (x86)**
               4 number of sections
        4CE78E2B time date stamp Sat Nov 20 09:00:27 2010
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine
\[...\]

2 votes

Vous pourriez également voir (IA64) pour un exe Itanium 64 bits.

30 votes

Comme je l'ai lu ailleurs sur superuser, en utilisant dumpbin /headers | findstr "machine" simplifie grandement la présentation de ce que recherche l'AQ...

6 votes

Dumpbin.exe est situé ici : C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

79voto

briantist Points 991

Si vous n'avez pas ou ne voulez pas avoir le SDK Windows complet ou Visual Studio, vous pouvez utiliser sigcheck.exe de SysInternals :

sigcheck.exe C:\Windows\Notepad.exe

Sortie :

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

4 votes

Il semble que ce ne soit pas toujours exact : Essayez de l'utiliser avec LinqPad.exe (version AnyCPU-64bit) et Sigcheck vous dira que c'est "32 bit" ...

0 votes

@Matt intéressant. LinqPad semble être une application .net ; je me demande si sigcheck ne fonctionne correctement que sur les exécutables natifs (dans ce but).

3 votes

Oui, c'est une application .NET. Dans .NET, si elle n'est pas précompilée, vous pouvez cibler soit "x86" soit "AnyCPU". "x86" fonctionnera toujours en 32 bits, mais AnyCPU fonctionnera en 64 bits sur un système 64 bits, mais en 32 bits sur un système 32 bits. SigCheck devrait en tenir compte et afficher au moins ".NET 32 bit ou 64 bit (AnyCPU)". ILSpy par exemple dit dans ce cas "Architecture : AnyCPU (64-bit preferred)" - mais ILSpy ne fonctionnera pas pour les EXEs non-.NET.

71voto

Je peux confirmer que le file (par exemple, de cygwin) fera la distinction entre les exécutables 32 et 64 bits. Ils apparaissent comme suit :

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

Comme vous pouvez le voir, il est très évident de savoir lequel est lequel. De plus, il fait la distinction entre les exécutables de la console et ceux de l'interface graphique, ce qui est également évident.

1 votes

Cette solution est assez courante pour tous les développeurs qui ont installé msysgit.

1 votes

Pourquoi les fichiers exécutables dans Windows ont MZ au lieu de PE ?

1 votes

Il est intéressant de noter que les utilitaires GNU peuvent être obtenus sous forme de binaires individuels si vous n'avez pas besoin de Cygwin. gnuwin32.sourceforge.net/packages/file.htm

53voto

Ben Thul Points 2939

Beaucoup de gens ont l'excellent 7-zip installé, et ont ajouté le dossier 7-Zip à leur PATH . 7-zip comprend les formats de fichiers autres que ZIP et RAR, tels que les fichiers MSI et les exécutables PE. Il suffit d'utiliser la ligne de commande 7z.exe sur le fichier PE (Exe ou DLL) en question :

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

La sortie comprendra les lignes suivantes, avec le CPU la lecture de la ligne soit x86 o x64 ce qui est la question posée ici :

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

1 votes

Wow je ne savais pas que 7z pouvait faire ça. Probablement qu'il contient un file mise en œuvre à l'intérieur ?

1 votes

Fonctionne sur linux ! !!

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X