จะตรวจสอบว่าไบนารีเป็น 32 หรือ 64 บิตบน Windows ได้อย่างไร?


319

มีวิธีง่าย ๆ ในการตรวจสอบว่าไบนารีเป็น 32 หรือ 64 บิตบน Windows? ฉันต้องตรวจสอบก่อนที่ฉันจะย้ายโปรแกรมไปยังเครื่อง 32 บิตและพบกับความล้มเหลวที่น่าทึ่ง


คำถามนี้คล้ายกันแต่ต้องมีงานตรวจสอบ
ST3

3
@Gillaillaume: ภาพที่ปฏิบัติการไม่ได้ ตัวจัดการงานแสดงกระบวนการเท่านั้น
IIsspectable

คำตอบ:


346

หลังจากตรวจสอบค่าส่วนหัวจากคำตอบของ Richardฉันมาพร้อมกับโซลูชันที่รวดเร็วง่ายและต้องใช้โปรแกรมแก้ไขข้อความ แม้กระทั่ง notepad.exe เริ่มต้นของ Windows ก็สามารถใช้งานได้

  1. เปิดไฟล์ที่รันได้ใน text editor คุณอาจต้องลากและวางหรือใช้Open...กล่องโต้ตอบของตัวแก้ไขเนื่องจาก Windows ไม่แสดงOpen with...ตัวเลือกในเมนูบริบทสำหรับไฟล์เรียกทำงาน

  2. PEตรวจสอบตัวอักษรพิมพ์ครั้งแรกหลังจากเกิดขึ้นครั้งแรกของ ส่วนนี้มีแนวโน้มที่จะถูกล้อมรอบด้วยช่องว่างอย่างน้อยที่สุด (อาจเป็นจำนวนมาก) ดังนั้นจึงสามารถมองเห็นได้ง่าย

นี่คือสิ่งที่คุณจะพบ:

x86:

PE  L

x 64:

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


21
เฮ้นี่มันค่อนข้างแฮ็ค และทางที่ดีขึ้นตั้งแต่นี้ปรากฏขึ้นจริงจะเป็นทางออกที่เร็วและง่ายที่สุดสำหรับส่วนใหญ่ของกรณี :)
Septagram

4
ตัวอย่างที่หายากเมื่อแผ่นจดบันทึกชนะโน้ตแพด ++ Notepad แสดงสิ่งนี้ถูกต้องใน Notepad คุณมีระเบียบด้วยการเข้ารหัสเพื่อให้มันแสดง แต่มันใช้งานได้!
zar

2
@CoDEmanX ตัวเลือกนี้หมายถึง IDE หรือ JIT เป็นตัวเลือกสำหรับคุณ ดูคำถามนี้หรือโพสต์บล็อกนี้สำหรับรายละเอียดเพิ่มเติม
Alexander Revo

2
@ ฉันไม่สามารถตรวจสอบได้ถ้าคุณใส่ใจที่จะอ่านโพสต์ทั้งหมดก่อนที่จะทำการโพสต์ลงคุณจะเห็นลิงค์Microsoft PE and COFF Specificationซึ่งเป็นสัญญาที่มีเอกสารมากที่สุดเท่าที่จะทำได้รวมถึงคำแนะนำในการหาที่อยู่ที่แน่นอนของ PE ใน.exeไฟล์ใด ๆ หากคุณมีแหล่งข้อมูลที่เชื่อถือได้มากกว่าสเปคอย่างเป็นทางการของ Microsoft ในรูปแบบที่ปฏิบัติการได้ของ Microsoft ฉันชอบที่จะรู้ว่ามันคืออะไร
Alexander Revo

6
สำหรับไฟล์ที่ขึ้นต้นด้วย "MZ" คุณต้องดูอีกหน่อย ฉันพบ PE..L ที่ออฟเซ็ต 0x110 หลังจาก "RichMQ _........ "
jnnnnn

120

เครื่องมือ 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 บิต
[ ... ]

1
คุณสามารถดู (IA64) สำหรับ exe 64 บิต Itanium
Darryl Braaten

21
ในขณะที่ฉันอ่านที่อื่นบน superuser การใช้dumpbin /headers | findstr "machine"งานนำเสนอที่ง่ายขึ้นในสิ่งที่ QA กำลังมองหา ...
user1055604

3
Dumpbin.exe ตั้งอยู่ที่นี่:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
Devid

