Wie prüfe ich, ob eine Binärdatei unter Windows 32 oder 64 Bit ist?

210938
Septagram

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

268
[Diese Frage ist ähnlich] (http://reverseengineering.stackexchange.com/q/6040/8247), es ist jedoch einige Arbeit erforderlich, um sie zu überprüfen. ST3 vor 10 Jahren 0
@ Guillaume: Ausführbare Bilder sind keine Prozesse. Der Task-Manager zeigt nur Prozesse an. IInspectable vor 7 Jahren 3
[Wie stelle ich fest, ob eine von mir installierte Anwendung 32-Bit oder 64-Bit ist?] (Https://stackoverflow.com/q/1858358/995714) phuclv vor 6 Jahren 0

19 Antworten auf die Frage

280
Alexander Revo

Nach der Untersuchung der Header-Werte aus Richards Antwort habe ich eine Lösung gefunden, die schnell und einfach ist und nur einen Texteditor erfordert. Sogar die Standard-Notepad.exe von Windows würde funktionieren.

  1. Öffnen Sie die ausführbare Datei im Texteditor. Möglicherweise müssen Sie den Open...Dialog des Editors ziehen und ablegen, da Windows die Open with...Option nicht im Kontextmenü für ausführbare Dateien anzeigt.

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

Hier finden Sie das, was Sie finden werden:

x86:

PE L 

x64:

PE d† 

Eine Warnung: Die Verwendung des Standard-Notepad für große Dateien kann sehr langsam sein. Verwenden Sie ihn daher nicht für Dateien, die größer als ein Megabyte oder wenige sind. In meinem Fall dauerte es etwa 30 Sekunden, bis eine 12-MiB-Datei angezeigt wurde. Notepad ++ konnte jedoch fast sofort eine ausführbare 120-MiB-Datei anzeigen.

Diese Lösung ist möglicherweise hilfreich, wenn Sie eine Datei auf einem Computer überprüfen müssen, auf der keine zusätzliche Software installiert werden kann.

Zusätzliche Information:

Wenn Sie über einen HEX-Editor verfügen, befindet sich der Versatz der PE-Signatur im Versatz 0x3C. Die Signatur lautet PE\0\0(Buchstaben "P" und "E" gefolgt von zwei Null-Bytes), gefolgt von einem Zwei-Byte-Maschinentyp in Little Endian.

Die relevanten Werte sind 0x8664für x64 ausführbar und 0x14cfür x86. Es gibt viel mehr mögliche Werte, aber wahrscheinlich werden Sie niemals auf solche Werte stoßen oder solche ausführbaren Dateien auf Ihrem Windows-PC ausführen können.

Die vollständige Liste der Maschinentypen, zusammen mit dem Rest der Exe - Spezifikationen finden Sie in Microsoft PE und COFF Spezifikation Maschinentypen Abschnitt.

Hey, das ist ziemlich hackig. Und zum Besseren, da dies für die überwiegende Mehrheit der Fälle tatsächlich die schnellste und einfachste Lösung zu sein scheint :) Septagram vor 9 Jahren 17
Seltene Instanz, wenn Notepad Notepad ++ schlägt. Notepad zeigt dies richtig, im Notepad haben Sie sich mit der Kodierung herumgeturnt, damit es angezeigt wird, aber es hat funktioniert! zar vor 8 Jahren 4
@Zadane ist interessant. Nach meiner Erfahrung würde Notepad ++ beim Öffnen von ausführbaren Dateien immer ANSI-Codierung verwenden. Allerdings ist es definitiv schwieriger, das benötigte Fragment zu finden, indem null Bytes als 'NUL' anstelle von Whitespace angezeigt werden. Alexander Revo vor 8 Jahren 0
Hier ist Java-Code, der die Überprüfung durchführt: http://stackoverflow.com/a/35418180/875305 11101101b vor 8 Jahren 0
Ich habe PE] _ÙV in einer 32-Bit-WPF-Anwendung gefunden. rleelr vor 8 Jahren 0
@AnotherDayAnotherRob ist interessant. Technisch gesehen ist der Computertyp die zwei Bytes nach "PE \ 0 \ 0". Wenn Sie also in Ihrem Kommentar Platz für die beiden "\ 0" Bytes haben, würde der Wert "0x5F5D" sein ("5D 5F", wenn Sie in HEX öffnen. Editor wegen Endianness). Nichts ähnelt diesem Wert in der [Microsoft PE- und COFF-Spezifikation] (https://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx) (Abschnitt 2.3.1. Maschinentypen). Sind Sie sicher, dass Sie an der richtigen Stelle gesucht haben? Alexander Revo vor 8 Jahren 0
@AlexanderRevo mein schlechtes, ich habe mir die Datei noch einmal angesehen und es ist PE L] _ÙV (Leerzeichen ist nicht druckbare Zeichen) Ich habe das L zum ersten Mal nicht entdeckt. Habe eine positive Meinung. rleelr vor 8 Jahren 0
Ich habe mein eigenes Programm (mit Delphi) als 32/64 Bit kompiliert und der Header ist identisch !!! Also diese Methode funktioniert nicht immer! Rigel vor 8 Jahren 0
@SolarWind Es gibt keine ausführbaren 32/64-Bit-Dateien unter Windows. Sie kompilieren es wahrscheinlich als 32-Bit, was sowohl auf 32- als auch auf 64-Bit-Systemen funktioniert. 64-Bit-Windows kann 32-Bit-Programme problemlos ausführen. Alexander Revo vor 8 Jahren 0
@AlexanderRevo: In Visual Studio gibt es eine Compile-Option * AnyCPU *. Wenn dies das Gleiche wäre wie das Kompilieren für 32 Bit, warum würden sie diese dritte Option hinzufügen? CoDEmanX vor 8 Jahren 0
@CoDEmanX Diese Option bedeutet, dass die IDE oder JIT die Wahl für Sie trifft. Siehe [diese Frage] (http://stackoverflow.com/q/516730/3811791) oder diesen [Blogbeitrag] (http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu -really-bedeutet-als-of-net-45-und-visual-studio-11 /) für weitere Details. Alexander Revo vor 8 Jahren 2
Dies ist eine ziemlich spröde Lösung. Wenn Sie PE-Images verstehen, sollten Sie sofort sehen, dass das erste Klartext-PE, das Sie in einer Datei finden, möglicherweise nicht der PE-Header ist. Ohne einen dokumentierten Vertrag ist nichts davon verlässlich, nicht heute und schon gar nicht für die Zukunft. Entschuldigung, -1. IInspectable vor 7 Jahren 0
@Inspectable Wenn Sie sich wirklich die Mühe gemacht hätten, den gesamten Beitrag zu lesen, bevor Sie ihn heruntergestuft haben, hätten Sie den Link zu "Microsoft PE and COFF Specification" gesehen, der so viel dokumentiert ist wie er kann, und Anweisungen dazu Finden Sie die genaue Adresse des PE-Headers in einer `.exe`-Datei. Wenn Sie eine zuverlässigere Quelle als die offiziellen Spezifikationen von Microsoft für das ausführbare Microsoft-Format haben, würde ich gerne wissen, was das ist. Alexander Revo vor 7 Jahren 2
@AlexanderRevo: * "Überprüfe die ersten druckbaren Zeichen nach dem ersten Auftreten von PE" * - Das ist offensichtlich falsch, nein? Der PE-Header kann ** irgendwo ** in der Datei sein. Und während das PE-Dateiformat dokumentiert ist, ist dies bei `PIMAGE_DOS_HEADER` nicht der Fall. Gleich auf der ersten Seite dieser sogenannten "Spezifikation" * finden Sie: * "Dieses Dokument dient zur Unterstützung bei der Entwicklung von Tools und Anwendungen für Windows, aber es kann nicht garantiert werden, dass ** eine vollständige Spezifikation ist ** in jeder Hinsicht. Microsoft behält sich das Recht vor, dieses Dokument ohne vorherige Ankündigung zu ändern. "*. Das Down-Voting ist wohlverdient, sorry. IInspectable vor 7 Jahren 0
Funktioniert nicht für ein Exe, das mit nativem C ++ - Code erstellt wurde, in Visual Studio 2013. Bei Verwendung dieser Technik kann man auf das 32-Bit-Format schließen. Tatsächlich sind es jedoch 64-Bit-Bit, das durch Dumpbin und Sigcheck überprüft werden kann zumalifeguard vor 7 Jahren 0
@zumalifeguard kann ich mir das exe ansehen? Alexander Revo vor 7 Jahren 0
Sicher Alexander. Gib mir deine E-Mail-Adresse und ich schicke sie dir. Wenn Sie können, können Sie Ihre E-Mail-Adresse auf Twitter senden. zumalifeguard vor 7 Jahren 0
@zumalifeguard Ich kann mich anscheinend nicht mit Ihnen in Verbindung setzen, und ich bin kein Fan von Ideen, wenn Sie meine E-Mail-Adresse an Personen im Internet weitergeben (keine Beleidigung). Könnten Sie es vielleicht über einen Dateifreigabedienst wie Google Drive oder ähnliches hochladen? Vielen Dank. Alexander Revo vor 7 Jahren 0
@zumalifeguard Danke, dass du mir die .exe geschickt hast. Ich habe es mit meiner Technik überprüft und es zeigt "PE d †", das ist 64-Bit, genau das, was mein Beitrag sagt. Ich bin mir nicht sicher, warum Sie dachten, dass meine Beiträge auf eine 32-Bit-Version schließen lassen. Alexander Revo vor 7 Jahren 0
Erste Datei überprüfe ich, es gibt kein "PE", nur "MZ", also denke ich, dass diese Lösung nicht narrensicher ist NaturalBornCamper vor 7 Jahren 2
@NaturalBornCamper Versuchen Sie, eine tatsächliche Suche mit Ihrem Editor auszuführen. Alexander Revo vor 7 Jahren 1
Ja, ich habe es mit Notepad ++ versucht;) Einen anderen Weg gefunden, der auf jeden Fall 100% funktioniert, also alles gut, danke! NaturalBornCamper vor 7 Jahren 0
@NaturalBornCamper Ich würde gerne die .exe-Datei studieren, um meine Antwort genauer zu machen, wenn Sie nichts dagegen haben und die Zeit haben, sie irgendwo hochzuladen. Ich muss allerdings sagen, dass ich noch keine einzige EXE-Datei gesehen habe, für die meine Antwort nicht funktionierte (bisher waren es nur die Leute, die die Ergebnisse falsch interpretierten). Entschuldigen Sie mich, wenn ich etwas skeptisch bin. Wie auch immer, mein Ziel ist es, genaue Informationen bereitzustellen, also würde ich es begrüßen, wenn Sie mir helfen könnten, diese .exe in die Hände zu bekommen :) Alexander Revo vor 7 Jahren 0
Bei Dateien, die mit "MZ" beginnen, müssen Sie ein wenig weiter suchen. Ich habe PE..L am Offset 0x110 gefunden, gleich nach "RichMQ _........". jnnnnn vor 6 Jahren 4
112
Richard

