Вопрос: Как проверить, является ли бинарный файл 32 или 64 бит в Windows?


Есть ли простой способ проверить, является ли бинарный файл 32 или 64 бит в Windows? Мне нужно проверить, прежде чем переместить программу на 32-битную машину и получить впечатляющий провал.


253
2017-11-17 10:29


Источник


Этот вопрос аналогичен, однако для его проверки требуется определенная работа. - ST3
@Guillaume: Исполняемые изображения не являются процессами. Диспетчер задач показывает только процессы. - IInspectable


Ответы:


После изучения значений заголовка из Ответ Ричарда, Я придумал решение, которое быстро, легко и требует только текстового редактора. Даже Windows-файл notepad.exe по умолчанию будет работать.

  1. Откройте исполняемый файл в текстовом редакторе. Возможно, вам придется перетаскивать или использовать редактор Open... диалога, поскольку Windows не показывает Open with... в контекстном меню для исполняемых файлов.

  2. Проверьте первые печатные символы после первого появления PE, Эта часть, скорее всего, будет окружена, по крайней мере, некоторым пробелом (может быть много), поэтому его можно легко сделать визуально.

Вот что вы найдете:

x86:

PE  L

x64:

PE  d†

Слово предупреждения: использование Блокнота по умолчанию для больших файлов может быть очень медленным, поэтому лучше не использовать его для файлов размером более мегабайта или нескольких. В моем случае потребовалось около 30 секунд, чтобы отобразить 12 файлов MiB. Однако Notepad ++ смог отобразить 120 исполняемых файлов MiB почти мгновенно.

Это решение может быть полезно, если вам нужно проверить файл на компьютере, на котором вы не можете установить какое-либо дополнительное программное обеспечение.

Дополнительная информация:

Если у вас имеется HEX-редактор, смещение PE Signature расположено со смещением 0x3C, Подпись PE\0\0 (буквы «P» и «E», за которыми следуют два нулевых байта), а затем двухбайтовый тип машины в Little Endian.

Соответствующие значения 0x8664 для x64 исполняемых и 0x14c для x86. Есть гораздо более возможные значения, но вы, вероятно, никогда не столкнетесь ни с одним из них, или сможете запускать такие исполняемые файлы на своем ПК с ОС Windows.

Полный список типов машин, а также остальные .exe-спецификации можно найти в Спецификация Microsoft PE и COFF  Типы машин раздел.


268
2018-03-13 17:08



Эй, это довольно хаки. И к лучшему, так как это фактически кажется самым быстрым и простым решением для подавляющего большинства случаев :) - Septagram
Редкий экземпляр, когда блокнот beat notepad ++. Блокнот показывает это правильно, в блокноте, с которым вы столкнулись с кодировкой, чтобы показать его, но это сработало! - zar
@CoDEmanX этот параметр означает, что IDE или JIT делают выбор для вас. Видеть этот вопрос или это Сообщение блога Больше подробностей. - Alexander Revo
@Inpectable, если бы вы на самом деле потрудились прочитать весь пост до его downvoting, вы бы видели ссылку на Microsoft PE and COFF Specification, который является таким же документированным контрактом, который он может получить, а также инструкции о том, как найти точный адрес PE-заголовка в любом .exe файл. Если у вас есть более надежный источник, чем официальная спецификация Microsoft в собственном исполняемом формате Microsoft, я хотел бы знать, что это такое. - Alexander Revo
Первый файл, который я проверяю, нет «PE», только «MZ», поэтому я предполагаю, что это решение не является надежным - NaturalBornCamper


Инструмент 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
Авторское право (C) Корпорация Microsoft. Все права защищены.


Дамп файла C: \ Windows \ system32 \ cmd.exe

Подпись PE

Тип файла: ИСПОЛНИТЕЛЬНОЕ ИЗОБРАЖЕНИЕ

