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.

1voto

LUser Points 149

Je sais qu'il existe de nombreuses réponses, mais aucune d'entre elles n'est vraiment portable et nécessite une sorte d'outil pour être utilisée. Je voulais résoudre ce problème de manière programmatique pour toutes les plateformes. Cela fonctionnera sur tout ce qui possède un compilateur C.

#include <stdio.h>
#include <fstream>      // std::fstream
#include <stdio.h>
#include <string.h>

char Header      [0x200];
char Elf32Magic  [20] = "\x7f\x45\x4c\x46\01";  //7F 45 4C 46  01 // ELF32 
char Elf64Magic  [20] = "\x7f\x45\x4c\x46\02";  //7F 45 4C 46  02 // ELF64
char Win32Magic  [20] = "\x50\x45\x00\x00\x4C\x01";// PE32
char Win64Magic  [20] = "\x50\x45\x00\x00\x64\x86";// PE64

char PeHeader[20] = {};
void CheckWinHeader(){
  int k = 0;
  for (int i = 0; i < 0x200; i++)
  {
   if(Header[i] == 0x50 && Header[i+1] == 0x45) // PE     
     {

      for(int j = i; j < i + 6; j++)
      {
        PeHeader[k] = Header[j];
        k++;
       //printf("%hhx", Header[j]); 
      }
     }
  }
}

int main(){
  std::fstream fs; 
  fs.open ("/home/PATH/TO/YOUR/BINARY", std::fstream::in | std::fstream::out | std::fstream::app);
  fs.read( Header , 0x200);

  if(memcmp ( Header, Elf32Magic, 5 ) == 0 ){
    printf("ELF 32 Match Found ! \n");
  }
  if(memcmp ( Header, Elf64Magic, 5 ) == 0 ){
    printf("Elf 64 Match Found ! \n");
  }

  CheckWinHeader();

  if(memcmp ( &PeHeader, Win32Magic, 6 ) == 0 ){
    printf("Win 32 Match Found ! \n");
  }

  if(memcmp ( &PeHeader, Win64Magic, 6 ) == 0 ){
    printf("Win 64 Match Found ! \n");
  }

 fs.close();
 return 0;
}

compiler en utilisant n'importe quel compilateur. J'ai utilisé g++.

g++ Bincheck.cpp -o bincheck
./bincheck

0 votes

Il n'y a pas de compilateur C par défaut sous Windows, donc ce n'est pas très utile. Si vous avez gcc alors vous aurez file et si vous avez MSVC, il y a la commande dumpbin disponible, il n'y a donc pas besoin de compiler un tel programme. Par contre, il y a le bloc-notes et powershell sous Windows, donc vous pouvez vérifier le type de binaire en utilisant l'une ou l'autre méthode facilement sans outils tiers.

1voto

Si vous souhaitez analyser la structure d'un dossier à la recherche de DLL ou d'exécutables 32/64 bits, vous pouvez également essayer un outil gratuit appelé ScanFor64bit, disponible à l'adresse suivante : https://canservices.nl/download-tools ScanFor64bit vous permet de saisir une lettre de lecteur ou un chemin d'accès à un répertoire et un ou plusieurs masques de fichiers à analyser pour détecter la présence de 32 ou 64 bits. Le résultat est une liste triée par fichiers 32 bits en premier et 64 bits en second. Je l'ai beaucoup utilisé pour vérifier les ordinateurs avec Java pour s'assurer que la version 64 bits est utilisée.

Exemple de sortie de ScanFor64bit :

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