Frage Wie überprüft man, ob eine Binärdatei 32 oder 64 Bit unter Windows ist?


Gibt es eine einfache Möglichkeit zu überprüfen, ob eine Binärdatei 32 oder 64 Bit unter Windows ist? Ich muss überprüfen, bevor ich das Programm auf eine 32-Bit-Maschine verschiebe und einen spektakulären Ausfall erlebe.


257
2017-11-17 10:29


Ursprung


Diese Frage ist ähnlichEs erfordert jedoch einige Arbeit, um es zu überprüfen. - ST3
@Guillaume: Ausführbare Bilder sind keine Prozesse. Der Task-Manager zeigt nur Prozesse an. - IInspectable


Antworten:


Nach Überprüfung der Header-Werte von Richards AntwortIch habe eine Lösung entwickelt, die schnell und einfach ist und nur einen Texteditor benötigt. Selbst Windows 'standard notepad.exe würde funktionieren.

  1. Öffnen Sie die ausführbare Datei im Texteditor. Sie müssen möglicherweise Drag-and-Drop oder verwenden der Herausgeber Open... Dialog, weil Windows nicht angezeigt wird Open with... Option im Kontextmenü für ausführbare Dateien.

  2. Überprüfen Sie die ersten druckbaren Zeichen nach dem ersten Auftreten von PE. Dieser Teil ist wahrscheinlich von mindestens einigen Leerzeichen umgeben (könnte eine Menge davon sein), so dass es leicht visuell gemacht werden kann.

Hier ist was du finden wirst:

x86:

PE  L

x64:

PE  d†

Ein Wort der Warnung: Die Verwendung des Standard-Editors für große Dateien kann sehr langsam sein. Verwenden Sie sie daher nicht für Dateien, die größer als ein Megabyte oder wenige sind. In meinem Fall dauerte es ungefähr 30 Sekunden, um eine 12 MiB-Datei anzuzeigen. Notepad ++ konnte jedoch fast sofort eine 120-MiB-Datei anzeigen.

Diese Lösung ist möglicherweise nützlich, wenn Sie eine Datei auf einem Computer überprüfen müssen, auf dem Sie keine zusätzliche Software installieren können.

Zusätzliche Information:

Wenn Sie einen HEX-Editor zur Verfügung haben, befindet sich der Offset der PE-Signatur im Offset 0x3C. Die Unterschrift ist PE\0\0 (Buchstaben "P" und "E" gefolgt von zwei Nullbytes), gefolgt von einem zwei Byte großen Maschinentyp in Little Endian.

Die relevanten Werte sind 0x8664 für x64 ausführbare und 0x14c für x86. Es gibt viel mehr mögliche Werte, aber Sie werden wahrscheinlich nie irgendwelche davon finden, oder solche ausführbaren Dateien auf Ihrem Windows-PC ausführen können.

Eine vollständige Liste der Maschinentypen sowie die übrigen .exe-Spezifikationen finden Sie in Microsoft PE- und COFF-Spezifikation  Maschinentypen Sektion.


270
2018-03-13 17:08



Hey, das ist ziemlich hacky. Und zum Besseren, denn das scheint in den allermeisten Fällen die schnellste und einfachste Lösung zu sein :) - Septagram
Seltene Instanz, wenn Notizblock Notepad ++ schlug. Notepad zeigt dies richtig, in Notepad haben Sie Unordnung mit der Codierung, um es zu zeigen, aber es hat funktioniert! - zar
@CODEmanX diese Option bedeutet, dass die IDE oder JIT die Wahl für Sie trifft. Sehen diese Frage oder dieses Blogeintrag für mehr Details. - Alexander Revo
@Intelligent, wenn Sie sich tatsächlich die Mühe gemacht hätten, den ganzen Beitrag vor dem Abstimmen zu lesen, hätten Sie den Link zu Microsoft PE and COFF Specification, das ist so viel wie ein dokumentierter Vertrag, wie es erhalten kann, sowie Anweisungen, wie man die genaue Adresse des PE-Headers in jedem findet .exe Datei. Wenn Sie eine zuverlässigere Quelle als die offizielle Microsoft-Spezifikation für das ausführbare Microsoft-Format haben, würde ich gerne wissen, was das ist. - Alexander Revo
Bei Dateien, die mit "MZ" beginnen, müssen Sie ein wenig weiter suchen. Ich fand PE..L bei Offset 0x110, gleich nach "RichMQ _". - jnnnnn


Das SDK-Tool dumpbin.exe mit dem /headers Option enthält diese Informationen, vergleichen Sie diese beiden (Ich habe Fett für die Schlüsselinformationen hinzugefügt)

PS [64] E: \ # 4> Dumpbin / Kopfzeilen C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Dumper Version 10.00.40219.01
Urheberrecht (C) Microsoft Corporation. Alle Rechte vorbehalten.


Dump der Datei C: \ Windows \ system32 \ cmd.exe

PE-Signatur gefunden

