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ą 0x8664
pliku wykonywalnego x64 i 0x14c
x86. 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 .exe
pliku. 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.exe
z /headers
opcją 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.exe
SysInternals :
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 file
narzę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.
MZ
zamiast 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.
main
punktu 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.exe
na 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 CPU
odczytem wiersza albo, x86
albo x64
o 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
file
implementację 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 executable
A 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 information
opcja 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. :)
file
po 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ść file
robi 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 file
narzędzia z pakietu msys mingw . Działa jak polecenie unix. Podobne działa file
narzę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 SP2
ale inne jako Vista
lub 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.bat
zawierającej tylko ten wiersz kodu i zapisz go w C: \ temp:
c:\temp\x86or64.vbs %1
Utwórz plik tekstowy o nazwie x86or64.vbs
zawierają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
, .dll
etc.) 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.
.DMP
zrzut 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”.