3
votes

Comment déterminer l'architecture d'un exécutable binaire sous Windows 10

Compte tenu de certains Random.exe sous Windows, comment puis-je déterminer

  1. son architecture CPU, par exemple Intel / ARM, et
  2. son témoin, par exemple 32 ou 64.

Y a-t-il une propriété dans l'Explorateur de fichiers, un autre outil ou une méthode de programmation que je peux utiliser?


0 commentaires

4 Réponses :


5
votes

L'architecture de l'exécutable est écrite dans le champ Machine de l'en-tête COFF. Vous pouvez le récupérer par programme ou manuellement avec un éditeur hexadécimal:

  • Accédez à l'offset 0x3C dans le fichier. Les quatre octets contiennent le décalage de l'en-tête COFF (depuis le début du fichier).
  • Accédez à l'en-tête COFF indiqué par le champ ci-dessus et avancez de quatre (4) octets.
  • Les deux (2) octets suivants constituent le champ Machine.

Vous pouvez voir la structure PE ici a >. Les valeurs de champ Machine valides sont répertoriées ici a>.

EDIT: Voici un code C qui fait cela, non testé:

int main(int argc, char *argv[]) {
    FILE *f = fopen(argv[1], "rb");
    uint32_t offset = 0;
    fseek(f, 0x3c, SEEK_SET);
    fread(&offset, sizeof(offset), 1, f);
    fseek(f, offset + 4, SEEK_SET);
    uint16_t machine = 0;
    fread(&machine, sizeof(machine), 1, f);
    printf("Machine: 0x%.4x\n", machine);
}


1 commentaires

Merci, question modifiée pour inclure des méthodes programmatiques.



3
votes

Cygwin file foo.exe sera identifier le contenu des fichiers en fonction de leurs nombres magiques / métadonnées de format de fichier. (Pas leurs noms de fichiers). Vraisemblablement également disponible ou installable à partir des sources dans MinGW , et est probablement fourni avec l'une des distributions pour Sous-système Windows de MS pour Linux , WSL.

C'est le même open -source implémentation de la commande POSIX file a > que la plupart des BSD et toutes les distributions Linux utilisent. La source en amont est https://www.darwinsys.com/file/

https://en.wikipedia.org/wiki/File_(command)

montre un exemple de sortie. Et j'ai quelques exécutables Windows sur mon bureau Linux:

peter@volta:~/.wine/drive_c$ file Program\ Files/Internet\ Explorer/iexplore.exe 
..../iexplore.exe: PE32+ executable (GUI) x86-64, for MS Windows

peter@volta:~/.wine/drive_c$ file Program\ Files\ \(x86\)/The\ Master\ Genealogist\ v9/tmg9.exe 
..../tmg9.exe: PE32 executable (GUI) Intel 80386, for MS Windows

IDK si c'est la meilleure réponse, si vous n'utilisez pas régulièrement un shell en ligne de commande (comme je le fais sur mon bureau Linux).


file fonctionne pour à peu près n'importe quel type de fichier, par exemple ZIP, JPG, mp4, mkv et pour les formats de fichiers largement utilisés, il récupérera même des métadonnées supplémentaires comme la résolution d'image JPG. (Il n'est pas basé sur le nom du fichier, il ouvre le fichier pour consulter les métadonnées. Habituellement, les 4 premiers octets environ sont un "nombre magique" qui indique le type de fichier.)

Pour les formats de texte brut, il peut parfois utiliser des heuristiques pour distinguer HTML du texte brut, et reconnaître UTF-8 contre UTF-16 contre ISO-8851 contre ASCII ordinaire, et DOS contre les fins de ligne Unix, etc. pas seulement pour les exécutables.


0 commentaires

2
votes
Microsoft (R) COFF/PE Dumper Version 14.11.25547.0 Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file C:\Users\justins\projects\random.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            8664 machine (x64)
               4 number of sections
        5C0BB424 time date stamp Sat Dec  8 04:08:04 2018
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
              22 characteristics
                   Executable
                   Application can handle large (>2GB) addresses

0 commentaires

0
votes

Un moyen très simple de le faire avec JavaScript: https://github.com/doctolib / architecture-binaire-windows

getTargetArch(yourFilePath, (err, archName, archCode) => {
  // you can check arch name here
}


0 commentaires