Dateityp: EXECUTABLE IMAGE

FILE HEADER-WERTE
             8664 Maschine (x64)
               6 Anzahl der Abschnitte
        4CE798E5 Zeit Datum Stempel Sat Nov 20 09:46:13 2010
               0 Dateizeiger auf die Symboltabelle
               0 Anzahl der Symbole
              F0 Größe des optionalen Headers
              22 Eigenschaften
                   Ausführbar
                   Die Anwendung kann große (> 2 GB) Adressen verarbeiten
[...]

und

PS [64] E: \ # 5> Dumpbin / Header C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper Version 10.00.40219.01
Urheberrecht (C) Microsoft Corporation. Alle Rechte vorbehalten.


Dump der Datei C: \ Windows \ syswow64 \ cmd.exe

PE-Signatur gefunden

Dateityp: EXECUTABLE IMAGE

FILE HEADER-WERTE
              14C Maschine (x86)
               4 Anzahl der Abschnitte
        4CE78E2B Zeit Datum Stempel Sat Nov 20 09:00:27 2010
               0 Dateizeiger auf die Symboltabelle
               0 Anzahl der Symbole
              E0 Größe des optionalen Headers
             102 Eigenschaften
                   Ausführbar
                   32-Bit-Wortmaschine
[...]

108
2017-11-17 12:14



Sie können auch sehen (IA64) für eine 64bit Itanium exe. - Darryl Braaten
wie ich an anderer Stelle auf Superuser gelesen habe, mit dumpbin /headers | findstr "machine" vereinfacht die Darstellung dessen, was die QA sucht ... - user1055604
Dumpbin.exe befindet sich hier: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David: nicht unbedingt (andere Version von VS, nicht mit dem Standard-Installationsort, mit Version aus dem Windows SDK): Deshalb habe ich nicht angegeben. - Richard
Am einfachsten ist es, dumpbin zu verwenden, wenn Sie es über die Visual Studio-Befehlszeile starten: stackoverflow.com/a/477389/1390430 - Ben


Wenn Sie das gesamte Windows SDK oder Visual Studio nicht haben oder wollen, können Sie das verwenden sigcheck.exe von SysInternals:

sigcheck.exe C:\Windows\Notepad.exe

Ausgabe:

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



Scheint nicht immer genau zu sein: Versuche es mit LinqPad.exe (AnyCPU-64bit Version) zu benutzen und Sigcheck wird dir sagen, dass es "32 Bit" ist ... - Matt
@Matt interessant. LinqPad klingt wie eine .net App; Ich frage mich, ob Sigcheck nur für native Executables funktioniert (zu diesem Zweck). - briantist
Ja, es ist eine .NET App. In .NET, wenn es nicht vorkompiliert ist, können Sie entweder "x86" oder "AnyCPU" zielen. "x86" wird immer als 32-Bit ausgeführt, aber AnyCPU wird als 64-Bit auf einem 64-Bit-System, aber als 32-Bit auf einem 32-Bit-System ausgeführt. SigCheck sollte dies berücksichtigen und mindestens ".NET 32 Bit oder 64 Bit (AnyCPU)" anzeigen. ILSpy zum Beispiel sagt in diesem Fall "Architecture: AnyCPU (64-Bit Preferred)" - aber ILSpy wird nicht für Nicht-.NET-EXEs funktionieren. - Matt
Das könnte der Fall sein, wie der alte "MZ" -Header, der nur für Nicht-Windows-Betriebssysteme ("DOS") vorhanden ist und sagt: "Diese Anwendung benötigt Microsoft Windows" ... ;-) - Matt
Ja, die guten alten Zeiten, wo Sie einen DOS-Debugger in der Shell hatten und den Code zerlegen konnten (der nur einen einzigen DOS-Aufruf enthielt, der diese Nachricht druckte) ... und den Text durch "Die Antwort ist 42" ersetzt. :-D - Matt


Ich kann bestätigen, dass die file Dienstprogramm (z. B. von Cygwin) wird zwischen ausführbaren 32- und 64-Bit-Dateien unterscheiden. Sie erscheinen wie folgt:

32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows

Wie Sie sehen können, ist es sehr offensichtlich, welches was ist. Zusätzlich unterscheidet es zwischen ausführbaren Konsolen- und GUI-Dateien.


32
2018-01-17 02:08



Diese Lösung ist ziemlich allgemein für alle Entwickler verfügbar, die msysgit installiert haben. - FrontierPsycho
Warum ausführbare Dateien in Windows haben MZ Anstatt von PE? - Mohammadreza Panahi


Eine einfache Methode besteht darin, es auszuführen (vorausgesetzt, Sie vertrauen ihm) und einen Blick auf die Registerkarte Prozess im Task-Manager werfen. 32bit-Prozesse zeigen am Ende des Prozessnamens "* 32" an. Wenn es nicht etwas ist, das Sie auf Ihrem Computer ausführen möchten, können Sie es versuchen EXE-Explorer. Es wird eine ganze Reihe von Informationen über ausführbare Dateien zeigen, einschließlich 32 oder 64 Bit.


