Как проверить, является ли двоичный файл 32-разрядным или 64-разрядным в Windows?

210863
Septagram

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

268
[Этот вопрос похож] (http://reverseengineering.stackexchange.com/q/6040/8247), однако для его проверки требуется определенная работа. ST3 10 лет назад 0
@Guillaume: исполняемые изображения не являются процессами. Диспетчер задач показывает только процессы. IInspectable 7 лет назад 3
[Как определить, является ли устанавливаемое приложение 32-разрядным или 64-разрядным?] (Https://stackoverflow.com/q/1858358/995714) phuclv 6 лет назад 0

19 ответов на вопрос

280
Alexander Revo

After examining header values from Richard's answer, I came up with a solution which is fast, easy, and only requires a text editor. Even Windows' default notepad.exe would work.

  1. Open the executable in text editor. You might have to drag-and-drop or use the editor's Open... dialog, because Windows doesn't show Open with... option in context menu for executables.

  2. Check the first printable characters after the first occurrence of PE. This part is most likely to be surrounded by at least some whitespace (could be a lot of it), so it can be easily done visually.

Here is what you're going to find:

x86:

PE L 

x64:

PE d† 

A word of warning: using default Notepad on big files can be very slow, so better not use it for files larger than a megabyte or few. In my case in took about 30 seconds to display a 12 MiB file. Notepad++, however, was able to display a 120 MiB executable almost instantly.

This is solution might be useful in case you need to inspect a file on a machine you can't install any additional software on.

Additional info:

If you have a HEX-Editor available, the offset of PE Signature is located at offset 0x3C. The signature is PE\0\0 (letters "P" and "E" followed by two null bytes), followed by a two byte Machine Type in Little Endian.

The relevant values are 0x8664 for x64 executable and 0x14c for x86. There are a lot more possible values, but you probably won't ever encounter any of these, or be able to run such executables on your Windows PC.

Full list of machine types, along with the rest of .exe specifications can be found in Microsoft PE and COFF Specification Machine Types section.

Эй, это довольно нахально. И к лучшему, поскольку на самом деле это кажется самым быстрым и простым решением для подавляющего большинства случаев :) Septagram 9 лет назад 17
Редкий случай, когда блокнот побил блокнот ++. Блокнот показывает это правильно, в блокноте вы возитесь с кодировкой, чтобы показать это, но это сработало! zar 8 лет назад 4
@zadane это интересно. По моему опыту, Notepad ++ всегда использовал кодировку ANSI при открытии исполняемых файлов. Хотя это определенно затрудняет поиск необходимого фрагмента, показывая нулевые байты в виде `NUL` вместо пробела. Alexander Revo 8 лет назад 0
Вот код Java, который выполняет проверку: http://stackoverflow.com/a/35418180/875305 11101101b 8 лет назад 0
Я нашел PE] _ÙV в 32-битном приложении WPF. rleelr 8 лет назад 0
@AnotherDayAnotherRob это интересно. Технически, тип машины - это два байта после `PE \ 0 \ 0`, поэтому, предполагая, что в вашем комментарии два пробела` \ 0`, значение будет равно `0x5F5D` (` 5D 5F`, если вы откроете в HEX- редактор по порядку байтов). Нет ничего похожего на это значение в [Спецификации Microsoft PE и COFF] (https://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx) (раздел 2.3.1. Типы компьютеров). Вы уверены, что искали в правильном месте? Alexander Revo 8 лет назад 0
@AlexanderRevo мой плохой, я еще раз посмотрел на файл, и это PE L] _ÙV (пробел не для печати символов) Я не заметил L в первый раз. Имейте upvote. rleelr 8 лет назад 0
У меня есть своя собственная программа, скомпилированная (с Delphi) как 32/64 бит, и заголовок идентичен !!! Таким образом, этот метод не всегда работает! Rigel 8 лет назад 0
@SolarWind В Windows нет такой вещи, как 32/64 битный исполняемый файл. Вы, вероятно, компилируете его как 32-битный, который будет работать как на 32, так и на 64-битных системах. 64-битная Windows может нормально запускать 32-битные программы. Alexander Revo 8 лет назад 0
@AlexanderRevo: в Visual Studio есть опция компиляции * AnyCPU *. Если это было то же самое, что и компиляция для 32-битной системы, зачем им добавлять этот третий вариант? CoDEmanX 8 лет назад 0
@CoDEmanX эта опция означает, что IDE или JIT сделает выбор за вас. Смотрите [этот вопрос] (http://stackoverflow.com/q/516730/3811791) или этот [пост в блоге] (http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu -really-средства-как-из-сети-45-и-visual-studio-11 /) для более подробной информации. Alexander Revo 8 лет назад 2
Это довольно хрупкое решение. Если вы понимаете образы PE, вы должны сразу же увидеть, что первый открытый текст `PE`, который вы найдете в файле, может на самом деле не быть заголовком PE. Кроме того, без документированного контракта ничто из этого не является надежным, ни сегодня, ни, конечно, не на будущее. Извините, -1. IInspectable 7 лет назад 0
@IInspectable, если бы вы на самом деле потрудились прочитать весь пост, прежде чем понизить его голосование, вы бы увидели ссылку на «Microsoft PE и COFF Specification», которая является настолько документированным контрактом, насколько это возможно, а также инструкции о том, как найти точный адрес PE-заголовка в любом файле `.exe`. Если у вас есть более надежный источник, чем официальная спецификация Microsoft по собственному исполняемому формату Microsoft, я хотел бы знать, что это такое. Alexander Revo 7 лет назад 2
@AlexanderRevo: * "Проверьте первые печатные символы после первого появления PE" * - Это явно неправильно, нет? Заголовок PE может быть ** где угодно ** в файле. И хотя формат файла PE задокументирован, `PIMAGE_DOS_HEADER` - нет. Кроме того, прямо на первой странице этой так называемой * "спецификации" * вы найдете: * "Этот документ предоставлен для помощи в разработке инструментов и приложений для Windows, но ** не гарантируется, что он будет полной спецификацией. ** во всех отношениях. Microsoft оставляет за собой право изменять этот документ без предварительного уведомления "*. Голосование за вниз вполне заслуженно, извините. IInspectable 7 лет назад 0
У меня не работает exe, созданный с помощью собственного кода C ++, Visual Studio 2013. Используя этот метод, можно сделать вывод, что он 32-битный, но на самом деле он 64-битный и может быть проверен с помощью dumpbin и sigcheck. zumalifeguard 7 лет назад 0
@zumalifeguard Могу я взглянуть на этот exe? Alexander Revo 7 лет назад 0
Конечно, Александр. Дайте мне свой адрес электронной почты, и я отправлю его вам. если вы можете, вы можете отправить мне свой адрес электронной почты в Twitter. zumalifeguard 7 лет назад 0
@zumalifeguard Я не могу связаться с вами в Твиттере, и я на самом деле не фанат идеи, чтобы дать свою электронную почту людям в Интернете (без обид). Не могли бы вы загрузить его на какой-нибудь файлообменный сервис, например, на Google Drive или что-то в этом роде? Благодарю. Alexander Revo 7 лет назад 0
@zumalifeguard Спасибо, что прислали мне .exe. Я проверил это, используя мою технику, и она показывает `PE d †`, которая является 64-битной, что именно то, о чем говорится в моем посте. Я не уверен, почему вы думали, что мои посты предполагают, что это 32-битный. Alexander Revo 7 лет назад 0
Первый файл, который я проверяю, нет "PE", только "MZ", поэтому я думаю, что это решение не является надежным NaturalBornCamper 7 лет назад 2
@NaturalBornCamper попробуйте запустить реальный поиск в вашем редакторе. Alexander Revo 7 лет назад 1
Да, я попробовал с Notepad ++;) В любом случае нашел другой способ, который работает на 100%, так что все хорошо, спасибо! NaturalBornCamper 7 лет назад 0
@NaturalBornCamper Я хотел бы изучить этот .exe, чтобы я мог сделать свой ответ более точным, если, конечно, вы не против и у вас есть время загрузить его куда-нибудь. Тем не менее, я должен сказать, что мне еще не удалось увидеть ни одного .exe-файла, на который мой ответ не сработал (пока это были только люди, неверно истолковавшие результаты), поэтому извините, если я немного скептически отношусь. В любом случае, моя цель - предоставить точную информацию, поэтому я был бы признателен, если бы вы могли помочь мне получить этот .exe :) Alexander Revo 7 лет назад 0
Для файлов, которые начинаются с "MZ", вам нужно посмотреть немного дальше. Я нашел PE..L со смещением 0x110, сразу после "RichMQ _........". jnnnnn 6 лет назад 4
112
Richard