Das SDK-Tool dumpbin.exemit der /headersOption enthält diese Informationen. Vergleichen Sie diese beiden. (Ich habe die wichtigsten Informationen fett dargestellt.)

PS [64] E: \ # 4> dumpbin / Header C: \ Windows \ system32 \ cmd.exe Microsoft (R) COFF / PE-Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.   Abbild der Datei C: \ Windows \ system32 \ cmd.exe  PE-Signatur gefunden  Dateityp: EXECUTABLE IMAGE  DATEI-HEADER-WERTE 8664 Maschine (x64) 6 Anzahl der Abschnitte 4CE798E5 Uhrzeit Datum Stempel Sa Nov 20 09:46:13 2010 0 Dateizeiger auf Symboltabelle 0 Anzahl von Symbolen F0 Größe des optionalen Headers 22 Eigenschaften Ausführbar Die Anwendung kann große Adressen (> 2 GB) verarbeiten [...] 

und

PS [64] E: \ # 5> dumpbin / Header C: \ Windows \ syswow64 \ cmd.exe Microsoft (R) COFF / PE-Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.   Abbild der Datei C: \ Windows \ syswow64 \ cmd.exe  PE-Signatur gefunden  Dateityp: EXECUTABLE IMAGE  DATEI-HEADER-WERTE 14C Maschine (x86) 4 Anzahl der Abschnitte 4CE78E2B Uhrzeit Datum Stempel Sa Nov 20 09:00:27 2010 0 Dateizeiger auf Symboltabelle 0 Anzahl von Symbolen E0-Größe des optionalen Headers 102 Merkmale Ausführbar 32-Bit-Wortmaschine [...] 
Sie könnten auch (IA64) für ein 64-Bit-Itanium-Exe sehen. Darryl Braaten vor 12 Jahren 1
Wie ich an anderer Stelle auf Superuser gelesen habe, benutze ich `dumpbin / headers | findstr "machine" `vereinfacht die Darstellung dessen, was die Qualitätssicherung sucht ... user1055604 vor 11 Jahren 20
Dumpbin.exe befindet sich hier: `C: \ Programme (x86) \ Microsoft Visual Studio 12.0 \ VC \ bin` Devid vor 10 Jahren 3
@David: nicht unbedingt (andere Version von VS, nicht das Standardinstallationsverzeichnis, Version vom Windows SDK): Aus diesem Grund habe ich nicht angegeben. Richard vor 10 Jahren 3
Die Verwendung von dumpbin ist am einfachsten, wenn Sie es über die Visual Studio-Befehlszeile starten: http://stackoverflow.com/a/477389/1390430 Ben vor 9 Jahren 5
Es ist ein bisschen schwierig für Leute, die kein Visual Studio installiert haben. Varad Mahashabde vor 7 Jahren 0
System ** 32 ** \ cmd.exe zeigt x64 und syswow ** 64 ** \ cmd.exe zeigt x86 .. Also zur Bestätigung .. 8664 Maschine ist 64-Bit. Recht ? Ashish Negi vor 7 Jahren 0
41
briantist