3
@ David: ไม่จำเป็น (VS รุ่นต่าง ๆ ไม่ได้ใช้ตำแหน่งติดตั้งเริ่มต้นโดยใช้รุ่นจาก Windows SDK): นั่นคือเหตุผลที่ฉันไม่ได้ระบุ
ริชาร์ด

6
เป็นวิธีที่ง่ายที่สุดในการใช้ dumpbin ถ้าคุณเรียกใช้จากบรรทัดคำสั่ง visual studio: stackoverflow.com/a/477389/1390430
Ben

46

หากคุณไม่มีหรือต้องการ 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

4
ดูเหมือนจะไม่ถูกต้องเสมอ: ลองใช้กับ LinqPad.exe (รุ่น AnyCPU-64 บิต) และ Sigcheck จะบอกคุณว่า "32 บิต" ...
Matt

@ Matt น่าสนใจ LinqPad ดูเหมือนแอพ. net ฉันสงสัยว่า sigcheck ทำงานได้อย่างถูกต้องกับ executables ดั้งเดิม (เพื่อจุดประสงค์นี้)
ต้มตุ๋น

2
ใช่มันเป็นแอพ. NET ใน. NET หากยังไม่ได้ทำการคอมไพล์ล่วงหน้าคุณสามารถกำหนดเป้าหมาย "x86" หรือ "AnyCPU" ได้ "x86" จะทำงานเป็น 32 บิตเสมอ แต่ AnyCPU จะทำงานเป็น 64 บิตในระบบ 64 บิต แต่เป็น 32 บิตในระบบ 32 บิต SigCheck ควรพิจารณาสิ่งนี้และแสดงอย่างน้อย ". NET 32 บิตหรือ 64 บิต (AnyCPU)" ตัวอย่างเช่น ILSpy พูดว่าในกรณีนี้ "สถาปัตยกรรม: AnyCPU (ต้องการ 64- ​​บิต)" - แต่ ILSpy จะไม่ทำงานสำหรับ non -.NET EXE
แมตต์

1
อาจเป็นเช่นนั้นเช่นส่วนหัว "MZ" แบบเก่าซึ่งมีไว้สำหรับระบบปฏิบัติการ Windows ("DOS") ที่ไม่ใช่ Windows "" แอปพลิเคชันนี้ต้องใช้ Microsoft Windows "... ;-)
Matt

2
ใช่ครั้งเก่าที่ดีที่คุณมีดีบักเกอร์ DOS ในเปลือกและสามารถแยกรหัส (ซึ่งมีเพียงหนึ่งเดียว DOS โทรพิมพ์ข้อความนี้) ... และแทนที่ข้อความด้วย "คำตอบคือ 42" :-D
แมตต์

38

ฉันสามารถยืนยันได้ว่า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 ที่สามารถใช้งานได้ซึ่งก็คือ


1
วิธีนี้ค่อนข้างธรรมดาสำหรับนักพัฒนาที่ติดตั้ง msysgit
FrontierPsycho

ทำไมไฟล์ปฏิบัติการในหน้าต่างมีMZแทนPE?
BattleTested

น่าสังเกตว่าอรรถประโยชน์ของ GNU นั้นสามารถรับเป็นไบนารีได้หากคุณไม่ต้องการ Cygwin gnuwin32.sourceforge.net/packages/file.htm
MJ Walsh

32

วิธีง่าย ๆ คือเรียกใช้ (สมมติว่าคุณเชื่อถือ) และดูที่แท็บกระบวนการในตัวจัดการงาน กระบวนการ 32 บิตจะแสดง "* 32" ที่ท้ายชื่อกระบวนการ หากไม่ใช่สิ่งที่คุณยินดีที่จะทำงานบนคอมพิวเตอร์ของคุณคุณสามารถลองใช้EXE Explorerได้ มันจะแสดงข้อมูลทั้งหมดเกี่ยวกับโปรแกรมเรียกทำงานรวมถึงถ้ามันเป็น 32 หรือ 64 บิต


8
น่าเสียดายสิ่งนี้ต้องการให้คุณเรียกใช้ไฟล์ปฏิบัติการ บางทีคุณต้องตรวจสอบสถาปัตยกรรมของโปรแกรมเป็นวิธีการแก้ไขปัญหาว่าทำไมมันไม่ทำงาน
Mike Christiansen

6
วิธีทำคุณเรียกใช้ DLL หรือไม่?
user34660


1
@samusarin ที่ควรอยู่ในโพสต์
user34660