Инструмент 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-битный словарь [...] 
Вы также можете увидеть (IA64) для 64-битного Itanium exe. Darryl Braaten 13 лет назад 1
как я читал в другом месте на superuser, используя `dumpbin / headers | findstr "machine" `значительно упрощает представление того, что ищет QA ... user1055604 11 лет назад 20
Dumpbin.exe находится здесь: `C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ bin` Devid 10 лет назад 3
@David: не обязательно (другая версия VS, не использующая место установки по умолчанию, использующая версию из Windows SDK): именно поэтому я не указал. Richard 10 лет назад 3
Проще всего использовать dumpbin, если вы запускаете его из командной строки visual studio: http://stackoverflow.com/a/477389/1390430 Ben 9 лет назад 5
Это довольно сложно для людей, у которых не установлена ​​визуальная студия. Varad Mahashabde 7 лет назад 0
system ** 32 ** \ cmd.exe показывает x64, а syswow ** 64 ** \ cmd.exe показывает x86 .. Так что для подтверждения .. 8664 Машина 64-битная. Правильно ? Ashish Negi 7 лет назад 0
41
briantist

Если у вас нет или вам не нужен весь 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 
Кажется, это не всегда точно: попробуйте использовать его с LinqPad.exe (версия AnyCPU-64bit), и Sigcheck скажет вам, что это «32 бит» ... Matt 7 лет назад 3
@ Матт интересно. LinqPad звучит как приложение .net; Интересно, работает ли sigcheck корректно только на нативных исполняемых файлах (для этой цели). briantist 7 лет назад 0
Да, это приложение .NET. В .NET, если он предварительно не скомпилирован, вы можете указать «x86» или «AnyCPU». «x86» всегда будет работать как 32-битный, но AnyCPU будет работать как 64-битный в 64-битной системе, но как 32-битный в 32-битной системе. SigCheck должен учитывать это и показывать как минимум «32-битный или 64-битный (AnyCPU) .NET». Например, ILSpy в этом случае говорит: «Архитектура: AnyCPU (предпочтительно 64-разрядная версия)», но ILSpy не будет работать для не-.NET EXE-файлов. Matt 7 лет назад 1
@Matt, который тогда имеет большой смысл; родной "заглушка", вероятно, 32-разрядный, а затем он запускает 64-разрядную среду выполнения, где это уместно? Хорошая находка. briantist 7 лет назад 0
Это может иметь место, например, старый заголовок «MZ», который есть только для ОС, отличной от Windows («DOS») и говорящий «Это приложение требует Microsoft Windows» ... ;-) Matt 7 лет назад 1
@Matt, да, на самом деле это был полный исполняемый файл, и в Visual Studio вы можете установить то, что хотите. Вы можете буквально поддерживать версии приложения для DOS и Windows в одном файле, или «версия DOS» может сделать что-то совершенно другое. Я написал приложение для Windows, а затем DOS exe внутри представляла собой собственную систему меню, предлагающую утилиты для выполнения действий, которые вы должны были выполнять, пока Windows не работала (измените заголовок меню «Пуск» и т. Д.). briantist 7 лет назад 0
Да, в старые добрые времена, когда у вас был отладчик DOS в оболочке, и вы могли разобрать код (который содержал только один вызов DOS, распечатывающий это сообщение) ... и заменить текст на «Ответ 42». :-D Matt 7 лет назад 2
34
wmassingham