Wenn Sie nicht das gesamte Windows SDK oder Visual Studio haben oder haben möchten, können Sie sigcheck.exeSysInternals verwenden :

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 
Scheint nicht immer genau zu sein: Versuchen Sie es mit LinqPad.exe (AnyCPU-64bit-Version) zu verwenden, und Sigcheck sagt Ihnen, dass es "32-Bit" ist ... Matt vor 7 Jahren 3
@ Matt interessant. LinqPad klingt wie eine .net-App. Ich frage mich, ob sigcheck nur für native ausführbare Dateien (für diesen Zweck) ordnungsgemäß funktioniert. briantist vor 7 Jahren 0
Ja, es ist eine .NET-App. Wenn es in .NET nicht vorkompiliert ist, können Sie entweder "x86" oder "AnyCPU" als Ziel verwenden. "x86" wird immer als 32 Bit ausgeführt, AnyCPU jedoch auf einem 64-Bit-System als 64-Bit, auf einem 32-Bit-System jedoch als 32-Bit. SigCheck sollte dies berücksichtigen und mindestens ".NET 32 Bit oder 64 Bit (AnyCPU)" anzeigen. ILSpy sagt zum Beispiel in diesem Fall "Architecture: AnyCPU (64-Bit bevorzugt)" - aber ILSpy funktioniert nicht für Nicht-.NET-EXE-Dateien. Matt vor 7 Jahren 1
@Matt das macht dann viel Sinn; der native "Stub" ist wahrscheinlich 32 Bit und leitet dann gegebenenfalls die 64-Bit-Laufzeit ein? Guter Fund. briantist vor 7 Jahren 0
Das könnte der Fall sein, wie der alte "MZ" -Header, der nur für Nicht-Windows-Betriebssystem ("DOS") steht und "Diese Anwendung erfordert Microsoft Windows" lautet; Matt vor 7 Jahren 1
@Matt Ja, es war tatsächlich eine vollständige ausführbare Datei, und in Visual Studio konnte festgelegt werden, was Sie wollten. Sie können sowohl die DOS- als auch die Windows-Version der App in einer einzigen Datei buchstäblich unterstützen, oder die "DOS-Version" kann etwas völlig anderes machen. Ich habe eine Anwendung für Windows geschrieben, und dann war das DOS-Exe im Inneren ein eigenes Menüsystem, das Dienstprogramme zur Verfügung stellte, die Sie erledigen mussten, wenn Windows nicht lief (Startmenü-Beschriftung ändern usw.). briantist vor 7 Jahren 0
Ja, die guten alten Zeiten, als 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" ersetzen. :-D Matt vor 7 Jahren 2
34
wmassingham

