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.

34voto

Dracs Points 2664

Une méthode simple consiste à l'exécuter (en supposant que vous lui faites confiance) et à jeter un coup d'œil à l'onglet des processus dans le gestionnaire des tâches. Les processus 32 bits afficheront "* 32" à la fin du nom du processus. Si vous ne souhaitez pas l'exécuter sur votre ordinateur, vous pouvez essayer EXE Explorer . Il affichera tout un tas d'informations sur les exécutables, y compris s'il s'agit de 32 ou 64 bits.

11 votes

Malheureusement, cela nécessite d'exécuter l'exécutable. Peut-être devriez-vous vérifier l'architecture du programme comme méthode de dépannage pour savoir pourquoi il ne s'exécute pas.

11 votes

Comment usted exécuter une DLL ?

1 votes

26voto

megamorf Points 2188

Voici une solution Powershell, sans dépendances externes ni rien. Ouvrez Powershell, collez-y la fonction (appuyez deux fois sur Entrée pour revenir à l'invite), puis utilisez-la comme dans mes exemples sous la fonction :

function Test-is64Bit {
    param($FilePath=“$env:windir\notepad.exe”)

    [int32]$MACHINE_OFFSET = 4
    [int32]$PE_POINTER_OFFSET = 60

    [byte[]]$data = New-Object -TypeName System.Byte[] -ArgumentList 4096
    $stream = New-Object -TypeName System.IO.FileStream -ArgumentList ($FilePath, 'Open', 'Read')
    $stream.Read($data, 0, 4096) | Out-Null

    [int32]$PE_HEADER_ADDR = [System.BitConverter]::ToInt32($data, $PE_POINTER_OFFSET)
    [int32]$machineUint = [System.BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET)
    $stream.Close()

    $result = "" | select FilePath, FileType, Is64Bit
    $result.FilePath = $FilePath
    $result.Is64Bit = $false

    switch ($machineUint) 
    {
        0      { $result.FileType = 'Native' }
        0x014c { $result.FileType = 'x86' }
        0x0200 { $result.FileType = 'Itanium' }
        0x8664 { $result.FileType = 'x64'; $result.is64Bit = $true; }
    }

    $result
}

Voici un exemple de sortie :

D:\> Test-is64bit

FilePath               FileType Is64Bit
--------               -------- -------
C:\Windows\notepad.exe x64         True

D:\> Test-is64bit 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe'

FilePath                                           FileType Is64Bit
--------                                           -------- -------
C:\Program Files (x86)\Mozilla Firefox\firefox.exe x86        False

0 votes

Slickness. Le script ci-dessus semble laisser une référence au fichier ouvert. Impossible de construire jusqu'à ce que je ferme d'abord powershell (exécuté script pour interroger DLL en \bin ).

1 votes

Très cool. +1. L'Itanium est définitivement 64 bits cependant :)

0 votes

@samusarin : peut-être ajouter $stream.dispose(); après la fermeture ? Il faut libérer les poignées de fichiers. ( stackoverflow.com/questions/1999858/ )

23voto

Andrew Lambert Points 7506

La version 64 bits de Explorateur de processus peut vous le dire. Il suffit de lancer l'exécutable et d'ouvrir la fenêtre des propriétés du processus. Dans l'onglet principal, il y a une entrée qui dit "Image:32 Bit" ou "Image:64 Bit".

enter image description here

35 votes

Simply run the executable Et si tu ne veux pas exécuter le programme ?

5 votes

@Synetech La question initiale ne laisse pas entendre que c'est le cas.

0 votes

C'est la méthode la plus simple pour moi je pense, à moins que l'exécutable ne s'arrête trop vite.

22voto

marsh-wiggle Points 2722

Le 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 de 32 ou 64 bits.

Le site Additional information fournit en outre de nombreuses informations utiles sur le fichier.

Virustotal analysis


Virustotal TrID

16voto

anishsane Points 885

La méthode consistant à exécuter un exécutable puis à le vérifier dans l'explorateur de processus ou 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 echo hello world.), 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 la fonction de cygwin fichier commandement. Cependant, je ne l'ai pas testé sous Windows. Elle fonctionne bien sur les Linux.

Usage: file program_under_test.exe

EDIT : Je viens de tester file.exe sur la fenêtre. ça marche bien. :)

0 votes

Cela n'ajoute rien qui n'ait été dit par Dracs ou Richard. Cela nécessite toujours d'exécuter le programme, ce que l'auteur voulait éviter.

1 votes

Je voulais juste dire qu'il y a certaines situations où la méthode de Dracs ne sera pas très utile.

3 votes

>>Cela nécessite toujours d'exécuter le programme, ce que l'auteur voulait éviter : Non on l'exécute comme : file.exe programme_sous_test.exe

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