I can confirm that the file utility (e.g. from cygwin) will distinguish between 32- and 64-bit executables. They appear as follows:

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

As you can see, it's very obvious which is which. Additionally it distinguishes between console and GUI executables, also obvious which is which.

Это решение довольно широко доступно для любых разработчиков, которые установили msysgit. FrontierPsycho 7 лет назад 1
Почему исполняемые файлы в Windows имеют `MZ` вместо` PE`? Mohammadreza Panahi 6 лет назад 0
Стоит отметить, что утилиты GNU можно получить как отдельные двоичные файлы, если в противном случае вам не нужен Cygwin. http://gnuwin32.sourceforge.net/packages/file.htm MJ Walsh 5 лет назад 0
30
Dracs

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

К сожалению, для этого требуется запустить исполняемый файл. Возможно, вам нужно проверить архитектуру программы как способ устранения неполадок, почему она не работает. Mike Christiansen 12 лет назад 7
Как ** вы ** запускаете DLL? user34660 8 лет назад 6
@ user34660 [RUNDLL32.EXE ,] (Https://stackoverflow.com/a/3044435/1105214) samsara 6 лет назад 1
@ samusarin, который должен быть в посте. user34660 6 лет назад 1
@ user34660 Вы технически правы, DLL не имеет ** `main` ** точки входа и поэтому не будет выполняться как отдельный процесс. Существует функция инициализации, которая вызывается при загрузке, но это не «главная» функция. samsara 6 лет назад 0
22
Lumi

Many people have the excellent 7-zip installed, and have added the 7-Zip folder to their PATH. 7-zip understands file formats other than ZIP and RAR, such as MSI files and PE executables. Simply use the command line 7z.exe on the PE file (Exe or DLL) in question:

7z l some.exe | more 7z l some.exe | findstr CPU 

Output will include lines as follows, with the CPU line reading either x86 or x64, which is what is being asked here:

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 
вау, я никогда не знал, что 7z может сделать это. Возможно, он содержит реализацию `file` внутри? phuclv 6 лет назад 0
18
Andrew Lambert

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

enter image description here

`Просто запустите исполняемый файл` А что, если вы не хотите * запускать * программу? Synetech 10 лет назад 23
@Synetech Оригинальный вопрос не подразумевает, что это так. Andrew Lambert 10 лет назад 2
Я думаю, это самый простой метод, если исполняемый файл не выходит слишком быстро. starbeamrainbowlabs 9 лет назад 0
Как ** вы ** запускаете DLL? user34660 8 лет назад 7
14
marsh-wiggle

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

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

Additional informationВариант предусматривает в дополнении много полезных информации о файле.

Virustotal analysis


[Virustotal TrID

13
anishsane

The method of running an executable & then checking in process explorer or similar tool, has some obvious drawbacks:

  1. We have to execute the process.
  2. For the short lived processes (like echo hello world types.), process explorer might not even register that a new process has started.

Dumpbin.exe method can solve the purpose probably.

Another alternative would be to use cygwin's file command. However, I have not tested it on windows. It works well on Linuxes.

Usage: file program_under_test.exe 

EDIT: Just tested file.exe on window. works fine. :)

Это не добавляет ничего, что не было сказано Драксом или Ричардом. Это все еще требует запуска программы, которую автор хотел избежать. Ramhound 12 лет назад 0
Просто хотел сказать, что есть некоторые ситуации, когда метод Дракса не будет очень полезным. anishsane 12 лет назад 1
>> Это все еще требует запуска программы, которую автор хотел избежать: Нет .. мы запускаем ее так: file.exe program_under_test.exe anishsane 12 лет назад 3
А те, кто хочет избежать установки всего пакета `cygwin`, могут получить пакет [gnuwin32` file`] (http://gnuwin32.sourceforge.net/packages/file.htm). Bob 12 лет назад 1
Я только что выполнил команду «file» в cygwin, и она ничего не говорит о 32-битной и 64-битной версиях: `исполняемый файл MS-DOS для MS Windows (консоль), сборка Mono / .Net` MarcH 11 лет назад 0
Похоже, ваш двоичный файл «file» является 32-битным. Следовательно, он не сможет обнаружить 32 против 64 бит. Вам нужна 64-битная версия файловой утилиты. Проверьте здесь: http://cygwin.com/ml/cygwin-announce/2013-07/msg00030.html anishsane 11 лет назад 0
@anishsane Совершенно неправильно. `file` просто читает данные с диска в двоичном формате и проверяет их на наличие магических чисел, сравнивая их с базой данных. 32-битные программы Windows выпускаются как PE32, а 64-битные и .NET программы - PE32 +. Разрядность самого `файла` не имеет абсолютно никакой разницы - и 32-разрядные, и 64-разрядные приложения могут считывать данные с диска, и это все, что ему нужно. Bob 10 лет назад 6
@MarcH Нет, он сказал вам, что это сборка .NET, у которой нет битности. Это не win32 и не win64, это .NET. clacke 9 лет назад 0
@ спасибо, спасибо. Теперь есть кое-что еще более интересное: / cygdrive / c / Program Files / Syncplicity / Syncplicity.exe: исполняемый файл PE32 (GUI). Сборка Intel 80386 Mono / .Net, для MS Windows. Эта программа работает без * 32 в диспетчере задач. MarcH 9 лет назад 0
... и sigcheck.exe сообщает о Syncplicity.exe как 32 бита. MarcH 9 лет назад 0
@ Марч Ха! Это интересно. Я предполагаю, что это означает, что заглушка среды выполнения .NET является 32-разрядной. Таким образом, он выполняет 32-битный процесс за долю секунды, но все, что делает этот процесс, - это запускает среду выполнения .NET, которая создает собственный 64-битный процесс. clacke 9 лет назад 1
Мне кажется, что файлы PE32 + .NET не имеют смысла, все они должны быть PE32, чтобы они работали на обеих платформах. Но, возможно, код заглушки никогда не запускается - возможно, что Windows обнаружит, что это двоичный файл .NET и просто запускает .NET напрямую. Было бы здорово услышать комментарий от кого-то, кто на самом деле знает. :-) clacke 9 лет назад 0
Похоже, что в Windows 2000 была запущена заглушка для запуска среды выполнения .NET, но XP и более поздние версии обнаруживают двоичный файл .NET и запускают саму .NET. Однако он не создает новый процесс, он запускает .NET в существующем процессе и, если это PE32 в 64-битной системе, он преобразует его в оперативной памяти в PE32 +, прежде чем продолжить. https://social.microsoft.com/Forums/ru-RU/14d2158d-9df7-448b-a2ac-adfcac2be6cb/how-does-the-clr-get-loaded clacke 9 лет назад 1
10
megamorf

Here's a Powershell solution, no external dependencies or anything. Open Powershell, paste the function in there (hit Enter twice so that you return to the prompt), then use it as in my examples below the function:

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 } 

Here's example output:

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 
Ровности. Вышеуказанный скрипт, кажется, оставляет ссылку на файл открытым. Не удалось собрать, пока я сначала не закрыл powershell (запустил скрипт для опроса DLL в \ bin). samsara 8 лет назад 0
Очень круто. +1. Itanium, безусловно, 64-битный, хотя :) Rich Homolka 7 лет назад 1
@samusarin: возможно, добавьте `$ stream.dispose ();` после закрытия? Должен освободить файловые дескрипторы. (https://stackoverflow.com/questions/1999858/how-bad-is-it-to-not-dispose-in-powershell) Yorik 6 лет назад 0
более полную версию можно найти в [Проверьте, является ли exe 64-битным] (https://reverseengineering.stackexchange.com/a/11373/2563) phuclv 6 лет назад 1