ЗАРЕГИСТРИРОВАННЫЕ ФАЙЛЫ
             8664 (x64)
               6 количество секций
        4CE798E5 Дата Дата Сб Ноя 20 09:46:13 2010
               0 указатель файла на таблицу символов
               0 количество символов
              F0 размер дополнительного заголовка
              22 характеристики
                   исполнимый
                   Приложение может обрабатывать большие (> 2 ГБ) адреса
[...]

а также

PS [64] E: \ # 5> dumpbin / headers C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper Version 10.00.40219.01
Авторское право (C) Корпорация Microsoft. Все права защищены.


Дамп файла C: \ Windows \ syswow64 \ cmd.exe

Подпись PE

Тип файла: ИСПОЛНИТЕЛЬНОЕ ИЗОБРАЖЕНИЕ

ЗАРЕГИСТРИРОВАННЫЕ ФАЙЛЫ
              14C машина (x86)
               4 количество секций
        4CE78E2B дата с отметкой времени 20 ноября 09:00:27 2010
               0 указатель файла на таблицу символов
               0 количество символов
              E0 размер дополнительного заголовка
             102 характеристики
                   исполнимый
                   32-разрядная текстовая машина
[...]

106
2017-11-17 12:14



Вы также можете увидеть (IA64) для 64-битного Itanium exe. - Darryl Braaten
как я читал в другом месте на суперпользователе, используя dumpbin /headers | findstr "machine" значительно упрощает представление того, что ищет QA ... - user1055604
Dumpbin.exe находится здесь: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David: не обязательно (другая версия VS, не использующая место установки по умолчанию, используя версию из SDK Windows): вот почему я не уточнил. - Richard
Проще всего использовать dumpbin, если вы запустите его из командной строки visual studio: stackoverflow.com/a/477389/1390430 - Ben


Если у вас нет или требуется весь SDK Windows или 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

39
2017-09-06 15:02



Кажется, это не всегда точно: попробуйте использовать его с LinqPad.exe (AnyCPU-64-разрядная версия), а Sigcheck сообщит вам, что это «32-битный» ... - Matt
@Matt интересно. LinqPad звучит как приложение .net; Интересно, работает ли sigcheck только на собственных исполняемых файлах (для этой цели). - briantist
Да, это приложение .NET. В .NET, если он не был предварительно скомпилирован, вы можете либо настроить «x86», либо «AnyCPU». «x86» всегда будет работать как 32 бит, но AnyCPU будет работать как 64-битный в 64-битной системе, но 32 бит в 32-битной системе. SigCheck должен рассмотреть это и показать хотя бы «.NET 32 бит или 64 бит (AnyCPU)». Например, ILSpy говорит в этом случае «Архитектура: AnyCPU (предпочтительный вариант с 64-битной версией)», но ILSpy не будет работать для не-EXE EXE. - Matt
Это может быть так, как старый «MZ» заголовок, который есть только для ОС, отличной от Windows («DOS»): «Это приложение требует Microsoft Windows» ... ;-) - Matt
Да, старые добрые времена, когда у вас был отладчик DOS в оболочке, и можно разобрать код (который просто содержал один вызов DOS, который печатает это сообщение) ... и заменить текст «Ответ на 42». :-D - Matt


Я могу подтвердить, что file Утилита (например, из cygwin) будет различать 32- и 64-разрядные исполняемые файлы. Они выглядят следующим образом:

32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows

Как вы можете видеть, это очень очевидно, что есть. Кроме того, он различает консольные и графические исполняемые файлы, также очевидные, что есть.


31
2018-01-17 02:08



Это решение довольно часто доступно для всех разработчиков, которые установили msysgit. - FrontierPsycho
Почему исполняемые файлы в окнах MZ вместо PE? - Mohammadreza Panahi


Простым методом является его запуск (если вы доверяете ему) и посмотрите вкладку процесса в диспетчере задач. 32-битные процессы покажут «* 32» в конце имени процесса. Если это не то, что вы готовы запустить на своем компьютере, вы можете попробовать EXE Explorer, Он покажет всю информацию об исполняемых файлах, включая 32 или 64 бит.


