Есть ли простой способ проверить, является ли двоичный файл 32-разрядным или 64-разрядным в Windows? Мне нужно проверить, прежде чем переместить программу на 32-битную машину и испытать впечатляющий сбой.
Есть ли простой способ проверить, является ли двоичный файл 32-разрядным или 64-разрядным в Windows? Мне нужно проверить, прежде чем переместить программу на 32-битную машину и испытать впечатляющий сбой.
Ответы:
Изучив значения заголовков из ответа Ричарда , я нашел решение, которое является быстрым, простым и требует только текстового редактора. Даже Windows по умолчанию notepad.exe будет работать.
Откройте исполняемый файл в текстовом редакторе. Возможно, вам придется перетащить или использовать Open...
диалоговое окно редактора , потому что Windows не показывает Open with...
опцию в контекстном меню для исполняемых файлов.
Проверьте первые печатные символы после первого появления PE
. Эта часть, скорее всего, будет окружена хотя бы некоторым пробелом (может быть много), поэтому это можно легко сделать визуально.
Вот что вы найдете:
PE L
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 .
Microsoft PE and COFF Specification
, которая является настолько документированным контрактом, насколько это возможно, а также инструкции по поиску точного адреса PE-заголовка. в любом .exe
файле. Если у вас есть более надежный источник, чем официальная спецификация Microsoft по собственному исполняемому формату Microsoft, я хотел бы знать, что это такое.
Инструмент SDK dumpbin.exe
с /headers
опцией включает эту информацию, сравните эти два (я добавил жирный шрифт для ключевой информации)
PS [64] E: \ # 4> свалка / заголовки C: \ Windows \ system32 \ cmd.exe Microsoft (R) COFF / PE Dumper Версия 10.00.40219.01 Авторское право (C) Microsoft Corporation. Все права защищены. Дамп файла C: \ Windows \ system32 \ cmd.exe PE подпись найдена Тип файла: EXECUTABLE IMAGE Значения заголовка файла 8664 машина (x64) 6 количество секций 4CE798E5 отметка даты времени сб 20 ноября 09:46:13 2010 0 указатель файла на таблицу символов 0 количество символов Размер F0 необязательного заголовка 22 характеристики исполнимый Приложение может обрабатывать большие (> 2 ГБ) адреса [...]
а также
PS [64] E: \ # 5> свалка / заголовки C: \ Windows \ syswow64 \ cmd.exe Microsoft (R) COFF / PE Dumper Версия 10.00.40219.01 Авторское право (C) Microsoft Corporation. Все права защищены. Дамп файла C: \ Windows \ syswow64 \ cmd.exe PE подпись найдена Тип файла: EXECUTABLE IMAGE Значения заголовка файла 14C машина (x86) 4 количество разделов 4CE78E2B отметка даты и времени сб 20 ноября 09:00:27 2010 0 указатель файла на таблицу символов 0 количество символов E0 размер необязательного заголовка 102 характеристики исполнимый 32-битный словарь [...]
dumpbin /headers | findstr "machine"
значительно упрощает представление того, что ищет QA ...
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
Если у вас нет или вам не нужен весь 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
Как видите, очень очевидно, что есть что. Кроме того, он различает исполняемые файлы консоли и графического интерфейса, что также очевидно.
MZ
вместо PE
?
Простой способ - запустить его (если вы доверяете ему) и взглянуть на вкладку процесса в диспетчере задач. 32-битные процессы покажут «* 32» в конце имени процесса. Если вы не хотите запускать его на своем компьютере, попробуйте EXE Explorer . Он покажет целую кучу информации об исполняемых файлах, включая 32-разрядную или 64-разрядную.
main
точки входа и поэтому не будет выполняться как отдельный процесс. Существует функция инициализации, которая вызывается при загрузке, но это не «главная» функция.
У многих людей установлен отличный 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
file
реализацию внутри?
64-разрядная версия Process Explorer может сказать вам. Просто запустите исполняемый файл и откройте окно свойств процесса. На главной вкладке есть запись с надписью «Изображение: 32-разрядная» или «Изображение: 64-разрядная».
Simply run the executable
А что если вы не хотите запускать программу?
Самый простой способ (когда данные не являются конфиденциальными)
Я считаю, что Virustotal File detail
- это самый простой способ узнать, является ли двоичный файл 32-разрядным или 64-разрядным.
Additional information
Вариант предусматривает в дополнении много полезных информации о файле.
Метод запуска исполняемого файла и последующей проверки в проводнике процессов или аналогичном инструменте имеет некоторые очевидные недостатки:
Метод Dumpbin.exe может решить цель возможно.
Другой альтернативой может быть использование команды file в cygwin . Тем не менее, я не проверял это на Windows. Это хорошо работает на Linux.
Usage: file program_under_test.exe
РЕДАКТИРОВАТЬ: Только что протестировал file.exe в окне. работает отлично. :)
cygwin
пакета, могут получить file
пакет gnuwin32 .
file
просто читает данные с диска в двоичном формате и проверяет их на наличие магических чисел, сравнивая их с базой данных. 32-битные программы Windows выпускаются как PE32, а 64-битные и .NET программы - PE32 +. Сама по file
себе разрядность делает абсолютно нулевую разницу - и 32-разрядные, и 64-разрядные приложения могут считывать данные с диска, и это все, что ему нужно.
Вот решение 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
$stream.dispose();
после закрытия? Должен освободить файловые дескрипторы. ( stackoverflow.com/questions/1999858/… )
Даже исполняемый файл, помеченный как 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
corflags : error CF008 : The specified file does not have a valid managed header
)
Вы также можете использовать file
инструмент из пакета Mysw от msys . Это работает как команда unix. Аналогично работает file
инструмент от GNUwin32 .
Если вы работаете в Windows 7, в проводнике Windows щелкните правой кнопкой мыши исполняемый файл и выберите «Свойства». В окне свойств выберите вкладку «Совместимость». Если в разделе «Режим совместимости» вы видите Windows XP, это 32-битный исполняемый файл. Если вы видите Windows Vista, она 64-битная.
Windows 8
Windows XP SP2
но другие показывают как Vista
или Windows 8
. Так что этот метод не является правильным.
Создайте текстовый файл с именем 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 битный тест » в контекстном меню после щелчка правой кнопкой мыши по исполняемому файлу.
Нажатие на элемент приведет к запуску пакетного файла c:\\temp\\x86TestStart.bat\
, который запускает файл VBscript x86or64.vbs
, который читает exe-подпись и показывает результат.
Если вы не можете или не хотите вмешиваться в реестр, просто скопируйте файл .vbs на панель быстрого запуска и перетащите исполняемый файл поверх него.
Мои два цента будут просто скачать обходчик зависимостей и проверить, что за архитектура использовалась в одном из исполняемых файлов.
Просто загрузите приложение, запустите его, нажмите на значок «Открыть» → найдите файл * .exe → выберите и внизу после сканирования отражений вы увидите сетку с данными, в которой один столбец содержит детали «архитектуры» (x86, x64)
Откройте исполняемый файл и посмотрите архитектуру сборки
Я не видел это упоминалось. Существует программа просмотра PE под названием CFF Explorer от NTCore , которая может предоставить вам эту информацию. Его можно скачать и запустить как переносной, но вы также можете установить его, если хотите.
Щелкните правой кнопкой мыши двоичный файл ( .exe
и .dll
т. Д.) И выберите «Открыть с помощью CFF Explorer». Перейдите к Nt Headers -> File Header -> В поле «Характеристики» нажмите «Нажмите здесь»
Если это 32-битная программа, будет установлен флажок «32-битное слово». Например, я установил 32-битную версию Notepad ++, как вы можете видеть на изображении ниже. В противном случае это 64 бит.
.DMP
дамп в Visual Studioдва моих цента: как разработчик C ++, обходчик зависимостей ( http://www.dependencywalker.com/ ) очень информативен, отображает не только 64/32 бита, но и каждый участвующий Dll:
Вы можете увидеть 64 слева от каждого имени файла ...
Тем не менее, WSL «s file
команда очень работает.
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
Столбец платформы в диспетчере задач Windows 10
Windows 7 не имеет столбца платформы. Таким образом, диспетчер задач Windows 7 не будет показывать это.
В Windows 10 выбор столбцов больше не находится под «видом». В Windows 10, когда вы находитесь на вкладке сведений, вы щелкаете правой кнопкой мыши заголовок столбца, а затем выбираете столбцы. Затем установите флажок «платформа».