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.

12voto

Bill Barry Points 804

Même un exécutable marqué comme 32 bits peut fonctionner en 64 bits si, par exemple, il s'agit d'un exécutable .NET qui peut fonctionner en 32 ou 64 bits. Pour plus d'informations, voir https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit La réponse indique que l'utilitaire CORFLAGS peut être utilisé pour déterminer comment une application .NET s'exécutera.

Sortie de CORFLAGS.EXE

Pour un exécutable 32 bits :

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x3
ILONLY    : 1
32BITREQ  : 1
32BITPREF : 0
Signed    : 0

Pour un exécutable 64 bits :

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32+
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0

Pour un exécutable qui peut être exécuté en 32 ou 64 bits et qui sera exécuté en 64 bits si possible :

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0

Pour un exécutable qui peut fonctionner en 32 ou 64 bits, mais qui fonctionnera en 32 bits s'il n'est pas chargé dans un processus 64 bits :

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x20003
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 1
Signed    : 0

0 votes

Commande sympa, mais elle ne fonctionne pas pour les exécutables / dll natifs (non gérés). ( corflags : error CF008 : The specified file does not have a valid managed header )

1 votes

@TomaszGandor Oui, le contexte de cette réponse était le code géré uniquement. Le code non géré est répondu par les autres réponses. Pour autant que je sache, seul le code géré peut basculer entre l'exécution en 32 et 64 bits.

0 votes

Personnellement, j'utiliserais d'autres solutions, mais le fait de résumer cette question et de montrer tous les cas possibles méritait un upvote.

11voto

axxis Points 219

Si vous êtes sous Windows 7, dans l'Explorateur Windows, faites un clic droit sur l'exécutable et sélectionnez Propriétés. Dans la fenêtre des propriétés, sélectionnez l'onglet Compatibilité. Si, dans la section Mode de compatibilité, vous voyez Windows XP, il s'agit d'un exécutable 32 bits. Si vous voyez Windows Vista, il s'agit d'un exécutable 64 bits.

0 votes

-1 pas vrai du tout. Divers binaires 32 et 64 bits sont tous affichés en mode de compatibilité de Windows 8

0 votes

@Peter J'ai essayé plusieurs fois sous Windows 7 et cela a toujours fonctionné pour moi. Pourriez-vous donner un exemple de binaire où le mode de compatibilité par défaut est Windows 8 ? De plus, sur quel système d'exploitation Windows travaillez-vous ? Merci.

0 votes

Je suis sur Server 2012 R2 et j'ai essayé quelques binaires aléatoires. Certains binaires 32 bits s'affichent comme Windows XP SP2 mais d'autres montrent comme Vista o Windows 8 . Cette méthode n'est donc pas correcte.

11voto

stenly Points 181

Mes deux cents seront juste un téléchargement marcheur de dépendance et vérifier quelle architecture a été utilisée dans l'un des fichiers exécutables.

Comment l'utiliser :

Il suffit de télécharger l'application, de la démarrer, de cliquer sur l'icône d'ouverture, de trouver un fichier *.exe, de le sélectionner et, en bas, une fois le scan de réflexion terminé, de voir une grille de données dont une colonne contient des détails sur l'architecture (x86, x64).

Ouvrir l'exécutable et voir l'architecture de construction

dependency walker screenshot

8voto

jumpjack Points 355

Comment ajouter le test 32/64 bit à votre menu contextuel

Créez un fichier texte nommé exetest.reg et contenant ce code :

Windows Registry Editor Version 5.00

; What will appear in the contextual menu when right-clicking on a .exe file
[HKEY_CLASSES_ROOT\exefile\shell\command32_64]
@="32/64 bit test"

; What to do with it
; here, %1 is the file given as argument of the script
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
@="\"c:\\temp\\x86TestStart.bat\" \"%1\""

Créez un fichier texte nommé x86TestStart.bat contenant juste cette ligne de code et le sauvegarder dans C:\temp :

