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

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

251 голос | спросил Septagram 17 42011vEurope/Moscow11bEurope/MoscowThu, 17 Nov 2011 14:29:58 +0400 2011, 14:29:58

19 ответов


265

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

  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 Типы машин .

ответил Alexander Revo 13 MarpmFri, 13 Mar 2015 20:08:57 +03002015-03-13T20:08:57+03:0008 2015, 20:08:57
106

Инструмент 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-разрядная текстовая машина
[...]
ответил Richard 17 42011vEurope/Moscow11bEurope/MoscowThu, 17 Nov 2011 16:14:43 +0400 2011, 16:14:43
39

Если у вас нет или требуется весь SDK Windows или Visual Studio, вы можете использовать sigcheck.exe из SysInternals :

sigcheck.exe C: \ Windows \ Notepad.exe

Вывод:

Sigcheck v2.1 - просмотр файлов и просмотрщик подписи
Авторское право (C) 2004-2014 гг. Марк Руссинович
Sysinternals - www.sysinternals.com

C: \ Windows \ notepad.exe:
    Подтверждено: Подписано
    Дата подписания: 8:59 утра 8/22/2013
    Издатель: Microsoft Windows
    Описание: Блокнот
    Продукт: Microsoft «Windows®« Операционная система
    Версия Prod: 6.3.9600.16384
    Версия файла: 6.3.9600.16384 (winblue_rtm.130821-1623)
    Тип MachineType: 64-разрядный
ответил briantist 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 06 Sep 2014 19:02:25 +0400 2014, 19:02:25
31

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

32.exe: исполняемый файл PE32 (GUI) Intel 80386 для MS Windows
64.exe: PE32 + исполняемый (консольный) x86-64, для MS Windows

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

ответил wmassingham 17 Jam1000000amFri, 17 Jan 2014 06:08:47 +040014 2014, 06:08:47
30

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

ответил Dracs 17 42011vEurope/Moscow11bEurope/MoscowThu, 17 Nov 2011 14:39:49 +0400 2011, 14:39:49
18

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

введите описание изображения здесь>> </p></div>
										<div class=ответил Andrew Lambert 17 42011vEurope/Moscow11bEurope/MoscowThu, 17 Nov 2011 17:36:05 +0400 2011, 17:36:05

17

У многих людей есть отличный 7-zip и добавлена ​​папка 7-Zip для их PATH. 7-zip понимает форматы файлов, отличные от ZIP и RAR, такие как файлы MSI и исполняемые файлы PE. Просто используйте командную строку 7z.exe в файле PE (Exe или DLL):

7z l some.exe | Больше
7z l some.exe | Findstr CPU

Вывод будет содержать строки следующим образом: строка CPU, читающая либо x86, либо x64), вот что здесь задается:

Path = C: \ Extra \ AV \ neroAacEnc.exe
Тип = PE
CPU = x86
Характеристики = Исполняемый 32-разрядный

Path = C: \ Extra \ AV \ LAME \ lame_enc.dll
Тип = PE
CPU = x86
Характеристики = Исполняемая 32-разрядная DLL-версия

Path = C: \ Extra \ AV \ FFmpeg \ bin \ ffmpeg.exe
Тип = PE
CPU = x64
64-бит = +
Характеристики = Исполняемый файл LargeAddress NoRelocs NoLineNums NoLocalSyms NoDebugInfo

Path = C: \ Extra \ AV \ FFmpeg \ bin \ avcodec-56.dll
Тип = PE
CPU = x64
64-бит = +
Характеристики = Исполняемая DLL LargeAddress NoLineNums NoLocalSyms NoDebugInfo
ответил Lumi 4 +03002015-10-04T13:56:52+03:00312015bEurope/MoscowSun, 04 Oct 2015 13:56:52 +0300 2015, 13:56:52
13

Способ запуска исполняемого & то проверка в проводнике процесса или аналогичном инструменте имеет некоторые очевидные недостатки:

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

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

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

Использование: файл program_under_test.exe

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

ответил anishsane 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 27 Sep 2012 11:08:26 +0400 2012, 11:08:26
13

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

Я нахожу, что Virustotal Деталь файла - это самый простой способ узнать, является ли двоичный файл 32-разрядным или 64 бит.

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

Вирустотальный анализ


[Virustotal TrID

ответил boboes 5 Jpm1000000pmMon, 05 Jan 2015 19:53:58 +030015 2015, 19:53:58
10

Вот решение 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) | Из-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 = "" | выберите FilePath, FileType, Is64Bit
    $ result.FilePath = $ FilePath
    $ result.Is64Bit = $ false

    переключатель ($ machineUint)
    {
        0 {$ result.FileType = 'Native'}
        0x014c {$ result.FileType = 'x86'}
        0x0200 {$ result.FileType = 'Itanium'}
        0x8664 {$ result.FileType = 'x64'; $ result.is64Bit = $ true; }
    }

    $ результат
}