Ich kann bestätigen, dass das fileDienstprogramm (z. B. von cygwin) zwischen ausführbaren 32- und 64-Bit-Dateien unterscheidet. 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 welches ist. Darüber hinaus unterscheidet es zwischen ausführbaren Dateien für die Konsole und die grafische Benutzeroberfläche.

Diese Lösung ist normalerweise für alle Entwickler verfügbar, die msysgit installiert haben. FrontierPsycho vor 7 Jahren 1
Warum haben ausführbare Dateien in Windows "MZ" anstelle von "PE"? Mohammadreza Panahi vor 6 Jahren 0
Erwähnenswert ist, dass GNU-Dienstprogramme als einzelne Binärdateien verfügbar sind, wenn Sie Cygwin sonst nicht benötigen. http://gnuwin32.sourceforge.net/packages/file.htm MJ Walsh vor 5 Jahren 0
30
Dracs

Eine einfache Methode besteht darin, es auszuführen (vorausgesetzt, Sie vertrauen darauf) und die Prozessregisterkarte im Task-Manager zu betrachten. 32-Bit-Prozesse zeigen am Ende des Prozessnamens "* 32" an. Wenn Sie nicht bereit sind, auf Ihrem Computer zu laufen, können Sie den EXE Explorer ausprobieren . Es enthält eine ganze Reihe von Informationen zu ausführbaren Dateien, einschließlich 32 oder 64 Bit.

