มีวิธีง่าย ๆ ในการตรวจสอบว่าไบนารีเป็น 32 หรือ 64 บิตบน Windows? ฉันต้องตรวจสอบก่อนที่ฉันจะย้ายโปรแกรมไปยังเครื่อง 32 บิตและพบกับความล้มเหลวที่น่าทึ่ง
มีวิธีง่าย ๆ ในการตรวจสอบว่าไบนารีเป็น 32 หรือ 64 บิตบน Windows? ฉันต้องตรวจสอบก่อนที่ฉันจะย้ายโปรแกรมไปยังเครื่อง 32 บิตและพบกับความล้มเหลวที่น่าทึ่ง
คำตอบ:
หลังจากตรวจสอบค่าส่วนหัวจากคำตอบของ Richardฉันมาพร้อมกับโซลูชันที่รวดเร็วง่ายและต้องใช้โปรแกรมแก้ไขข้อความ แม้กระทั่ง notepad.exe เริ่มต้นของ Windows ก็สามารถใช้งานได้
เปิดไฟล์ที่รันได้ใน text editor คุณอาจต้องลากและวางหรือใช้Open...
กล่องโต้ตอบของตัวแก้ไขเนื่องจาก Windows ไม่แสดงOpen with...
ตัวเลือกในเมนูบริบทสำหรับไฟล์เรียกทำงาน
PE
ตรวจสอบตัวอักษรพิมพ์ครั้งแรกหลังจากเกิดขึ้นครั้งแรกของ ส่วนนี้มีแนวโน้มที่จะถูกล้อมรอบด้วยช่องว่างอย่างน้อยที่สุด (อาจเป็นจำนวนมาก) ดังนั้นจึงสามารถมองเห็นได้ง่าย
นี่คือสิ่งที่คุณจะพบ:
PE L
PE d†
คำเตือน: การใช้ Notepad เริ่มต้นในไฟล์ขนาดใหญ่อาจช้ามากดังนั้นจึงไม่ควรใช้กับไฟล์ที่มีขนาดใหญ่กว่าเมกะไบต์หรือน้อย ในกรณีของฉันใช้เวลาประมาณ 30 วินาทีเพื่อแสดงไฟล์ 12 MiB อย่างไรก็ตาม Notepad ++ นั้นสามารถแสดงไฟล์ปฏิบัติการได้ 120 MiB เกือบจะในทันที
นี่เป็นวิธีแก้ปัญหาที่อาจมีประโยชน์ในกรณีที่คุณต้องการตรวจสอบไฟล์บนเครื่องที่คุณไม่สามารถติดตั้งซอฟต์แวร์เพิ่มเติมได้
หากคุณมี HEX-Editor ที่มีการชดเชยจาก PE 0x3C
ลายเซ็นตั้งอยู่ที่ชดเชย ลายเซ็นคือPE\0\0
(ตัวอักษร "P" และ "E" ตามด้วย null สองไบต์) ตามด้วยชนิดของเครื่องสองไบต์ใน 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> dumpbin / ส่วนหัว 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 น 0 ตัวชี้ไฟล์ไปยังตารางสัญลักษณ์ 0 จำนวนสัญลักษณ์ ขนาด F0 ของส่วนหัวเสริม 22 ลักษณะ ปฏิบัติการ แอปพลิเคชันสามารถจัดการที่อยู่ขนาดใหญ่ (> 2GB) [ ... ]
และ
PS [64] E: \ # 5> dumpbin / ส่วนหัว 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 น 0 ตัวชี้ไฟล์ไปยังตารางสัญลักษณ์ 0 จำนวนสัญลักษณ์ ขนาด E0 ของส่วนหัวเสริม 102 ลักษณะ ปฏิบัติการ เครื่องคำ 32 บิต [ ... ]
dumpbin /headers | findstr "machine"
งานนำเสนอที่ง่ายขึ้นในสิ่งที่ QA กำลังมองหา ...
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
หากคุณไม่มีหรือต้องการ 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
ฉันสามารถยืนยันได้ว่า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 ที่สามารถใช้งานได้ซึ่งก็คือ
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
ใช้งานภายในหรือไม่
Process Explorerรุ่น 64 บิตสามารถบอกคุณได้ เพียงเรียกใช้ไฟล์ปฏิบัติการและเปิดหน้าต่างคุณสมบัติของกระบวนการ บนแท็บหลักมีรายการที่ระบุว่า "รูปภาพ: 32 บิต" หรือ "รูปภาพ: 64 บิต"
Simply run the executable
และถ้าคุณไม่ต้องการรันโปรแกรม
วิธีที่ง่ายที่สุด (เมื่อข้อมูลไม่เป็นความลับ)
ฉันพบว่าVirustotal File detail
เป็นวิธีที่ง่ายที่สุดในการค้นหาว่าไบนารีเป็น 32 บิตหรือ 64 บิต
Additional information
ตัวเลือกให้นอกเหนือจากข้อมูลที่เป็นประโยชน์มากเกี่ยวกับไฟล์
วิธีการรันไฟล์สั่งการแล้วตรวจสอบใน process explorer หรือเครื่องมือที่คล้ายกันมีข้อเสียที่เห็นได้ชัด:
วิธี Dumpbin.exe สามารถแก้ไขวัตถุประสงค์ได้
อีกทางเลือกหนึ่งคือใช้คำสั่งไฟล์ของ cygwin อย่างไรก็ตามฉันยังไม่ได้ทดสอบบน windows มันทำงานได้ดีบน Linux
Usage: file program_under_test.exe
แก้ไข: เพิ่งทดสอบ 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)
เปิดใช้งานได้และดูสถาปัตยกรรมการสร้าง
ฉันไม่เห็นสิ่งนี้ มีโปรแกรมดู PE ที่เรียกว่า CFF Explorer โดยNTCoreซึ่งสามารถให้ข้อมูลนี้แก่คุณได้ สามารถดาวน์โหลดและเรียกใช้แบบพกพาได้ แต่คุณสามารถติดตั้งได้เช่นกันหากต้องการ
คลิกขวาที่ไบนารี ( .exe
และ.dll
อื่น ๆ ) แล้วเลือก "Open with CFF Explorer" ไปที่ Nt Headers -> File Header -> ที่ช่อง "Characteristic" คลิก "Click here"
หากเป็นโปรแกรม 32 บิตช่องทำเครื่องหมาย "เครื่องคำ 32 บิต" จะถูกทำเครื่องหมาย ตัวอย่างเช่นฉันได้ติดตั้ง Notepad ++ เวอร์ชัน 32 บิตตามที่คุณเห็นในภาพด้านล่าง มิฉะนั้นจะเป็น 64 บิต
.DMP
ถ่ายโอนข้อมูลใน Visual Studioสองเซ็นต์ของฉัน: ในฐานะนักพัฒนา C ++, ผู้พึ่งพาวอล์คเกอร์ ( http://www.dependencywalker.com/ ) มีข้อมูลมากไม่เพียงแสดง 64/32 บิต แต่ยังรวมถึง Dll ทุกอันที่เกี่ยวข้อง:
คุณสามารถดู 64 ทางซ้ายของทุกชื่อไฟล์ ...
กระนั้นคำสั่งของ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
จะส่งออก:
/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
คอลัมน์แพลตฟอร์มในตัวจัดการงานของ windows 10
Windows 7 ไม่มีคอลัมน์แพลตฟอร์ม ดังนั้นตัวจัดการงาน Windows 7 จะไม่แสดง
ใน windows 10 การเลือกคอลัมน์ไม่อยู่ภายใต้ 'ดู' อีกต่อไป ใน Windows 10 เมื่ออยู่ในแท็บรายละเอียดคุณคลิกขวาที่ส่วนหัวคอลัมน์แล้วเลือกคอลัมน์ จากนั้นทำเครื่องหมายที่ช่องสำหรับ 'แพลตฟอร์ม'