30
2017-11-17 10:39



К сожалению, для этого требуется запустить исполняемый файл. Возможно, вам нужно проверить архитектуру программы как метод устранения неполадок, почему она не работает. - Mike Christiansen
Как вы запустить DLL? - user34660
@ user34660 RUNDLL32.EXE <имя_файла>, <точка входа> - samsara
@samusarin, который должен быть в должности. - user34660
@ user34660 Вы технически верны, DLL не имеет main точка входа и поэтому не будет выполняться как самостоятельный процесс. Существует функция инициализации, которая называется, когда она загружается, но это не является «основным». - samsara


64-битная версия Проводник процессов может сказать вам. Просто запустите исполняемый файл и откройте окно свойств процесса. На главной вкладке есть запись с надписью «Изображение: 32 бит» или «Изображение: 64 бит».

enter image description here


18
2017-11-17 13:36



Simply run the executable А что, если ты не хочешь бег программа? - Synetech
@Synetech Исходный вопрос не означает, что это так. - Andrew Lambert
Это самый простой метод для меня, я думаю, если исполняемый файл не выйдет слишком быстро. - starbeamrainbowlabs
Как вы запустить DLL? - user34660


У многих людей отличная 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

17
2017-10-04 10:56





Метод запуска исполняемого файла, а затем проверки в проводнике процессов или аналогичном инструменте имеет некоторые очевидные недостатки:

  1. Мы должны выполнить этот процесс.
  2. Для короткоживущих процессов (например, типов echo hello world.), Проводник процессов может даже не регистрировать, что начался новый процесс.

Метод Dumpbin.exe может, вероятно, решить эту задачу.

Другой альтернативой было бы использование cygwin's файл команда. Однако я не тестировал его на окнах. Он отлично работает на Linux.

Usage: file program_under_test.exe

EDIT: только что протестировал файл .exe в окне. работает отлично. :)


13
2017-09-27 07:08



Просто хотел сказать, что есть некоторые ситуации, где метод Дракса не будет очень полезен. - anishsane
>> Это по-прежнему требует запуска программы, которую автор хотел избежать: Нет .. мы запускаем ее как: file.exe program_under_test.exe - anishsane
И те, кто хочет избежать установки целого cygwin пакет может захватить gnuwin32 file пакет, - Bob
@anishsane Полностью неправильно. file просто считывает данные с диска в двоичном формате и проверяет любые магические числа, идентифицирующие их, сравнивая с базой данных. 32-разрядные программы Windows выглядят как PE32, а обе 64-разрядные и .NET-программы выглядят как PE32 +. Битность file сама делает абсолютно нулевую разницу - как 32-битные, так и 64-битные приложения могут считывать данные с диска, что все, что ему нужно. - Bob
@MarcH Ха! Что является интересно. Я предполагаю, что это означает, что промежуток времени выполнения .NET 32-бит. Таким образом, он выполняет 32-разрядный процесс на долю секунды, но весь этот процесс запускает среду выполнения .NET, которая создает собственный 64-разрядный процесс. - clacke


Самый простой способ (когда данные не являются конфиденциальными)

Я считаю, что VirusTotal  File detail это самый простой способ узнать, является ли бинарный файл 32-битным или 64-битным.

Additional information опция предоставляет дополнительную полезную информацию о файле.

Virustotal analysis


[Virustotal TrID


13
2018-01-05 16:53





Вот решение 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

10
2018-03-19 12:09



Ровности. Вышеприведенный скрипт оставляет ссылку на файл открытым. Не удалось создать, пока я не закрыл powershell (запущенный скрипт для опроса DLL в \ bin). - samsara
Очень круто. +1. Itanium определенно 64-битный :) - Rich Homolka
@samusarin: может быть, добавить $stream.dispose(); после закрытия? Должны освобождать файлы. ( stackoverflow.com/questions/1999858/... ) - Yorik