@ user34660 คุณถูกต้องทางเทคนิค DLL ไม่มีmainจุดเข้าใช้งานและจะไม่ดำเนินการตามกระบวนการสแตนด์อะโลน มีฟังก์ชั่นเริ่มต้นที่เรียกว่าเมื่อมันถูกโหลด แต่นั่นไม่ใช่ "หลัก"
samis

24

หลายคนมีการติดตั้ง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

ว้าวฉันไม่เคยรู้มาก่อนว่า 7z สามารถทำได้ อาจมีการfileใช้งานภายในหรือไม่
phuclv

17

Process Explorerรุ่น 64 บิตสามารถบอกคุณได้ เพียงเรียกใช้ไฟล์ปฏิบัติการและเปิดหน้าต่างคุณสมบัติของกระบวนการ บนแท็บหลักมีรายการที่ระบุว่า "รูปภาพ: 32 บิต" หรือ "รูปภาพ: 64 บิต"

ป้อนคำอธิบายรูปภาพที่นี่


23
Simply run the executableและถ้าคุณไม่ต้องการรันโปรแกรม
Synetech

3
@Synetech คำถามเดิมไม่ได้หมายความว่าเป็นอย่างนั้น
Andrew Lambert

นี่เป็นวิธีที่ง่ายที่สุดสำหรับฉันฉันคิดว่าเว้นแต่ไฟล์ที่ออกจากโปรแกรมจะเร็วเกินไป
starbeamrainbowlabs

7
วิธีทำคุณเรียกใช้ DLL หรือไม่?
user34660

15

วิธีที่ง่ายที่สุด (เมื่อข้อมูลไม่เป็นความลับ)

ฉันพบว่าVirustotal File detailเป็นวิธีที่ง่ายที่สุดในการค้นหาว่าไบนารีเป็น 32 บิตหรือ 64 บิต

Additional informationตัวเลือกให้นอกเหนือจากข้อมูลที่เป็นประโยชน์มากเกี่ยวกับไฟล์

การวิเคราะห์ด้วย Virustotal


[Virustotal Trid


12

วิธีการรันไฟล์สั่งการแล้วตรวจสอบใน process explorer หรือเครื่องมือที่คล้ายกันมีข้อเสียที่เห็นได้ชัด:

  1. เราต้องดำเนินการตามกระบวนการ
  2. สำหรับกระบวนการที่มีอายุสั้น (เช่น echo hello world type) ผู้สำรวจกระบวนการอาจไม่ได้ลงทะเบียนว่ากระบวนการใหม่ได้เริ่มขึ้นแล้ว

วิธี Dumpbin.exe สามารถแก้ไขวัตถุประสงค์ได้

อีกทางเลือกหนึ่งคือใช้คำสั่งไฟล์ของ cygwin อย่างไรก็ตามฉันยังไม่ได้ทดสอบบน windows มันทำงานได้ดีบน Linux

Usage: file program_under_test.exe

แก้ไข: เพิ่งทดสอบ file.exe บนหน้าต่าง ทำงานได้ดี :)


1
แค่อยากจะบอกว่ามีบางสถานการณ์ที่วิธีการของ Dracs จะไม่เป็นประโยชน์มากนัก
anishsane

3
>> สิ่งนี้ยังคงต้องใช้งานโปรแกรมที่ผู้เขียนต้องการหลีกเลี่ยง: ไม่ .. เราเรียกใช้เช่น: file.exe program_under_test.exe
anishsane

1
และบรรดาผู้ที่ต้องการหลีกเลี่ยงการติดตั้งทั้งcygwinแพคเกจสามารถคว้าGnuWin32fileแพคเกจ
บ๊อบ

6
@anishsane ผิดโดยสิ้นเชิง fileเพียงแค่อ่านข้อมูลจากดิสก์ในรูปแบบไบนารี่และตรวจสอบตัวเลขเวทย์มนตร์ใด ๆ ที่ระบุพวกมันเปรียบเทียบกับฐานข้อมูล โปรแกรม 32 บิตของ Windows มาเป็น PE32 และโปรแกรมทั้ง 64- บิตและ. NET ขึ้นมาเป็น PE32 + พยานหลักฐานของfileตัวเองสร้างความแตกต่างเป็นศูนย์อย่างแน่นอน - ทั้งแอปพลิเคชัน 32 บิตและ 64 บิตสามารถอ่านข้อมูลจากดิสก์ซึ่งเป็นสิ่งที่จำเป็นทั้งหมด
Bob