Leider müssen Sie die ausführbare Datei ausführen. Möglicherweise müssen Sie die Architektur des Programms prüfen, um herauszufinden, warum es nicht ausgeführt wird. Mike Christiansen vor 12 Jahren 7
Wie führen Sie eine DLL aus? user34660 vor 8 Jahren 6
@ user34660 [RUNDLL32.EXE .] (https://stackoverflow.com/a/3044435/1105214) samsara vor 6 Jahren 1
@samusarin das sollte in der Post sein. user34660 vor 6 Jahren 1
@ user34660 Sie sind technisch korrekt, eine DLL hat keinen ** `main` ** - Einstiegspunkt und wird daher nicht als eigenständiger Prozess ausgeführt. Es wird eine Initialisierungsfunktion aufgerufen, wenn sie geladen wird, aber nicht "main" ist. samsara vor 6 Jahren 0
22
Lumi

Viele Leute haben den exzellenten 7-Zip installiert und den 7-Zip-Ordner 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.exeder betreffenden PE-Datei (Exe oder DLL):

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

Die Ausgabe enthält Zeilen wie folgt, wobei die CPUZeile entweder x86oder x64zeigt.

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 
wow ich habe nie gewusst, dass 7z das kann. Wahrscheinlich enthält es eine `file`-Implementierung? phuclv vor 6 Jahren 0
18
Andrew Lambert

Die 64-Bit-Version von Process Explorer kann Ihnen sagen. Führen Sie einfach die ausführbare Datei aus und öffnen Sie das Eigenschaftenfenster des Prozesses. Auf der Hauptregisterkarte befindet sich ein Eintrag mit der Aufschrift "Image: 32 Bit" oder "Image: 64 Bit".

"Einfach die ausführbare Datei ausführen" Und was ist, wenn Sie das Programm nicht ausführen möchten? Synetech vor 10 Jahren 23
@Synetech Die ursprüngliche Frage bedeutet nicht, dass dies der Fall ist. Andrew Lambert vor 10 Jahren 2
Dies ist meiner Meinung nach die einfachste Methode, es sei denn, die ausführbare Datei wird zu schnell beendet. starbeamrainbowlabs vor 9 Jahren 0
Wie führen Sie eine DLL aus? user34660 vor 8 Jahren 7
14
marsh-wiggle

Der einfachste Weg (wenn die Daten nicht vertraulich sind)

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

Die Additional informationOption bietet zusätzlich viele hilfreiche Informationen zur Datei.

Virustotalanalyse


Virustotal TrID

13
anishsane

Das Ausführen einer ausführbaren Datei und das Einchecken des Prozess-Explorers oder eines ähnlichen Tools hat einige offensichtliche Nachteile:

  1. Wir müssen den Prozess ausführen.
  2. Für die kurzlebigen Prozesse (wie zB Echo-Hallo-Welttypen) registriert der Process Explorer möglicherweise nicht einmal, dass ein neuer Prozess gestartet wurde.

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

Eine weitere Alternative wäre Cygwin zu verwenden Datei - Befehl. Ich habe es jedoch nicht unter Windows getestet. Es funktioniert gut auf Linuxes.

Usage: file program_under_test.exe 

BEARBEITEN: Gerade file.exe am Fenster getestet. funktioniert gut. :)

