Czy istnieje prosty sposób sprawdzenia, czy plik binarny ma 32 lub 64 bity w systemie Windows? Muszę sprawdzić, zanim przeniosę program na maszynę 32-bitową i doświadczę spektakularnej awarii.
Czy istnieje prosty sposób sprawdzenia, czy plik binarny ma 32 lub 64 bity w systemie Windows? Muszę sprawdzić, zanim przeniosę program na maszynę 32-bitową i doświadczę spektakularnej awarii.
Odpowiedzi:
Po przeanalizowaniu wartości nagłówka z odpowiedzi Richarda wymyśliłem rozwiązanie, które jest szybkie, łatwe i wymaga tylko edytora tekstu. Działa nawet domyślny notepad.exe systemu Windows.
Otwórz plik wykonywalny w edytorze tekstu. Może być konieczne przeciągnięcie i upuszczenie lub skorzystanie z Open...okna edytora , ponieważ system Windows nie wyświetla Open with...opcji w menu kontekstowym dla plików wykonywalnych.
Sprawdź pierwsze znaki do wydrukowania po pierwszym wystąpieniu PE. Ta część najprawdopodobniej zostanie otoczona przez co najmniej trochę białych znaków (może być jej dużo), więc można to łatwo zrobić wizualnie.
Oto, co znajdziesz:
PE L
PE d†
Słowo ostrzeżenia: używanie domyślnego Notatnika na dużych plikach może być bardzo powolne, więc lepiej nie używać go do plików większych niż megabajt lub kilka. W moim przypadku wyświetlenie pliku 12 MiB zajęło około 30 sekund. Jednak Notepad ++ był w stanie wyświetlić plik wykonywalny 120 MiB prawie natychmiast.
To rozwiązanie może być przydatne w przypadku konieczności sprawdzenia pliku na komputerze, na którym nie można zainstalować żadnego dodatkowego oprogramowania.
Jeśli masz dostępny edytor HEX, przesunięcie podpisu PE znajduje się w przesunięciu 0x3C. Podpis to PE\0\0(litery „P” i „E”, po których następują dwa puste bajty), a następnie dwubajtowy typ maszyny w Little Endian.
Odpowiednie wartości dotyczą 0x8664pliku wykonywalnego x64 i 0x14cx86. Istnieje o wiele więcej możliwych wartości, ale prawdopodobnie nigdy nie napotkasz żadnej z nich ani nie będziesz mógł uruchomić takich plików wykonywalnych na komputerze z systemem Windows.
Pełna lista typów maszyn wraz z resztą specyfikacji .exe znajduje się w sekcji Typy maszyn specyfikacji Microsoft PE i COFF .
Microsoft PE and COFF Specification, który jest tak udokumentowaną umową, jak to możliwe, a także instrukcje, jak znaleźć dokładny adres nagłówka PE w dowolnym .exepliku. Jeśli masz bardziej wiarygodne źródło niż oficjalna specyfikacja Microsoft dotycząca własnego formatu wykonywalnego Microsoftu, chciałbym wiedzieć, co to jest.
Narzędzie SDK dumpbin.exez /headersopcją zawiera te informacje, porównaj te dwa (dodałem pogrubienie dla kluczowych informacji)
PS [64] E: \ # 4> śmietnik / nagłówki C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Dumper Wersja 10.00.40219.01
Prawa autorskie (C) Microsoft Corporation. Wszelkie prawa zastrzeżone.
Zrzut pliku C: \ Windows \ system32 \ cmd.exe
Znaleziono podpis PE
Typ pliku: WYKONANIE OBRAZU
WARTOŚCI NAGŁÓWKA PLIKU
8664 maszyna (x64)
6 liczba sekcji
4CE798E5 data i godzina Sob 20 listopada 09:46:13 2010
0 wskaźnik pliku do tablicy symboli
0 liczba symboli
Rozmiar F0 opcjonalnego nagłówka
22 cechy
Plik wykonywalny
Aplikacja może obsługiwać duże (> 2 GB) adresy
[...]
i
PS [64] E: \ # 5> śmietnik / nagłówki C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper Wersja 10.00.40219.01
Prawa autorskie (C) Microsoft Corporation. Wszelkie prawa zastrzeżone.
Zrzut pliku C: \ Windows \ syswow64 \ cmd.exe
Znaleziono podpis PE
Typ pliku: WYKONANIE OBRAZU
WARTOŚCI NAGŁÓWKA PLIKU
Maszyna 14C (x86)
4 liczba sekcji
Datownik 4CE78E2B Sob 20 listopada 09:00:27 2010
0 wskaźnik pliku do tablicy symboli
0 liczba symboli
Rozmiar E0 opcjonalnego nagłówka
102 cechy
Plik wykonywalny
32-bitowa maszyna słów
[...]
dumpbin /headers | findstr "machine"znacznie upraszcza prezentację tego, czego QA szuka ...
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
Jeśli nie masz lub nie chcesz całego zestawu Windows SDK lub Visual Studio, możesz użyć sigcheck.exeSysInternals :
sigcheck.exe C:\Windows\Notepad.exe
Wynik:
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
Mogę potwierdzić, że filenarzędzie (np. Z cygwin) rozróżnia pliki wykonywalne 32- i 64-bitowe. Wyglądają następująco:
32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows
Jak widać, jest bardzo oczywiste, która jest która. Dodatkowo rozróżnia pliki wykonywalne konsoli i GUI, również oczywiste, które jest które.
MZzamiast plików wykonywalnych w systemie Windows PE?
Prostą metodą jest uruchomienie go (zakładając, że mu ufasz) i spojrzenie na kartę procesu w menedżerze zadań. Procesy 32-bitowe pokażą „* 32” na końcu nazwy procesu. Jeśli nie jest to coś, co chcesz uruchomić na swoim komputerze, możesz wypróbować EXE Explorer . Wyświetli całą masę informacji o plikach wykonywalnych, w tym jeśli jest to wersja 32- lub 64-bitowa.
mainpunktu wejścia, więc nie będzie działać jako samodzielny proces. Podczas ładowania jest wywoływana funkcja inicjalizacji, ale nie jest to „main”.
Wiele osób ma zainstalowaną doskonałą wersję 7-zip i dodało do niej folder 7-Zip PATH. 7-zip rozumie formaty plików inne niż ZIP i RAR, takie jak pliki MSI i pliki wykonywalne PE. Wystarczy użyć wiersza polecenia 7z.exena odpowiednim pliku PE (Exe lub DLL):
7z l some.exe | more
7z l some.exe | findstr CPU
Dane wyjściowe będą zawierać wiersze w następujący sposób, z CPUodczytem wiersza albo, x86albo x64o to tutaj pytamy:
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
fileimplementację w środku?
64-bitowa wersja Process Explorer może ci powiedzieć. Po prostu uruchom plik wykonywalny i otwórz okno właściwości procesu. Na głównej karcie znajduje się wpis „Image: 32 Bit” lub „Image: 64 Bit”.

