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

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

    Изучив значения заголовка из ответа Ричарда , я придумал решение, которое быстро, легко и требует только текстового редактора. Даже 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 можно найти в разделе 2.3.1 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.  Все права защищены.
    
    
     Дамп файла 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
     Copyright (C) Microsoft Corporation.  Все права защищены.
    
    
     Дамп файла C: \ Windows \ syswow64 \ cmd.exe
    
     Подпись PE
    
     Тип файла: ИСПОЛНИТЕЛЬНОЕ ИЗОБРАЖЕНИЕ
    
     ЗНАЧЕНИЯ ФАЙЛОВ
                  14C машина (x86)
                    4 количество секций
             4CE78E2B дата-время с печатью 20 ноября 09:00:27 2010
                    0 указатель файла на таблицу символов
                    0 количество символов
                   E0 размер дополнительного заголовка
                  102 характеристики
                        исполнимый
                        32-разрядная текстовая машина
     [...]
    

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

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

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

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

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

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

    Введите описание изображения здесь

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

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

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

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

     Usage: file program_under_test.exe 

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

    У многих людей есть отличная 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 detail Virustotal File detail является самым простым способом узнать, является ли бинарный файл 32-битным или 64-битным.

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

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


    [Virustotal TrID

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

    Interesting Posts

    Просеивать реализацию с помощью OpenCV 2.2

    В bash, как сортировать строки с числами в них?

    Как можно отключить веб-поиск в обновлении Windows 10 Anniversary Update (Build 1607)?

    средняя точка между двумя широтами и долготой

    Как я могу получить содержимое ресурса из статического контекста?

    Разрешить пользователям, не являющимся администратором, получить доступ к Windows 7 Home Premium через удаленный рабочий стол

    Перемещение файлов на основе списка старых и новых путей к файлам

    Передача объекта между компонентами @ViewScoped без использования параметров GET

    jQuery – Как выбрать значение по имени атрибута начинается с

    RuntimeException: ваш контент должен иметь ListView, чей атрибут id – ‘android.R.id.list’

    Автоматически создавать формулы для всех возможных линейных моделей

    Как изменить непрозрачность (альфа, прозрачность) элемента в элементе canvasа после его рисования?

    Как обновить отдельную библиотеку с помощью Composer?

    Как написать плагин для браузера?

    Нужно ли назначать строку переменной перед ее сопоставлением с другим?

    Давайте будем гением компьютера.