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


Existe-t-il un moyen facile de vérifier si un binaire est 32 ou 64 bits sous Windows? Je dois vérifier avant de déplacer le programme sur une machine 32 bits et faire face à un échec spectaculaire.


257
2017-11-17 10:29


origine


Cette question est similaire, cependant, il faut travailler pour le vérifier. - ST3
@ Guillaume: Les images exécutables ne sont pas des processus. Le gestionnaire de tâches affiche uniquement les processus. - IInspectable


Réponses:


Après avoir examiné les valeurs d’en-tête de La réponse de Richard, Je suis venu avec une solution qui est rapide, facile et ne nécessite qu'un éditeur de texte. Même notepad.exe par défaut de Windows fonctionnerait.

  1. Ouvrez l'exécutable dans l'éditeur de texte. Vous devrez peut-être glisser-déposer ou utiliser les éditeurs Open... boîte de dialogue, car Windows ne montre pas Open with... option dans le menu contextuel pour les exécutables.

  2. Vérifiez les premiers caractères imprimables après la première occurrence de PE. Cette partie est le plus susceptible d’être entourée d’au moins certains espaces (ce qui peut être beaucoup), de sorte qu’elle peut être facilement faite visuellement.

Voici ce que vous allez trouver:

x86:

PE  L

x64:

PE  d†

Un mot d'avertissement: L'utilisation du Bloc-notes par défaut sur les gros fichiers 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 de peu. Dans mon cas, il a fallu environ 30 secondes pour afficher un fichier de 12 Mio. Notepad ++, cependant, pouvait afficher un exécutable de 120 Mio presque instantanément.

Cette solution peut être utile si vous devez inspecter un fichier sur une machine sur laquelle vous ne pouvez installer aucun logiciel supplémentaire.

Information additionnelle:

Si vous avez un éditeur HEX disponible, le décalage de la signature PE est situé au décalage 0x3C. La signature est PE\0\0 (lettres "P" et "E" suivies de deux octets nuls), suivies par un type de machine de deux octets dans Little Endian.

Les valeurs pertinentes sont 0x8664 pour x64 exécutable et 0x14c pour x86. Il y a beaucoup plus de valeurs possibles, mais vous n'en rencontrerez probablement jamais, ou vous pourrez 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 .exe se trouvent dans Spécification Microsoft PE et COFF  Types de machine section.


270
2018-03-13 17:08



Hé, c'est plutôt pirate. Et pour le mieux, car cela semble être la solution la plus rapide et la plus facile pour la grande majorité des cas :) - Septagram
Instance rare lorsque le bloc-notes bat le notepad ++. Notepad montre bien, dans le bloc-notes, vous avez des problèmes avec l'encodage pour le faire apparaître, mais cela a fonctionné! - zar
@CoDEmanX cette option signifie que l'IDE ou JIT fait le choix pour vous. Voir cette question ou ca article de blog pour plus de détails. - Alexander Revo
@IInspectable si vous aviez pris la peine de lire l'intégralité de l'article avant de le voter, vous auriez vu le lien vers Microsoft PE and COFF Specification, qui est autant un contrat documenté que possible, ainsi que des instructions sur la manière de trouver l’adresse exacte de l’entête .exe fichier. Si vous avez une source plus fiable que les spécifications officielles de Microsoft sur le format exécutable de Microsoft, j'aimerais savoir ce que c'est. - Alexander Revo
Pour les fichiers commençant par "MZ", vous devez aller plus loin. J'ai trouvé PE..L à l'offset 0x110, juste après "RichMQ _........". - jnnnnn


L'outil SDK dumpbin.exe avec le /headers option inclut cette information, comparez ces deux (j'ai ajouté gras pour l'information clé)

PS [64] E: \ # 4> dumpbin / headers C: \ Windows \ system32 \ cmd.exe
Version de Dumper Microsoft (R) COFF / PE 10.00.40219.01
Copyright (C) Microsoft Corporation. Tous les droits sont réservés.


Vidage du fichier C: \ Windows \ system32 \ cmd.exe

Signature PE trouvée