Simply run the executableA co jeśli nie chcesz uruchamiać programu?
Najprostszy sposób (gdy dane nie są poufne)
Uważam, że Virustotal File detail jest najprostszym sposobem, aby dowiedzieć się, czy plik binarny jest 32-bitowy czy 64-bitowy.
Ta Additional informationopcja zapewnia ponadto wiele przydatnych informacji o pliku.


Metoda uruchamiania pliku wykonywalnego, a następnie sprawdzania w eksploratorze procesów lub podobnym narzędziu, ma pewne oczywiste wady:
Metoda Dumpbin.exe może prawdopodobnie rozwiązać cel.
Inną alternatywą byłoby użycie polecenia pliku cygwina. Nie testowałem go jednak w systemie Windows. Działa dobrze w systemach Linux.
Usage: file program_under_test.exe
EDYCJA: Właśnie przetestowałem file.exe w oknie. działa w porządku. :)
filepo prostu odczytuje dane z dysku w formacie binarnym i sprawdza wszelkie magiczne liczby identyfikujące je, porównując z bazą danych. 32-bitowe programy systemu Windows pojawiają się jako PE32, a zarówno programy 64-bitowe, jak i .NET jako PE32 +. Sama bitowość filerobi absolutnie zerową różnicę - zarówno 32-bitowe, jak i 64-bitowe aplikacje mogą odczytywać dane z dysku, co jest wszystkim, czego potrzebuje.
Oto rozwiązanie Powershell, żadnych zewnętrznych zależności ani niczego. Otwórz PowerShell, wklej tam funkcję (naciśnij Enter dwa razy, aby powrócić do monitu), a następnie użyj jej jak w moich przykładach poniżej funkcji:
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
}
Oto przykładowy wynik:
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
$stream.dispose();po zamknięciu? Powinny zwolnić uchwyty plików. ( stackoverflow.com/questions/1999858/… )
Nawet plik wykonywalny oznaczony jako 32-bitowy może działać jako 64-bitowy, jeśli na przykład jest to plik wykonywalny .NET, który może działać jako 32- lub 64-bitowy. Aby uzyskać więcej informacji, zobacz https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit , który zawiera odpowiedź, która mówi, że Za pomocą narzędzia CORFLAGS można określić sposób działania aplikacji .NET.
Dane wyjściowe CORFLAGS.EXE
W przypadku 32-bitowego pliku wykonywalnego:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x3
ILONLY : 1
32BITREQ : 1
32BITPREF : 0
Signed : 0
W przypadku 64-bitowego pliku wykonywalnego:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
W przypadku pliku wykonywalnego, który może działać jako 32- lub 64-bitowy i będzie działał jako 64-bitowy, jeśli to możliwe:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
W przypadku pliku wykonywalnego, który może działać jako 32- lub 64-bitowy, ale będzie działał jako 32-bitowy, chyba że zostanie załadowany do procesu 64-bitowego:
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x20003
ILONLY : 1
32BITREQ : 0
32BITPREF : 1
Signed : 0
corflags : error CF008 : The specified file does not have a valid managed header)
możesz również użyć tego filenarzędzia z pakietu msys mingw . Działa jak polecenie unix. Podobne działa filenarzędzie z GNUwin32 .
Jeśli korzystasz z systemu Windows 7, w Eksploratorze Windows, kliknij prawym przyciskiem myszy plik wykonywalny i wybierz Właściwości. W oknie właściwości wybierz kartę Zgodność. Jeśli w sekcji Tryb zgodności widzisz Windows XP, jest to 32-bitowy plik wykonywalny. Jeśli widzisz system Windows Vista, jest on 64-bitowy.
Windows 8
Windows XP SP2ale inne jako Vistalub Windows 8. Więc ta metoda jest nieprawidłowa.
Utwórz plik tekstowy o nazwie exetest.reg i zawierający ten kod:
Windows Registry Editor Version 5.00
; What will appear in the contextual menu when right-clicking on a .exe file
[HKEY_CLASSES_ROOT\exefile\shell\command32_64]
@="32/64 bit test"
; What to do with it
; here, %1 is the file given as argument of the script
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
@="\"c:\\temp\\x86TestStart.bat\" \"%1\""
Utwórz plik tekstowy o nazwie x86TestStart.batzawierającej tylko ten wiersz kodu i zapisz go w C: \ temp:
c:\temp\x86or64.vbs %1
Utwórz plik tekstowy o nazwie x86or64.vbszawierający ten kod i zapisz go w C: \ temp:
rem Reading binary file in VBScript: http://stackoverflow.com/questions/21249440/modify-first-two-bytes-of-a-file-using-vbscript
rem Info on executables: https://dmoj.ca/problem/exe
rem x86/64 signature is located dinamycally; its position is addressed
rem from bytes in 0x3C-0x3D position.
rem Possible signatures;
rem "PE..L" (hex code: 50.45.00.00.4C) = 32 bit
rem "PE..d†" (hex code: 50.45.00.00.64.86) = 64 bit
' ------------------------------------
' Source code by Jumpkack 2015
' ------------------------------------
' Read all arguments from command line:
Set args = Wscript.Arguments
' Store first argument (full path to file)
FileName = args(0)
' Find address of executable signature:
FirstChars = readBinary(FileName)
FirstChars = FirstChars
Addr1 = asc(mid(FirstChars,61,1))
Addr2 = asc(mid(FirstChars,62,1))
AddrFinal = Addr2*256 + Addr1 + 1
' Check signature:
if ucase(hex(asc(mid(FirstChars,AddrFinal+4,2)))) = "4C" then Wscript.Echo Filename & " is a 32 bit executable."
if ucase(hex(asc(mid(FirstChars,AddrFinal+4,2)))) = "64" then Wscript.Echo Filename & " is a 64 bit executable."
Function readBinary(path)
Dim a, fso, file, i, ts
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.getFile(path)
If isNull(file) Then
wscript.echo "File not found: " & path
Exit Function
End If
Set ts = file.OpenAsTextStream()
'a = makeArray(file.size)
a=""
i = 0
While (Not ts.atEndOfStream) and (i<60000)
'a(i) = ts.read(1)
a = a + ts.read(1)
i = i + 1
Wend
ts.close
readBinary = a
End Function
Kliknij dwukrotnie plik exetest.reg: nowy klucz zostanie dodany do rejestru systemu Windows:
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
Pojawi się jako „ test 32/64-bitowy ” w menu kontekstowym po kliknięciu prawym przyciskiem myszy pliku wykonywalnego.
Kliknięcie elementu spowoduje uruchomienie pliku wsadowego c:\\temp\\x86TestStart.bat\, który uruchamia plik VBscript x86or64.vbs, który odczytuje sygnaturę exe i wyświetla wynik.
Jeśli nie możesz lub nie chcesz manipulować rejestrem, po prostu skopiuj plik .vbs na pasku QuickLaunch i przeciągnij nad nim plik wykonywalny.
Moje dwa centy będą po prostu walkerem zależności pobierania i sprawdzą, co dla architektury zostało użyte w jednym z plików wykonywalnych.
Wystarczy pobrać aplikację, uruchomić ją, kliknąć ikonę otwartą → znaleźć plik * .exe → wybrać, a na dole po zakończeniu skanowania refleksyjnego widać siatkę z danymi, w której w jednej kolumnie znajdują się szczegóły „architektury” (x86, x64)
Otwórz plik wykonywalny i zobacz architekturę kompilacji
Nie widziałem tego wspomnianego. Istnieje program przeglądarki PE o nazwie CFF Explorer firmy NTCore , który może dostarczyć ci te informacje. Można go pobrać i uruchomić jako przenośny, ale możesz go również zainstalować, jeśli chcesz.
Kliknij prawym przyciskiem myszy na plik binarny ( .exe, .dlletc.) i wybierz „Otwórz za pomocą CFF Explorer”. Idź do Nt Nagłówki -> Nagłówek pliku -> W polu „Charakterystyka” kliknij „Kliknij tutaj”
Jeśli jest to program 32-bitowy, pole wyboru „32-bitowa maszyna słów” zostanie zaznaczone. Na przykład zainstalowałem 32-bitową wersję Notepad ++, jak widać na poniższym obrazku. W przeciwnym razie jest 64-bitowy.
.DMPzrzut w Visual Studiomoje dwa centy: jako programista C ++ walker zależności ( http://www.dependencywalker.com/ ) jest bardzo pouczający, wyświetla nie tylko 64/32 bity, ale także wszystkie zaangażowane biblioteki Dll:

Możesz zobaczyć 64 po lewej stronie każdej nazwy pliku ...
Kolumna platformy w menedżerze zadań systemu Windows 10
Windows 7 nie ma kolumny platformy. Menedżer zadań systemu Windows 7 go nie wyświetli.
W systemie Windows 10 wybieranie kolumn nie jest już „widoczne”. W systemie Windows 10 na karcie szczegółów kliknij prawym przyciskiem myszy nagłówek kolumny, a następnie „wybierz kolumny”. Następnie zaznacz pole „platforma”.