2011-11-17 10:29:58 +0000 2011-11-17 10:29:58 +0000
341
341

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

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

Ответы (20)

377
377
377
2015-03-13 17:08:57 +0000

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

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

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

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

32-bit:

PE L

64-bit:

PE d†

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

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

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

Если у вас есть HEX-редактор, смещение Подписи PE находится по адресу смещение 0x3C. Подпись PE0x86640x014c (буквы “P” и “E”, за которыми следуют два нулевых байта), за которыми следует двухбайтовый Machine Type в Little Endian.

Соответствующие значения 64 86 для 64-битного исполняемого файла и 4c 01 для 32-битного (&007 и &007 соответственно при настройке на эндианность, но любой приличный шестнадцатиричный редактор будет автоматически обрабатывать эндианность при поиске шестнадцатиричного значения). Возможных значений гораздо больше, но вы, вероятно, никогда не встретите ни одного из них, или не сможете запустить такие исполняемые файлы на вашем ПК с Windows.

Полный список типов машин, наряду с остальными спецификациями .exe, можно найти в Microsoft PE и COFF Specification Типы машин разделе [ Microsoft PE и COFF Specification ]&003 Типы машин.

129
129
129
2011-11-17 12:14:43 +0000

Инструмент 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. All rights reserved. Dump of file C:\Windows\system32\cmd.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES **8664 machine (x64)** 6 number of sections 4CE798E5 time date stamp Sat Nov 20 09:46:13 2010 0 file pointer to symbol table 0 number of symbols F0 size of optional header 22 characteristics Executable Application can handle large (\>2GB) addresses [...]
```.
50
50
50
2014-09-06 15:02:25 +0000

Если у вас нет или вы хотите использовать весь 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
46
46
46
2014-01-17 02:08:47 +0000

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

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

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

33
33
33
2011-11-17 10:39:49 +0000

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

28
28
28
2015-10-04 10:56:52 +0000

Многие люди установили великолепную 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
21
21
21
2011-11-17 13:36:05 +0000

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

17
17
17
2015-01-05 16:53:58 +0000

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

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

Additional information опция &007 предоставляет, кроме того, много полезной информации о файле.


![Virustotal TrID

14
14
14
2012-09-27 07:08:26 +0000

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

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

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

Другой альтернативой может быть использование команды cygwin’s file. Однако я не тестировал ее на Windows. Он хорошо работает на Linuxes.

Usage: file program_under_test.exe

EDIT: Только что протестировал file.exe на windows. работает нормально. :)

13
13
13
2015-03-19 12:09:30 +0000

Вот решение 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
9
9
9
2015-10-07 15:32:36 +0000

Даже исполняемый файл, помеченный как 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 output

For 32-bit executable:

Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x3
ILONLY : 1
32BITREQ : 1
32BITPREF : 0
Signed : 0

For 64-bit executable:

Version : v2.0.50727
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0

For executable that can run as 32- or 64-bit and will run as 64-bit when possible:

Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0

For executable that can run as 32- or 64-bit, but will run as 32-bit unless loaded into a 64-bit process:

Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x20003
ILONLY : 1
32BITREQ : 0
32BITPREF : 1
Signed : 0
```.
6
6
6
2016-06-14 00:19:11 +0000

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

How to use it:

Просто скачайте приложение, запустите его, нажмите на открытую иконку → найдите *. exe файл → выберите и внизу после завершения рефлексивного сканирования вы увидите сетку с данными, в которой в одной колонке содержится информация об “архитектуре” (x86, x64)

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

5
5
5
2015-05-06 08:51:55 +0000

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

5
5
5
2015-01-05 13:54:17 +0000

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

5
5
5
2016-01-16 11:20:03 +0000

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

Создать текстовый файл с именем 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 bit test” в контекстном меню при щелчке правой кнопкой мыши на исполняемом файле.

Щелчок по этому пункту приведет к запуску пакетного файла `c:\temp\x86TestStart.bat# Как добавить 32/64-битный тест в контекстное меню

Создать текстовый файл с именем 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 bit test” в контекстном меню при щелчке правой кнопкой мыши на исполняемом файле.

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

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

2
2
2
2017-10-10 00:41:35 +0000

Тем не менее, команда WSL 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 будет выводить:

&007 будет выводить:

/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
2
2
2
2017-02-01 22:27:17 +0000

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

щёлкните правой кнопкой мыши на бинарный файл (.exe, .dll и т.д.) и выберите “Открыть с помощью проводника CFF”. Перейдите в Nt Headers -> File Header -> В поле “Characteristics” (Характеристики) нажмите “Щелкните здесь”

Если это 32-битная программа, то будет отмечена галочка “32 bit word machine” (Машина 32-битных слов). Например, я установил 32-битную версию Блокнота++, как вы видите на картинке ниже. В противном случае это 64 бит.

.

1
1
1
2017-09-28 07:37:39 +0000

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

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

0
0
0
2019-08-02 22:55:25 +0000

Платформенный столбец в менеджере задач windows 10

Windows 7 не имеет платформенного столбца. Поэтому диспетчер задач Windows 7 его не показывает.

В Windows 10 выбор столбцов больше не находится в ‘просмотре’. В Windows 10, когда вы переходите на вкладку подробностей, вы нажимаете правой клавишей мыши на заголовке колонки и затем ‘выбираете столбцы’. Затем установите флажок для ‘платформы’.

0
0
0
2015-03-19 11:39:51 +0000
  • запустите приложение
  • откройте диспетчер задач
  • щелкните правой кнопкой мыши и создайте файл дампа
  • запишите путь
  • перейдите к пути и откройте дамп .DMP в Visual Studio
  • там вы получите все подробности
  • проверьте архитектуру процесса:

Gerelateerde vragen

3
19
10
28
2