30
2017-11-17 10:39



Leider müssen Sie dazu die ausführbare Datei ausführen. Möglicherweise müssen Sie die Architektur des Programms als eine Methode zur Problembehandlung überprüfen, warum es nicht ausgeführt wird. - Mike Christiansen
Wie macht Sie eine DLL ausführen? - user34660
@ Benutzer34660 RUNDLL32.EXE <DLL-Name>, <Einstiegspunkt> - samsara
@samusarin, das sollte in der Post sein. - user34660
@ user34660 Du bist technisch korrekt, eine DLL hat keine main Einstiegspunkt und wird daher nicht als eigenständiger Prozess ausgeführt. Es gibt eine Initialisierungsfunktion, die aufgerufen wird, wenn sie geladen wird, aber das ist nicht "main". - samsara


Die 64-Bit-Version von Process Explorer kann es dir sagen. Führen Sie einfach die ausführbare Datei aus und öffnen Sie das Eigenschaftenfenster des Prozesses. Auf der Haupt-Registerkarte gibt es einen Eintrag, der "Image: 32 Bit" oder "Image: 64 Bit" sagt.

enter image description here


18
2017-11-17 13:36



Simply run the executable Und was, wenn du nicht willst Lauf das Programm? - Synetech
@Synetech Die ursprüngliche Frage impliziert nicht, dass dies der Fall ist. - Andrew Lambert
Dies ist die einfachste Methode für mich, denke ich, wenn die ausführbare Datei nicht zu schnell beendet wird. - starbeamrainbowlabs
Wie macht Sie eine DLL ausführen? - user34660


Viele Menschen haben das Ausgezeichnete 7-zip installiert und den 7-Zip-Ordner zu ihrer hinzugefügt PATH. 7-zip versteht andere Dateiformate als ZIP und RAR, wie MSI-Dateien und ausführbare PE-Dateien. Verwenden Sie einfach die Befehlszeile 7z.exe auf der PE-Datei (Exe oder DLL) in Frage:

7z l some.exe | more
7z l some.exe | findstr CPU

Die Ausgabe enthält Zeilen wie folgt, mit der CPU Zeilenlesung entweder x86 oder x64, was hier gefragt wird:

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





Die Methode zum Ausführen einer ausführbaren Datei und dann zum Einchecken des Prozess-Explorers oder ähnlichen Tools hat einige offensichtliche Nachteile:

  1. Wir müssen den Prozess ausführen.
  2. Bei den kurzlebigen Prozessen (wie Echo-Hello-Welttypen) registriert der Prozess-Explorer möglicherweise nicht einmal, dass ein neuer Prozess gestartet wurde.

Dumpbin.exe Methode kann den Zweck wahrscheinlich lösen.

Eine andere Alternative wäre, Cygwins zu verwenden Datei Befehl. Ich habe es jedoch nicht unter Windows getestet. Es funktioniert gut auf Linux.

Usage: file program_under_test.exe

EDIT: Nur Datei.exe im Fenster getestet. funktioniert gut. :)


13
2017-09-27 07:08



Ich wollte nur sagen, dass es einige Situationen gibt, in denen Dracs 'Methode nicht sehr hilfreich sein wird. - anishsane
>> Dies erfordert immer noch das Programm ausführen, die der Autor vermeiden wollte: Nein .. wir führen es aus wie: file.exe program_under_test.exe - anishsane
Und diejenigen, die es vermeiden wollen, das Ganze zu installieren cygwin Paket kann greifen gnuwin32 file Paket. - Bob
@anishsane Völlig falsch. file liest einfach Daten von der Festplatte im Binärformat und sucht nach magischen Zahlen, die sie identifizieren und vergleicht sie mit einer Datenbank. 32-Bit-Windows-Programme werden als PE32 und 64-Bit- und .NET-Programme als PE32 + ausgeführt. Die Bittigkeit von file selbst macht absolut Null Unterschied - sowohl 32-Bit-und 64-Bit-Anwendungen können Daten von der Festplatte lesen, was ist alles was sie braucht. - Bob
@MarcH Ha! Das ist interessant. Ich nehme an, das bedeutet, dass der .NET-Runtime-Stub 32-Bit ist. Daher wird für einen Bruchteil einer Sekunde ein 32-Bit-Prozess ausgeführt, aber der gesamte Prozess startet die .NET-Laufzeitumgebung, wodurch ein systemeigener 64-Bit-Prozess erstellt wird. - clacke


Einfachster Weg (wenn die Daten nicht vertraulich sind)

Ich finde, dass Virustotal  File detail ist der einfachste Weg herauszufinden, ob eine Binärdatei 32 Bit oder 64 Bit ist.

Das Additional information Option bietet zusätzlich viele hilfreiche Informationen über die Datei.

Virustotal analysis


[Virustotal TrID


13
2018-01-05 16:53