Dies fügt nichts hinzu, was von Dracs oder Richard nicht gesagt wurde. Dies erfordert immer noch das Ausführen des Programms, das der Autor vermeiden wollte. Ramhound vor 12 Jahren 0
Ich wollte nur sagen, dass es einige Situationen gibt, in denen die Methode von Dracs nicht viel hilfreich sein wird. anishsane vor 12 Jahren 1
>> Dazu muss noch das Programm ausgeführt werden, das der Autor vermeiden wollte: Nein. Wir führen es wie folgt aus: file.exe program_under_test.exe anishsane vor 12 Jahren 3
Diejenigen, die es vermeiden möchten, das gesamte `cygwin`-Paket zu installieren, können das [gnuwin32` file`-Paket] (http://gnuwin32.sourceforge.net/packages/file.htm) verwenden. Bob vor 12 Jahren 1
Ich habe gerade den cygwin "file" -Befehl ausgeführt, der nichts über 32 im Vergleich zu 64 Bits aussagt: "MS-DOS-Programmdatei PE für MS Windows (Konsole), Mono / .Net-Assembly" MarcH vor 11 Jahren 0
Sieht so aus, als ob Ihre Binärdatei selbst 32-Bit ist. Daher wird es nicht möglich sein, 32 gegen 64 Bit zu erkennen. Sie benötigen eine 64-Bit-Version des Datei-Dienstprogramms. Überprüfen Sie hier: http://cygwin.com/ml/cygwin-announce/2013-07/msg00030.html anishsane vor 11 Jahren 0
@anishsane Ganz 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. Windows-32-Bit-Programme werden als PE32 und 64-Bit- und .NET-Programme als PE32 + bereitgestellt. Die Bitness von `file` macht absolut keinen Unterschied - sowohl 32-Bit- als auch 64-Bit-Anwendungen können Daten von der Festplatte lesen. Bob vor 10 Jahren 6
@MarcH Nein, es hat dir gesagt, dass es eine .NET-Assembly ist, die keine Bit-Ness hat. Es ist weder win32 noch win64, es ist .NET. clacke vor 9 Jahren 0
@clacke interessant danke. Jetzt noch etwas interessanter: / cygdrive / c / Programme / Syncplicity / Syncplicity.exe: PE32-Programmdatei (GUI) Intel 80386 Mono / .Net-Assembly für MS Windows Dieses Programm läuft ohne * 32 im Task-Manager. MarcH vor 9 Jahren 0
... und sigcheck.exe meldet Syncplicity.exe als 32 Bit. MarcH vor 9 Jahren 0
@MarcH Ha! Das ist interessant. Ich vermute, das bedeutet, dass der .NET-Laufzeit-Stub 32-Bit hat. Es wird also für einen Bruchteil einer Sekunde ein 32-Bit-Prozess ausgeführt, der jedoch nur die .NET-Laufzeit startet, die einen nativen 64-Bit-Prozess erstellt. clacke vor 9 Jahren 1
Ich denke, dass PE32 + .NET-Dateien keinen Sinn machen. Sie sollten alle PE32 sein, um sicherzustellen, dass sie auf beiden Plattformen laufen. Möglicherweise wird der Stub-Code jedoch nie ausgeführt. Möglicherweise entdeckt Windows, dass es sich um eine .NET-Binärdatei handelt, und nur .NET direkt ausgeführt wird. Es wäre schön, einen Kommentar von jemandem zu hören, der es tatsächlich weiß. :-) clacke vor 9 Jahren 0
Es scheint, dass Windows 2000 den Stub ausgeführt hat, um die .NET-Laufzeitumgebung zu initiieren. XP und höher erkennen jedoch eine .NET-Binärdatei und führen .NET selbst aus. Es erstellt jedoch keinen neuen Prozess, es startet .NET im vorhandenen Prozess. Wenn es sich um ein PE32 auf einem 64-Bit-System handelt, wird es vor dem Fortfahren in PE32 + konvertiert. https://social.microsoft.com/Forums/ru-RU/14d2158d-9df7-448b-a2ac-adfcac2be6cb/wohin-tut-das-clr-get-loaded clacke vor 9 Jahren 1
10
megamorf

