Чи є простий спосіб перевірити, чи двійковий файл 32 або 64 біт у Windows? Мені потрібно перевірити, перш ніж перенести програму на 32-бітну машину і відчути вражаючий збій.
Чи є простий спосіб перевірити, чи двійковий файл 32 або 64 біт у Windows? Мені потрібно перевірити, перш ніж перенести програму на 32-бітну машину і відчути вражаючий збій.
Відповіді:
Вивчивши значення заголовка з відповіді Річарда , я придумав рішення, яке швидко, легко і вимагає лише редактора тексту. Навіть за замовчуванням Windows notepad.exe буде працювати.
Відкрийте виконуваний файл в текстовому редакторі. Можливо, вам доведеться перетягувати або використовувати Open...
діалогове вікно редактора , оскільки Windows не показує Open with...
параметр у контекстному меню для виконуваних файлів.
Перевірте перші символи для друку після першого появи PE
. Ця частина, швидше за все, оточена хоча б деяким пробілом (їх може бути багато), тому це легко зробити візуально.
Ось що ви збираєтесь знайти:
PE L
PE d†
Слово попередження: використання Блокнота за замовчуванням для великих файлів може бути дуже повільним, тому краще не використовувати його для файлів, більших за мегабайт або кілька. У моєму випадку для відображення файлу 12 МіБ було потрібно близько 30 секунд. Проте, блокнот ++ міг майже миттєво відображати виконуваний 120 Міб.
Це рішення може бути корисним у тому випадку, якщо вам потрібно перевірити файл на машині, на який ви не можете встановити додаткове програмне забезпечення.
Якщо у вас є HEX-редактор, зміщення підпису PE розташоване при зміщенні 0x3C
. Підпис є PE\0\0
(літери "P" і "E", а потім два нульові байти), а потім двобайтовий тип машини в Little Endian.
Відповідні значення є 0x8664
для виконуваних x64 та 0x14c
для x86. Існує набагато більше можливих значень, але ви, ймовірно, ніколи не зіткнетесь з жодним із них, або не зможете запускати такі виконувані файли на вашому ПК з Windows.
Повний перелік типів машин, а також інші технічні характеристики .exe можна знайти в розділі Техніка Microsoft PE та COFF Специфікації машин .
Microsoft PE and COFF Specification
, яке є настільки документально підписаним договором, як і інструкції, як знайти точну адресу заголовка PE у будь-якому .exe
файлі. Якщо у вас є більш надійне джерело, ніж офіційна специфікація Microsoft щодо власного виконуваного формату Microsoft, я хотів би знати, що це таке.
Інструмент SDK dumpbin.exe
з /headers
опцією включає цю інформацію, порівняйте ці дві (я додав жирний шрифт для основної інформації)
PS [64] E: \ # 4> дампбін / заголовки C: \ Windows \ system32 \ cmd.exe Майстерна для кар'єра Microsoft (R) COFF / PE версія 10.00.40219.01 Авторські права (C) Корпорація Microsoft. Всі права захищені. Дамп файлу 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 версія 10.00.40219.01 Авторські права (C) Корпорація Microsoft. Всі права захищені. Дамп файлу C: \ Windows \ syswow64 \ cmd.exe Знайдено підпис PE Тип файлу: EXECUTABLE IMAGE ФАЙЛОВІ ЦІННІ РОЗДІЛИ 14С машина (x86) 4 кількість розділів 4CE78E2B марка часу дата Сб 20 листопада 09:00:27 2010 0 покажчик файлу на таблицю символів 0 кількість символів Розмір E0 необов'язкового заголовка 102 характеристики Виконаний 32-бітна машина слова [...]
dumpbin /headers | findstr "machine"
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
Якщо у вас немає або ви хочете цілий пакет 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
Я можу підтвердити, що file
утиліта (наприклад, від cygwin) розрізнятиме 32- та 64-бітні виконувані файли. Вони з'являються наступним чином:
32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows
Як бачите, дуже очевидно, що є. Крім того, він розрізняє консольні та графічні графічні інтерфейси, також очевидно, що це.
MZ
замість PE
?
Простий метод - запустити його (якщо припустити, що ви йому довіряєте) і подивіться на вкладку процесу в диспетчері завдань. 32-бітні процеси показуватимуть "* 32" в кінці імені процесу. Якщо ви не готові запустити на своєму комп’ютері, ви можете спробувати EXE Explorer . Він покаже цілу купу інформації про виконувані файли, в тому числі, якщо це 32 або 64 біт.
main
точки входу, і тому не виконуватиметься як окремий процес. Існує функція ініціалізації, яка називається під час завантаження, але вона не є "основною".
У багатьох людей встановлений чудовий 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
реалізацію всередині?
64-бітна версія Process Explorer може вам сказати. Просто запустіть виконуваний файл і відкрийте вікно властивостей процесу. На головній вкладці є запис, який говорить "Зображення: 32 біт" або "Зображення: 64 біт".
Simply run the executable
А що робити, якщо ви не хочете запускати програму?
Найпростіший спосіб (коли дані не є конфіденційними)
Я вважаю, що Virustotal File detail
- це найпростіший спосіб з’ясувати, чи є двійковий файл 32-ти або 64-бітний.
Крім того, ця Additional information
опція надає багато корисної інформації про файл.
Метод запуску виконуваного файлу, а потім перевірка в провіднику процесів або подібному інструменті має деякі очевидні недоліки:
Метод Dumpbin.exe, можливо, може вирішити мету.
Іншою альтернативою може бути використання файлової команди cygwin . Однак я не тестував його на windows. Він добре працює на Linux.
Usage: file program_under_test.exe
EDIT: Щойно перевірений file.exe у вікні. працює чудово. :)
file
просто зчитує дані з диска у двійковому форматі та перевіряє наявність магічних чисел, що їх ідентифікують, порівнюючи з базою даних. 32-бітні програми Windows постають як PE32, а 64-розрядні та .NET програми надходять як PE32 +. Біт file
сам по собі робить абсолютно нульову різницю - і 32-розрядні, і 64-бітні програми можуть читати дані з диска, що все, що потрібно.
Ось рішення 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
$stream.dispose();
після закриття? Слід випустити ручки файлів. ( Stackoverflow.com/questions/1999858 / ... )
Навіть виконуваний файл, позначений як 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
Для 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
corflags : error CF008 : The specified file does not have a valid managed header
)
Ви також можете скористатися file
інструментом зсередини пакету msys від mingw . Він працює як команда unix. Аналогічно працює file
інструмент від GNUwin32 .
Якщо ви перебуваєте в Windows 7, у Windows Explorer, клацніть правою кнопкою миші на виконуваний файл і виберіть "Властивості". У вікні властивостей виберіть вкладку Сумісність. Якщо в розділі Режим сумісності ви бачите Windows XP, це 32-бітний виконуваний файл. Якщо ви бачите Windows Vista, вона 64-бітна.
Windows 8
Windows XP SP2
а інші показують як Vista
або Windows 8
. Тож цей спосіб невірний.
Створіть текстовий файл з назвою 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 біт тест " у контекстному меню, клацнувши правою кнопкою миші на виконуваний файл.
Клацання елемента призведе до запуску пакетного файлу c:\\temp\\x86TestStart.bat\
, який запускає файл VBscript x86or64.vbs
, який читає підпис EXE і показує результат.
Якщо ви не можете або не хочете підробляти реєстр, просто скопіюйте .vbs-файл на панель QuickLaunch і перетягніть його на нього.
Мої два центи будуть просто завантажувати залежність ходу і перевірити, що для архітектури було використано в одному з виконуваних файлів.
Просто завантажте додаток, запустіть його, натисніть на відкриту піктограму → знайдіть файл * .exe → виберіть і внизу після завершення розгляду відображення ви побачите сітку з даними, де один стовпець містить у собі деталі «архітектури» (x86, x64)
Відкрийте виконуваний файл і перегляньте архітектуру збірки
Я цього не бачив. Існує програма перегляду ПЕ під назвою CFF Explorer від NTCore , яка може надати вам цю інформацію. Його можна завантажити та запустити як портативний, але ви також можете встановити його, якщо бажаєте.
Клацніть правою кнопкою миші на довічним ( .exe
, і .dll
т.д.) і виберіть "Відкрити за допомогою CFF Explorer». Перейдіть до заголовків Nt -> Заголовок файлів -> У полі "Характеристики" натисніть "Натисніть тут"
Якщо мова йде про 32-бітну програму, буде встановлено прапорець "32-бітна машина для слів". Наприклад, я встановив 32-бітну версію Notepad ++, як ви бачите на зображенні нижче. В іншому випадку це 64-бітний.
.DMP
дамп у Visual Studioдва мої центи: як розробник C ++, ходувач залежностей ( http://www.dependencywalker.com/ ) є дуже інформативним, не тільки відображає 64/32 біт, але і кожен Dll:
Ви можете побачити 64 зліва від кожного імені файлу ...
Стовпчик платформи в диспетчері завдань Windows 10
У Windows 7 немає стовпця платформи. Тож менеджер завдань Windows 7 не показуватиме його.
У Windows 10 вибір стовпців більше не знаходиться під «переглядом». У Windows 10 на вкладці "Подробиці" ви клацніть правою кнопкою миші заголовок стовпця, а потім "виберіть стовпці". Потім встановіть прапорець "платформа".