Вот пример вывода:

D: \ > Тест-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
ответил megamorf 19 MarpmThu, 19 Mar 2015 15:09:30 +03002015-03-19T15:09:30+03:0003 2015, 15:09:30
5

Даже исполняемый файл, помеченный как 32-разрядный, может работать как 64-разрядный, если, например, это исполняемый файл .NET, который может работать как 32-, так и 64-разрядный. Для получения дополнительной информации см. https: //stackoverflow.com/questions/3782191/how-do-determine-if-a-net-application-is-32-or-64-bit , в котором есть ответ, в котором говорится, что утилита CORFLAGS может использоваться для определения того, как будет выполняться приложение .NET.

Выход CORFLAGS.EXE

Для 32-битного исполняемого файла:

Версия: v2.0.50727
Заголовок CLR: 2.5
PE: PE32
CorFlags: 0x3
ЛЮБОЕ: 1
32BITREQ: 1
32BITPREF: 0
Подписан: 0

Для 64-битного исполняемого файла:

Версия: v2.0.50727
Заголовок CLR: 2.5
PE: PE32 +
CorFlags: 0x1
ЛЮБОЕ: 1
32BITREQ: 0
32BITPREF: 0
Подписан: 0

Для исполняемого файла, который может работать как 32- или 64-разрядный и будет работать как возможно 64-бит:

Версия: v2.0.50727
Заголовок CLR: 2.5
PE: PE32
CorFlags: 0x1
ЛЮБОЕ: 1
32BITREQ: 0
32BITPREF: 0
Подписан: 0

Для исполняемого файла, который может работать как 32- или 64-разрядный, но будет работать как 32-разрядный, если не загружен в 64-разрядный процесс:

Версия: v4.0.30319
Заголовок CLR: 2.5
PE: PE32
CorFlags: 0x20003
ЛЮБОЕ: 1
32BITREQ: 0
32BITPREF: 1
Подписан: 0
ответил BlueMonkMN 7 +03002015-10-07T18:32:36+03:00312015bEurope/MoscowWed, 07 Oct 2015 18:32:36 +0300 2015, 18:32:36
3

вы также можете использовать инструмент file из пула msys mingw . Он работает как команда unix. Аналогично работает инструмент file из GNUwin32 .

ответил Bastian Ebeling 5 Jpm1000000pmMon, 05 Jan 2015 16:54:17 +030015 2015, 16:54:17
2

Если вы находитесь в Windows 7, в проводнике Windows щелкните правой кнопкой мыши исполняемый файл и выберите «Свойства». В окне свойств выберите вкладку Совместимость. Если в разделе «Режим совместимости» вы видите Windows XP, это 32-битный исполняемый файл. Если вы видите Windows Vista, это 64 бит.

ответил axxis 6 Mayam15 2015, 11:51:55
2

Как добавить тест 32/64 бит в контекстное меню

Создайте текстовый файл с именем exetest.reg и содержащий этот код:

Редактор реестра Windows Version 5.00


; Что будет отображаться в контекстном меню при щелчке правой кнопкой мыши на файле .exe
[HKEY_CLASSES_ROOT \ EXEFILE \ оболочки \ command32_64]
@ = "32/64 бит тест"

; Что с этим делать
; здесь,% 1 - это файл, указанный в качестве аргумента скрипта
[HKEY_CLASSES_ROOT \ EXEFILE \ оболочки \ command32_64 \ команда]
@ = "\" c: \\ temp \\ x86TestStart.bat \ "\"% 1 \ ""

Создайте текстовый файл с именем x86TestStart.bat , содержащий только эту строку кода и сохраните его в C: \ temp:

c: \ temp \ x86or64.vbs% 1

Создайте текстовый файл с именем x86or64.vbs , содержащий этот код, и сохраните его в папке C: \ temp:

rem Чтение двоичного файла в VBScript: http://stackoverflow.com/questions/21249440/modify-first-two-bytes-of-a-file-using-vbscript
rem Информация об исполняемых файлах: https://dmoj.ca/problem/exe

rem x86 /64 подпись расположена динамически; его позиция адресована
rem из байтов в позиции 0x3C-0x3D.

rem Возможные подписи;
rem "PE..L" (шестнадцатеричный код: 50.45.00.00.4C) = 32 бит
rem "PE..dâ €" (шестнадцатеричный код: 50.45.00.00.64.86) = 64 бит

'------------------------------------
Исходный код Jumpkack 2015
'------------------------------------

'Читать все аргументы из командной строки:
Установить args = Wscript.Arguments

'Сохранить первый аргумент (полный путь к файлу)
FileName = args (0)