Type de fichier: IMAGE EXECUTABLE

FILE HEADER VALUES
             Machine 8664 (x64)
               6 nombre de sections
        4CE798E5 Cachet de date et heure Sam Nov 20 09:46:13 2010
               0 pointeur de fichier vers la table des symboles
               0 nombre de symboles
              F0 taille de l'en-tête facultatif
              22 caractéristiques
                   Exécutable
                   L'application peut gérer de grandes adresses (> 2 Go)
[...]

et

PS [64] E: \ # 5> dumpbin / headers C: \ Windows \ syswow64 \ cmd.exe
Version de Dumper Microsoft (R) COFF / PE 10.00.40219.01
Copyright (C) Microsoft Corporation. Tous les droits sont réservés.


Vidage du fichier C: \ Windows \ syswow64 \ cmd.exe

Signature PE trouvée

Type de fichier: IMAGE EXECUTABLE

FILE HEADER VALUES
              Machine 14C (x86)
               4 nombre de sections
        4CE78E2B horodatage sam. Nov. 20 09:00:27 2010
               0 pointeur de fichier vers la table des symboles
               0 nombre de symboles
              Taille E0 de l'en-tête facultatif
             102 caractéristiques
                   Exécutable
                   Machine à mots 32 bits
[...]

108
2017-11-17 12:14



Vous pouvez également voir (IA64) un fichier Itanium 64 bits. - Darryl Braaten
comme je l'ai lu ailleurs sur le superutilisateur, en utilisant dumpbin /headers | findstr "machine" simplifie grandement la présentation de ce que le QA recherche ... - user1055604
Dumpbin.exe se trouve ici: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David: pas nécessairement (version différente de VS, ne pas utiliser l'emplacement d'installation par défaut, en utilisant la version du SDK Windows): c'est pourquoi je n'ai pas spécifié. - Richard
Il est plus facile d'utiliser dumpbin si vous le lancez depuis la ligne de commande de visual studio: stackoverflow.com/a/477389/1390430 - Ben


Si vous ne possédez pas ou ne souhaitez pas utiliser le kit de développement Windows 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

40
2017-09-06 15:02



Semble pas toujours précis: essayez de l'utiliser avec LinqPad.exe (version AnyCPU-64bit) et Sigcheck vous dira qu'il s'agit de "32 bits" ... - Matt
@Matt intéressant. LinqPad sonne comme une application .net; Je me demande si sigcheck ne fonctionne correctement que sur les exécutables natifs (à cet effet). - briantist
Oui, c'est une application .NET. Dans .NET, s'il n'est pas précompilé, vous pouvez cibler "x86" ou "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 considérer ceci et montrer au moins ".NET 32 bit ou 64 bit (AnyCPU)". ILSpy, par exemple, dit dans ce cas "Architecture: AnyCPU (préféré 64 bits)" - mais ILSpy ne fonctionnera pas pour les EXE non .NET. - Matt
Cela pourrait être le cas, comme l’ancien en-tête "MZ" qui est juste là pour les OS non-Windows ("DOS") en disant "Cette application nécessite Microsoft Windows" ... ;-) - Matt
Ouais, le bon vieux temps, où vous aviez un débogueur DOS dans le shell et qui pouvait désassembler le code (qui contenait juste un seul appel DOS imprimant ce message) ... et remplacer le texte par "La réponse est 42." :-RÉ - Matt


Je peux confirmer que le file utilitaire (par exemple de cygwin) distinguera 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, ce qui est évident est très évident. De plus, il distingue les exécutables de la console et de l’interface graphique, ce qui est également évident.


32
2018-01-17 02:08



Cette solution est assez couramment disponible pour tous les développeurs qui ont installé msysgit. - FrontierPsycho
Pourquoi les fichiers exécutables dans Windows ont MZ au lieu de PE? - Mohammadreza Panahi


Une méthode simple consiste à l'exécuter (en supposant que vous lui fassiez confiance) et à regarder l'onglet du processus dans le gestionnaire de tâches. Les processus 32 bits afficheront "* 32" à la fin du nom du processus. Si ce n'est pas quelque chose que vous êtes prêt à exécuter sur votre ordinateur, vous pouvez essayer Explorateur EXE. Il affichera tout un tas d'informations sur les exécutables, y compris 32 ou 64 bits.