1
@MarcH Ha! นั่นเป็นเรื่องที่น่าสนใจ ฉันเดาว่านั่นหมายความว่า. NET Stub runtime คือ 32 บิต ดังนั้นจึงรันกระบวนการ 32 บิตเป็นเสี้ยววินาที แต่กระบวนการทั้งหมดนั้นเริ่มต้นรันไทม์. NET ซึ่งสร้างกระบวนการ 64 บิตดั้งเดิม
clacke

10

นี่คือวิธีแก้ปัญหา 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

slickness สคริปต์ด้านบนดูเหมือนว่าจะเป็นการอ้างอิงถึงไฟล์ที่เปิดอยู่ ไม่สามารถสร้างได้จนกว่าฉันจะปิด PowerShell เป็นครั้งแรก (เรียกใช้สคริปต์เพื่อสอบถาม DLL ใน \ bin)
samis

1
เด็ดมาก +1 Itanium เป็น 64 บิตที่แน่นอน :) :)
Rich Homolka

@ Samusarin: อาจจะเพิ่ม$stream.dispose();หลังจากปิด? ควรปล่อยปุ่มจัดการไฟล์ ( stackoverflow.com/questions/1999858/… )
Yorik

1
รุ่นที่สมบูรณ์มากขึ้นสามารถพบได้ในตรวจสอบว่า exe เป็นแบบ 64 บิต
phuclv

6

แม้แต่ไฟล์ประมวลผลที่ทำเครื่องหมายเป็น 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

เด็ดคำสั่ง แต่จะไม่ทำงานสำหรับ executables / dll ที่ดั้งเดิม ( corflags : error CF008 : The specified file does not have a valid managed header)
Tomasz Gandor

@TomaszGandor ใช่บริบทของคำตอบนี้เป็นรหัสที่ได้รับการจัดการเท่านั้น รหัสที่ไม่มีการจัดการจะได้รับคำตอบจากคำตอบอื่น ๆ เท่าที่ฉันรู้รหัสที่ได้รับการจัดการเท่านั้นที่สามารถสลับระหว่างการดำเนินการเป็นทั้งแบบ 32- และ 64- บิต
BlueMonkMN

4

คุณยังสามารถใช้fileเครื่องมือจากภายในกำ MSYS ของ MinGW มันทำงานเหมือนคำสั่ง unix ที่คล้ายกันทำงานfileเครื่องมือจากGnuWin32


3

หากคุณอยู่บน Windows 7 บน Windows Explorer ให้คลิกขวาที่ไฟล์ปฏิบัติการและเลือกคุณสมบัติ ที่หน้าต่างคุณสมบัติเลือกแท็บความเข้ากันได้ หากอยู่ในหัวข้อโหมดความเข้ากันได้ที่คุณเห็น Windows XP นี่เป็นไฟล์ปฏิบัติการ 32 บิต หากคุณเห็น Windows Vista เป็น 64 บิต


-1 ไม่จริงเลย ไบนารี 32 และ 64 บิตหลากหลายแสดงโหมดความเข้ากันได้ของWindows 8
Peter Hahndorf

@ ปีเตอร์ฉันได้ลองใช้ Windows 7 ไปแล้วและมันก็ใช้ได้กับฉันเสมอ คุณสามารถยกตัวอย่างของไบนารีที่โหมดความเข้ากันได้เริ่มต้นคือ Windows 8 ได้หรือไม่? คุณใช้ Windows อะไรอยู่ ขอบคุณ
axxis

ฉันใช้ Server 2012 R2 และทดลองใช้ไบนารีแบบสุ่มสองสามครั้ง บางคนที่แสดงเป็น 32bit Windows XP SP2แต่คนอื่น ๆ แสดงเป็นหรือVista Windows 8ดังนั้นวิธีนี้ไม่ถูกต้อง
ปีเตอร์ Hahndorf

3

วิธีเพิ่มการทดสอบ 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 บิต " ในเมนูบริบทเมื่อคลิกขวาที่ไฟล์ปฏิบัติการ

การคลิกที่รายการจะส่งผลให้เริ่มต้นไฟล์แบตช์c:\\temp\\x86TestStart.bat\ซึ่งเริ่มต้นไฟล์ VBscript x86or64.vbsซึ่งอ่านลายเซ็น exe และแสดงผลลัพธ์

หากคุณไม่สามารถหรือไม่ต้องการยุ่งเกี่ยวกับรีจิสทรีเพียงแค่คัดลอกไฟล์. vbs ในแถบ QuickLaunch และลากไฟล์ที่เรียกใช้งานได้


3