c:\temp\x86or64.vbs %1

Créez un fichier texte nommé x86or64.vbs contenant ce code et l'enregistrer dans C:\temp :

rem Reading binary file in VBScript: http://stackoverflow.com/questions/21249440/modify-first-two-bytes-of-a-file-using-vbscript
rem Info on executables: https://dmoj.ca/problem/exe

rem x86/64 signature is located dinamycally; its position is addressed
rem from bytes in 0x3C-0x3D position.

rem Possible signatures;
rem "PE..L" (hex code: 50.45.00.00.4C) = 32 bit
rem "PE..d†" (hex code: 50.45.00.00.64.86) = 64 bit

' ------------------------------------
' Source code by Jumpkack 2015
' ------------------------------------

' Read all arguments from command line:
Set args = Wscript.Arguments

' Store first argument (full path to file)
FileName = args(0)

' Find address of executable signature:
FirstChars = readBinary(FileName)
FirstChars = FirstChars
Addr1 = asc(mid(FirstChars,61,1))
Addr2 = asc(mid(FirstChars,62,1))
AddrFinal = Addr2*256 + Addr1 + 1

' Check signature:
if ucase(hex(asc(mid(FirstChars,AddrFinal+4,2)))) = "4C" then Wscript.Echo Filename & " is a 32 bit executable."
if ucase(hex(asc(mid(FirstChars,AddrFinal+4,2)))) = "64" then Wscript.Echo Filename & " is a 64 bit executable."

Function readBinary(path)
    Dim a, fso, file, i, ts
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.getFile(path)
    If isNull(file) Then
        wscript.echo "File not found: " & path
        Exit Function
    End If
    Set ts = file.OpenAsTextStream()
    'a = makeArray(file.size)
    a=""
    i = 0
    While (Not ts.atEndOfStream) and (i<60000)
       'a(i) = ts.read(1)
       a = a + ts.read(1)
       i = i + 1
    Wend
    ts.close
    readBinary = a
 End Function

Double-cliquez sur le fichier exetest.reg : une nouvelle clé sera ajoutée dans le registre de Windows :

[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]

Il apparaîtra comme " Test 32/64 bits "dans le menu contextuel lors d'un clic droit sur un fichier exécutable.

En cliquant sur l'élément, le fichier de traitement par lots sera lancé. c:\\temp\\x86TestStart.bat\ qui lance le fichier VBscript x86or64.vbs qui lit la signature de l'exe et montre le résultat.

Si vous ne pouvez pas ou ne voulez pas modifier le registre, copiez simplement le fichier .vbs dans la barre QuickLaunch et faites glisser l'exécutable dessus.

0 votes

Je trouve que cette solution demande trop d'efforts, et je ne l'utiliserai donc pas. Cependant, le fait de la mettre en place méritait vraiment mon upvote. Bien joué...

0 votes

La ligne FirstChars = FirstChars est inutile et peut être supprimé. Je ne sais pas si c'était censé être quelque chose de différent ?

2 votes

Je voulais vous remercier d'avoir publié cette réponse. Elle m'a inspiré l'écriture d'une fonction plus générique que j'ai postée à mon repo GitHub dans un fichier appelé GetExecutableProcessorArchitectureFromFile.vbs . Il lit l'en-tête PE d'un exe, obtient le type de machine et renvoie l'architecture du processeur (c'est-à-dire, si l'exécutable était en cours d'exécution et accédait à la variable d'environnement PROCESSOR_ARCHITECTURE, le contenu de cette variable), sous forme de chaîne de caractères.

7voto

Bohr Points 526

Pourtant, WSL 's file fonctionne très bien.

file /mnt/c/p/bin/rg.exe produirait un résultat :

/mnt/c/p/bin/rg.exe: PE32+ executable (console) x86-64, for MS Windows

file /mnt/c/p/bin/u.exe produirait un résultat :

/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed

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