Есть ли простой способ проверить, является ли двоичный файл 32-разрядным или 64-разрядным в Windows? Мне нужно проверить, прежде чем переместить программу на 32-битную машину и испытать впечатляющий сбой.
19 ответов
Изучив значения заголовков из ответа Ричарда, я нашел решение, которое является быстрым, простым и требует только текстового редактора. Даже Windows по умолчанию notepad.exe будет работать.
Откройте исполняемый файл в текстовом редакторе. Возможно, вам придется перетащить или использовать диалоговое окно «
Open...
редактора, поскольку Windows не показывает параметр «Open with...
в контекстном меню для исполняемых файлов.Проверьте первые печатные символы после первого появления
PE
. Эта часть, скорее всего, будет окружена хотя бы некоторым пробелом (может быть много), поэтому это можно легко сделать визуально.
Вот что вы найдете:
x86:
PE L
x64:
PE d†
Предупреждение: использование Блокнота по умолчанию для больших файлов может быть очень медленным, поэтому лучше не использовать его для файлов размером более мегабайта или немногих. В моем случае для отображения файла размером 12 МБ потребовалось около 30 секунд. Однако Notepad++ смог отобразить исполняемый файл размером 120 МБ практически мгновенно.
Это решение может быть полезно в случае, если вам нужно проверить файл на компьютере, на котором вы не можете установить дополнительное программное обеспечение.
Дополнительная информация:
Если у вас есть HEX-редактор, смещение PE Signature находится в смещении 0x3C
. Подпись - PE\0\0
(буквы "P" и "E", за которыми следуют два нулевых байта), за которыми следует двухбайтовый тип машины в Little Endian.
Соответствующие значения: 0x8664
для исполняемого файла x64 и 0x14c
для x86. Возможных значений гораздо больше, но вы, вероятно, никогда не столкнетесь ни с одним из них или не сможете запустить такие исполняемые файлы на вашем ПК с Windows.
Полный список типов компьютеров, а также остальные спецификации .exe можно найти в разделе « Типы машин» в Microsoft PE и COFF .
Инструмент SDK dumpbin.exe
с параметром /headers
содержит эту информацию, сравните эти два (я добавил жирный шрифт для ключевой информации)
PS [64] E:\ #4> dumpbin /headers C:\Windows\system32\cmd.exe Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\Windows\system32\cmd.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 8664 machine (x64) 6 number of sections 4CE798E5 time date stamp Sat Nov 20 09:46:13 2010 0 file pointer to symbol table 0 number of symbols F0 size of optional header 22 characteristics Executable Application can handle large (>2GB) addresses [...]
а также
PS [64] E:\ #5> dumpbin /headers C:\Windows\syswow64\cmd.exe Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\Windows\syswow64\cmd.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (x86) 4 number of sections 4CE78E2B time date stamp Sat Nov 20 09:00:27 2010 0 file pointer to symbol table 0 number of symbols E0 size of optional header 102 characteristics Executable 32 bit word machine [...]
Если у вас нет или вам не нужен весь Windows SDK или Visual Studio, вы можете использовать sigcheck.exe
из SysInternals:
sigcheck.exe C:\Windows\Notepad.exe
Выход:
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
Я могу подтвердить, что file
утилита (например, из cygwin) будет различать 32- и 64-битные исполняемые файлы. Они выглядят следующим образом:
32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows
Как видите, очень очевидно, что есть что. Кроме того, он различает исполняемые файлы консоли и графического интерфейса, что также очевидно.
Простой способ - запустить его (если вы доверяете ему) и взглянуть на вкладку процесса в диспетчере задач. 32-битные процессы покажут «* 32» в конце имени процесса. Если вы не хотите запускать его на своем компьютере, попробуйте EXE Explorer. Он покажет целую кучу информации об исполняемых файлах, в том числе 32 или 64-битные.
У многих людей установлен отличный 7-zip , и они добавили папку 7-Zip в свою PATH
. 7-zip понимает форматы файлов, отличные от ZIP и RAR, такие как файлы MSI и исполняемые файлы PE. Просто используйте командную строку 7z.exe
в рассматриваемом PE-файле (Exe или DLL):
7z l some.exe | more
7z l some.exe | findstr CPU
Вывод будет включать в себя следующие строки со строкой CPU
читающей x86
или x64
, о чем здесь и просят:
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
64-разрядная версия Process Explorer может сказать вам. Просто запустите исполняемый файл и откройте окно свойств процесса. На главной вкладке есть запись с надписью «Изображение:32-разрядная» или «Изображение:64-разрядная».
Самый простой способ (когда данные не являются конфиденциальными)
Я считаю, что детализация File detail
Virustotal - это самый простой способ выяснить, является ли двоичный файл 32-битным или 64-битным.
Опция Additional information
предоставляет дополнительно много полезной информации о файле.
Метод запуска исполняемого файла и последующей проверки в проводнике процессов или аналогичном инструменте имеет некоторые очевидные недостатки:
- Мы должны выполнить процесс.
- Для недолговечных процессов (таких как echo hello world types.) Обозреватель процессов может даже не регистрировать, что новый процесс запущен.
Метод Dumpbin.exe может решить цель возможно.
Другой альтернативой может быть использование команды file в cygwin. Тем не менее, я не проверял это на Windows. Это хорошо работает на Linux.
Usage: file program_under_test.exe
РЕДАКТИРОВАТЬ: Только что протестировал file.exe на окне. работает отлично. :)
Вот решение Powershell, никаких внешних зависимостей или чего-либо еще. Откройте Powershell, вставьте туда функцию (дважды нажмите Enter, чтобы вернуться к приглашению), затем используйте ее, как в моих примерах ниже функции:
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
}
Вот пример вывода:
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
Даже исполняемый файл, помеченный как 32-битный, может работать как 64-битный, если, например, это исполняемый файл .NET, который может работать как 32- или 64-битный. Для получения дополнительной информации см. Https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit, в котором есть ответ, что Утилита CORFLAGS может использоваться для определения того, как будет работать приложение .NET.
Вывод CORFLAGS.EXE
Для 32-битного исполняемого файла:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x3
ILONLY : 1
32BITREQ : 1
32BITPREF : 0
Signed : 0
Для 64-битного исполняемого файла:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
Для исполняемого файла, который может работать как 32- или 64-разрядный и будет работать как 64-разрядный, когда это возможно:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
Для исполняемого файла, который может работать как 32- или 64-разрядный, но будет работать как 32-разрядный, если не загружен в 64-разрядный процесс:
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x20003
ILONLY : 1
32BITREQ : 0
32BITPREF : 1
Signed : 0
Вы можете также использовать инструмент file
внутри MSys пачки MinGW. Это работает как команда unix. Аналогично работает file
инструмент из GNUwin32.
Если вы работаете в Windows 7, в проводнике Windows щелкните правой кнопкой мыши исполняемый файл и выберите «Свойства». В окне свойств выберите вкладку «Совместимость». Если в разделе «Режим совместимости» вы видите Windows XP, это 32-битный исполняемый файл. Если вы видите Windows Vista, она 64-битная.
Как добавить 32/64 битный тест в ваше контекстное меню
Создайте текстовый файл с именем exetest.reg и содержащий этот код:
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\""
Создайте текстовый файл с именем x86TestStart.bat
содержащий только эту строку кода, и сохраните его в C:\temp:
c:\temp\x86or64.vbs %1
Создайте текстовый файл с именем x86or64.vbs
содержащий этот код, и сохраните его в 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
Дважды щелкните файл exetest.reg: новый ключ будет добавлен в реестр Windows:
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
Он будет отображаться как « 32/64 bit test » в контекстном меню после щелчка правой кнопкой мыши по исполняемому файлу.
Щелчок по элементу приведет к запуску пакетного файла c:\\temp\\x86TestStart.bat\
, который запустит файл x86or64.vbs
, который считывает подпись exe и показывает результат.
Если вы не можете или не хотите вмешиваться в реестр, просто скопируйте файл .vbs на панели быстрого запуска и перетащите исполняемый файл поверх него.
Мои два цента будут просто скачать обходчик зависимостей и проверить, что за архитектура использовалась в одном из исполняемых файлов.
Как это использовать:
Просто скачайте приложение, запустите его, нажмите на значок "Открыть" → найдите файл * .exe → выберите и внизу после сканирования отражений вы увидите сетку с данными, в которой один столбец содержит детали "архитектуры" (x86, x64)
Откройте исполняемый файл и посмотрите архитектуру сборки
- запустить приложение
- открыть диспетчер задач
- щелкните правой кнопкой мыши и создайте файл дампа
- записать путь
- идти по пути и открыть
.DMP
дамп в Visual Studio - там вы получите все детали
- проверить архитектуру процесса:
Я не видел это упоминалось. Существует программа просмотра PE под названием CFF Explorer от NTCore, которая может предоставить вам эту информацию. Его можно скачать и запустить как переносной, но вы также можете установить его, если хотите.
Щелкните правой кнопкой мыши двоичный файл (.exe
, .dll
и т.д.) И выберите "Открыть с помощью CFF Explorer". Перейдите к Nt Headers -> File Header -> В поле "Характеристики" нажмите "Нажмите здесь"
Если это 32-битная программа, будет установлен флажок «32-битная машина слова». Например, я установил 32-битную версию Notepad++, как вы можете видеть на изображении ниже. В противном случае это 64 бит.
Тем не менее, file
команда WSL работает очень хорошо.
file /mnt/c/p/bin/rg.exe
будет выводить:
/mnt/c/p/bin/rg.exe: PE32+ executable (console) x86-64, for MS Windows
file /mnt/c/p/bin/u.exe
будет выводить:
/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
мои два цента: как разработчик C++, обходчик зависимостей (http://www.dependencywalker.com/) очень информативен, отображает не только 64/32 бита, но и каждый задействованный Dll:
Вы можете увидеть 64 слева от каждого имени файла ...