สองเซ็นต์ของฉันจะเป็นเพียงแค่ดาวน์โหลดวอล์คเกอร์พึ่งพาและตรวจสอบสิ่งที่สำหรับสถาปัตยกรรมที่มีการใช้ในหนึ่งในไฟล์ปฏิบัติการ

วิธีใช้งาน:

เพียงแค่ดาวน์โหลดแอพเริ่มต้นขึ้นคลิกที่ไอคอนเปิด→ค้นหาไฟล์ * .exe →เลือกและที่ด้านล่างหลังจากสแกนการสะท้อนกลับเสร็จสิ้นคุณจะเห็นกริดพร้อมข้อมูลที่หนึ่งคอลัมน์มีรายละเอียด "สถาปัตยกรรม" อยู่ในนั้น (x86, x64)

เปิดใช้งานได้และดูสถาปัตยกรรมการสร้าง

ภาพหน้าจอของวอล์คเกอร์พึ่งพา


1

ฉันไม่เห็นสิ่งนี้ มีโปรแกรมดู PE ที่เรียกว่า CFF Explorer โดยNTCoreซึ่งสามารถให้ข้อมูลนี้แก่คุณได้ สามารถดาวน์โหลดและเรียกใช้แบบพกพาได้ แต่คุณสามารถติดตั้งได้เช่นกันหากต้องการ

คลิกขวาที่ไบนารี ( .exeและ.dllอื่น ๆ ) แล้วเลือก "Open with CFF Explorer" ไปที่ Nt Headers -> File Header -> ที่ช่อง "Characteristic" คลิก "Click here"

หากเป็นโปรแกรม 32 บิตช่องทำเครื่องหมาย "เครื่องคำ 32 บิต" จะถูกทำเครื่องหมาย ตัวอย่างเช่นฉันได้ติดตั้ง Notepad ++ เวอร์ชัน 32 บิตตามที่คุณเห็นในภาพด้านล่าง มิฉะนั้นจะเป็น 64 บิต

ป้อนคำอธิบายรูปภาพที่นี่


มีวิธีที่รวดเร็วกว่าด้วย CFF explorer: ทันทีที่โหลดไฟล์ภายใต้ "ประเภทไฟล์" คุณมี "Portable Executable 64" หรือ "Portable Executable 32"
Arthur.V

0
  • เรียกใช้แอปพลิเคชัน
  • เปิดตัวจัดการงาน
  • คลิกขวาและสร้างไฟล์ดัมพ์
  • จดบันทึกเส้นทาง
  • ไปที่เส้นทางและเปิดการ.DMPถ่ายโอนข้อมูลใน Visual Studio
  • มีคุณรับรายละเอียดทั้งหมด
  • ตรวจสอบสถาปัตยกรรมกระบวนการ:

3
ฉันรู้สึกผูกพันที่จะเน้นความจริงที่ว่าคำตอบนี้ต้องใช้แอปพลิเคชัน ผู้แสดงความคิดเห็นก่อนหน้าแนะนำว่าสิ่งนี้อาจไม่เป็นที่พึงปรารถนา นอกจากนี้ Visual Studio จะไม่สามารถใช้งานได้กับทุกแพลตฟอร์ม Windows โดยอัตโนมัติ
G-Man

0

สองเซ็นต์ของฉัน: ในฐานะนักพัฒนา C ++, ผู้พึ่งพาวอล์คเกอร์ ( http://www.dependencywalker.com/ ) มีข้อมูลมากไม่เพียงแสดง 64/32 บิต แต่ยังรวมถึง Dll ทุกอันที่เกี่ยวข้อง: ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถดู 64 ทางซ้ายของทุกชื่อไฟล์ ...


1
ภาพหน้าจอไม่แสดงคำตอบ - ข้อมูล 32 บิตเทียบกับ 64 บิต ...
TomEus

0

กระนั้นคำสั่งของ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

0

คอลัมน์แพลตฟอร์มในตัวจัดการงานของ windows 10

Windows 7 ไม่มีคอลัมน์แพลตฟอร์ม ดังนั้นตัวจัดการงาน Windows 7 จะไม่แสดง

ใน windows 10 การเลือกคอลัมน์ไม่อยู่ภายใต้ 'ดู' อีกต่อไป ใน Windows 10 เมื่ออยู่ในแท็บรายละเอียดคุณคลิกขวาที่ส่วนหัวคอลัมน์แล้วเลือกคอลัมน์ จากนั้นทำเครื่องหมายที่ช่องสำหรับ 'แพลตฟอร์ม'

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.