'Найти адрес исполняемой подписи:
FirstChars = readBinary (имя_файла)
FirstChars = FirstChars
Addr1 = asc (середина (FirstChars, 61,1))
Addr2 = asc (середина (FirstChars, 62,1))
AddrFinal = Addr2 * 256 + Addr1 + 1

'Проверить подпись:
если ucase (hex (asc (mid (FirstChars, AddrFinal + 4,2)))) = "4C", то Wscript.Echo Filename & «32-битный исполняемый файл».
если ucase (hex (asc (середина (FirstChars, AddrFinal + 4,2)))) = "64", то Wscript.Echo Filename & "- это 64-битный исполняемый файл."


Функция readBinary (путь)
    Dim a, fso, file, i, ts
    Установите fso = CreateObject ("Scripting.FileSystemObject")
    Установить файл = fso.getFile (путь)
    Если isNull (файл) Затем
        wscript.echo "Файл не найден:" & дорожка
        Функция выхода
    Конец Если
    Установите ts = file.OpenAsTextStream ()
    'a = makeArray (file.size)
    а = «»
    i = 0
    Хотя (не ts.atEndOfStream) и (i <60000)
       'a (i) = ts.read (1)
       a = a + ts.read (1)
       i = i + 1
    венед
    ts.close
    readBinary = a
 Конечная функция

Дважды щелкните файл exetest.reg: в реестре Windows будет добавлен новый ключ: <Сильный> [HKEY_CLASSES_ROOT \ EXEFILE \ оболочки \ command32_64 команда \]

Он появится как « 32/64 бит тест » в контекстном меню, щелкнув правой кнопкой мыши на исполняемом файле.

Щелчок по элементу приведет к запуску командного файла c: \ temp \ x86TestStart.bat **, который запустит файл VBscript ** x86or64.vbs , который считывает подпись exe и показывает результат.

Если вы не можете или не хотите вмешиваться в реестр, просто скопируйте файл .vbs в панель QuickLaunch и перетащите исполняемый файл поверх него.

ответил jumpjack 16 Jpm1000000pmSat, 16 Jan 2016 14:20:03 +030016 2016, 14:20:03
1

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

Как его использовать: Просто загрузите приложение, запустите его, нажмите на значок open -> найдите файл * .exe -> выберите и снизу после завершения сканирования отражения, вы увидите сетку с данными, в которых один столбец содержит в себе детали «архитектуры» (x86, x64)

Откройте исполняемый файл и посмотрите архитектуру сборки

ответил stenly 14 J0000006Europe/Moscow 2016, 03:19:11
0
  • запустите приложение
  • открыть диспетчер задач
  • щелкните правой кнопкой мыши и создайте файл дампа
  • отметить путь вниз
  • перейти к пути и открыть dump .DMP в Visual Studio
  • там вы получите все подробности
  • проверить архитектуру процесса:
ответил user429538 19 MarpmThu, 19 Mar 2015 14:39:51 +03002015-03-19T14:39:51+03:0002 2015, 14:39:51
0

Я не видел этого. Существует программа просмотра PE, называемая CFF Explorer, с помощью NTCore , которая может предоставить вам эту информацию. Его можно загрузить и запустить как переносимый, но вы также можете установить его, если хотите.

Щелкните правой кнопкой мыши на двоичном (.exe, .dll и т. д.) и выберите «Открыть с помощью CFF Explorer». Перейдите в Nt Headers -> Заголовок файла -> В поле «Характеристики» нажмите «Нажмите здесь»

Если это 32-битная программа, будет отмечен флажок «32-битный текстовый аппарат». Например, я установил 32-разрядную версию Notepad ++, как вы можете видеть на изображении ниже. В противном случае это 64 бит.

 введите описание изображения здесь>> </a> </p></div>
										<div class=ответил Nik-Lz 2 FebruaryEurope/MoscowbThu, 02 Feb 2017 01:27:17 +0300000000amThu, 02 Feb 2017 01:27:17 +030017 2017, 01:27:17

0

мои два цента: как разработчик C ++, ходок зависимостей ( http://www.dependencywalker.com/) очень информативен, не только отображает 64/32 бит, но также и каждую связанную DLL: введите описание изображения здесь

Вы можете увидеть 64 слева от каждого имени файла ...

ответил ingconti 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 28 Sep 2017 10:37:39 +0300 2017, 10:37:39
0

Тем не менее, команда WSL file работает очень сильно.

file /mnt/c/p/bin/rg.exe выводит:

/mnt/c/p/bin/rg.exe: исполняемый файл (консоль) PE32 + (консоль) x86-64 для MS Windows.

file /mnt/c/p/bin/u.exe выводит:

/mnt/c/p/bin/u.exe: исполняемый файл PE32 (GUI) Intel 80386, для MS Windows, сжатый UPX.

ответил Bohr 10 +03002017-10-10T03:41:35+03:00312017bEurope/MoscowTue, 10 Oct 2017 03:41:35 +0300 2017, 03:41:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132