30
2017-11-17 10:39



Malheureusement, cela nécessite que vous exécutiez l'exécutable. Vous devez peut-être vérifier l’architecture du programme en tant que méthode de dépannage pour savoir pourquoi elle ne fonctionne pas. - Mike Christiansen
Comment faire toi exécuter une DLL? - user34660
@ user34660 RUNDLL32.EXE <nomdll>, <point d'entrée> - samsara
@ samusarin qui devrait être dans le post. - user34660
@ user34660 Vous êtes techniquement correct, une DLL n'a pas de main point d'entrée et ne sera donc pas exécuté comme un processus autonome. Il y a une fonction d'initialisation appelée lorsqu'elle est chargée mais ce n'est pas "main". - samsara


La version 64 bits de Explorateur de processus peut vous dire Lancez simplement l'exécutable et ouvrez la fenêtre des propriétés du processus. Sur l'onglet principal, il y a une entrée qui dit "Image: 32 Bit" ou "Image: 64 Bit".

enter image description here


18
2017-11-17 13:36



Simply run the executable Et si vous ne voulez pas courir le programme? - Synetech
@Synetech La question initiale n'implique pas que ce soit le cas. - Andrew Lambert
Je pense que c'est la méthode la plus simple, à moins que l'exécutable ne se termine trop vite. - starbeamrainbowlabs
Comment faire toi exécuter une DLL? - user34660


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. Utilisez simplement 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 comme suit, avec le CPU lecture de ligne soit x86 ou x64, ce qui est demandé 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

18
2017-10-04 10:56





La méthode d'exécution d'un exécutable, puis l'archivage de processus ou d'un outil similaire, présente des inconvénients évidents:

  1. Nous devons exécuter le processus.
  2. Pour les processus de courte durée (comme les types de monde echo hello), l'explorateur de processus peut même ne pas enregistrer qu'un nouveau processus a démarré.

La méthode Dumpbin.exe peut probablement résoudre le problème.

Une autre alternative serait d'utiliser les cygwin fichier commander. Cependant, je ne l'ai pas testé sur Windows. Cela fonctionne bien sur Linux.

Usage: file program_under_test.exe

EDIT: Juste testé fichier.exe sur la fenêtre. fonctionne bien :)


13
2017-09-27 07:08



Je voulais juste dire qu'il y a des situations où la méthode de Dracs ne sera pas très utile. - anishsane
>> Cela nécessite toujours d'exécuter le programme que l'auteur voulait éviter: Non .. nous l'exécutons comme: fichier.exe program_under_test.exe - anishsane
Et ceux qui souhaitent éviter d'installer le tout cygwin le paquet peut saisir le gnuwin32 file paquet. - Bob
@anishsane Totalement faux. file lit simplement les données du disque au format binaire et vérifie les numéros magiques les identifiant, en les comparant à une base de données. Les programmes 32 bits de Windows apparaissent sous la forme de PE32, et les programmes 64 bits et .NET apparaissent sous la forme de PE32 +. La morsure de file elle-même ne fait absolument aucune différence - les applications 32 bits et 64 bits peuvent lire les données à partir du disque, ce qui est tout ce dont elles ont besoin. - Bob
@MarcH Ha! Cette est intéressant. Je suppose que cela signifie que le talon d'exécution .NET est 32 bits. Il exécute donc un processus 32 bits pour une fraction de seconde, mais tout ce processus ne fait que démarrer le runtime .NET, ce qui crée un processus 64 bits natif. - clacke


Moyen le plus simple (lorsque les données ne sont pas confidentielles)

Je trouve que Virustotal  File detail est le moyen le plus simple de savoir si un binaire est 32 bits ou 64 bits.

le Additional information L'option fournit en outre de nombreuses informations utiles sur le fichier.

Virustotal analysis


[Virustotal TrID


13
2018-01-05 16:53