Hier ist eine Powershell-Lösung, keine externen Abhängigkeiten oder ähnliches. Öffnen Sie Powershell, fügen Sie die Funktion dort ein (drücken Sie zweimal die Eingabetaste, um zur Eingabeaufforderung zurückzukehren), und verwenden Sie sie wie in meinen Beispielen unter der Funktion:

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 } 

Hier ist eine Beispielausgabe:

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 
Glätte. Das obige Skript scheint einen Verweis auf die Datei offen zu lassen. Build konnte nicht erstellt werden, bis ich Powershell zum ersten Mal geschlossen habe (Skript zum Abfragen von DLL in \ bin ausgeführt). samsara vor 8 Jahren 0
Sehr cool. +1. Itanium ist auf jeden Fall 64bit :) Rich Homolka vor 7 Jahren 1
@samusarin: füge vielleicht $ stream.dispose (); `nach dem Schließen hinzu? Sollte Dateihandles freigeben. (https://stackoverflow.com/questions/1999858/how-bad-is-it-to-not-dispose-in-powershell) Yorik vor 6 Jahren 0
Eine vollständigere Version finden Sie in [Überprüfen Sie, ob das Exe 64-Bit ist] (https://reverseengineering.stackexchange.com/a/11373/2563). phuclv vor 6 Jahren 1