Câu hỏi Làm thế nào để kiểm tra xem một nhị phân là 32 hoặc 64 bit trên Windows?


Có một cách dễ dàng để kiểm tra xem một nhị phân là 32 hoặc 64 bit trên Windows? Tôi cần kiểm tra trước khi tôi chuyển chương trình sang máy 32 bit và trải nghiệm một thất bại ngoạn mục.


257
2017-11-17 10:29


gốc


Câu hỏi này tương tựTuy nhiên, nó đòi hỏi một số công việc để kiểm tra nó. - ST3
@Guillaume: Hình ảnh thực thi không phải là quá trình. Trình quản lý tác vụ chỉ hiển thị các quy trình. - IInspectable


Các câu trả lời:


Sau khi kiểm tra các giá trị tiêu đề từ Câu trả lời của Richard, Tôi đã đưa ra một giải pháp nhanh chóng, dễ dàng và chỉ yêu cầu trình chỉnh sửa văn bản. Ngay cả Windows notepad.exe mặc định sẽ hoạt động.

  1. Mở tệp thực thi trong trình soạn thảo văn bản. Bạn có thể phải kéo và thả hoặc sử dụng người biên tập Open... thoại, vì Windows không hiển thị Open with... trong menu ngữ cảnh để thực thi.

  2. Kiểm tra các ký tự có thể in đầu tiên sau lần xuất hiện đầu tiên của PE. Phần này có nhiều khả năng được bao quanh bởi ít nhất một số khoảng trống (có thể là rất nhiều khoảng trắng), vì vậy nó có thể dễ dàng thực hiện trực quan.

Đây là những gì bạn sẽ tìm thấy:

x86:

PE  L

x64:

PE  d†

Một lời cảnh báo: sử dụng Notepad mặc định trên các tệp lớn có thể rất chậm, vì vậy tốt hơn không nên sử dụng nó cho các tệp lớn hơn megabyte hoặc vài tệp. Trong trường hợp của tôi trong khoảng 30 giây để hiển thị một tập tin 12 MiB. Notepad ++, tuy nhiên, đã có thể hiển thị một 120 MiB thực thi gần như ngay lập tức.

Đây là giải pháp có thể hữu ích trong trường hợp bạn cần kiểm tra tệp trên máy tính mà bạn không thể cài đặt bất kỳ phần mềm bổ sung nào.

Thông tin bổ sung:

Nếu bạn có sẵn HEX-Editor, giá trị offset của PE Signature được đặt tại offset 0x3C. Chữ ký là PE\0\0 (các chữ cái "P" và "E" theo sau là hai byte null), theo sau là Kiểu Máy hai byte trong Little Endian.

Các giá trị có liên quan là 0x8664 cho x64 thực thi và 0x14c cho x86. Có nhiều giá trị có thể hơn, nhưng có thể bạn sẽ không bao giờ gặp phải bất kỳ giá trị nào trong số này hoặc có thể chạy các tệp thi hành như vậy trên PC Windows của bạn.

Danh sách đầy đủ các loại máy, cùng với phần còn lại của thông số kỹ thuật .exe có thể được tìm thấy trong Đặc điểm kỹ thuật của Microsoft PE và COFF  Các loại máy phần.


270
2018-03-13 17:08



Này, điều này khá là đáng sợ. Và tốt hơn, vì đây thực sự là giải pháp nhanh nhất và dễ dàng nhất trong phần lớn các trường hợp :) - Septagram
Ví dụ hiếm hoi khi notepad đánh bại notepad ++. Notepad cho thấy điều này đúng, trong notepad bạn có mess xung quanh với mã hóa để có được nó để hiển thị nhưng nó đã làm việc! - zar
@CoDEmanX tùy chọn này có nghĩa là IDE hoặc JIT làm cho sự lựa chọn cho bạn. Xem câu hỏi này hay cái này bài viết trên blog để biết thêm chi tiết. - Alexander Revo
@IInspectable nếu bạn đã thực sự bận tâm để đọc toàn bộ bài viết trước khi downvoting nó, bạn sẽ thấy liên kết đến Microsoft PE and COFF Specification, đó là càng nhiều tài liệu hợp đồng như nó có thể nhận được, cũng như các hướng dẫn về cách tìm địa chỉ chính xác của tiêu đề PE trong bất kỳ .exe tập tin. Nếu bạn có một nguồn đáng tin cậy hơn thông số kỹ thuật chính thức của Microsoft về định dạng thực thi của Microsoft, tôi rất muốn biết đó là gì. - Alexander Revo
Đối với các tệp bắt đầu bằng "MZ", bạn cần tìm thêm một chút nữa. Tôi tìm thấy PE..L tại offset 0x110, ngay sau "RichMQ _........". - jnnnnn


Công cụ SDK dumpbin.exe với /headers tùy chọn bao gồm thông tin này, so sánh hai thông tin này (tôi đã thêm chữ in đậm cho thông tin chính)

PS [64] E: \ # 4> dumpbin / tiêu đề C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Phiên bản Dumper 10.00.40219.01
Bản quyền (C) Tập đoàn Microsoft. Đã đăng ký Bản quyền.


Dump của tập tin C: \ Windows \ system32 \ cmd.exe

Đã tìm thấy chữ ký PE

Loại tệp: HÌNH ẢNH THỰC HIỆN

Giá trị HEADER FILE
             Máy 8664 (x64)
               6 số phần
        4CE798E5 ngày đóng dấu ngày Sat 20/11 09:46:13 2010
               0 con trỏ tập tin vào bảng biểu tượng
               0 số biểu tượng
              Kích thước F0 của tiêu đề tùy chọn
              22 đặc điểm
                   Thực thi
                   Ứng dụng có thể xử lý các địa chỉ lớn (> 2GB)
[...]

PS [64] E: \ # 5> dumpbin / tiêu đề C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Phiên bản Dumper 10.00.40219.01
Bản quyền (C) Tập đoàn Microsoft. Đã đăng ký Bản quyền.


Dump của tập tin C: \ Windows \ syswow64 \ cmd.exe

Đã tìm thấy chữ ký PE

Loại tệp: HÌNH ẢNH THỰC HIỆN

Giá trị HEADER FILE
              Máy 14C (x86)
               4 số phần
        4CE78E2B tem thời gian ngày Thứ Bảy 20 tháng 11, 09:00:27 2010
               0 con trỏ tập tin vào bảng biểu tượng
               0 số biểu tượng
              Kích thước E0 của tiêu đề tùy chọn
             102 đặc tính
                   Thực thi
                   Máy từ 32 bit
[...]

109
2017-11-17 12:14



Bạn cũng có thể thấy (IA64) cho một exe Itanium 64 bit. - Darryl Braaten
như tôi đọc ở nơi khác trên siêu người dùng, sử dụng dumpbin /headers | findstr "machine" đơn giản hóa việc trình bày những gì mà QA đang tìm kiếm ... - user1055604
Dumpbin.exe nằm ở đây: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@ David: không nhất thiết (phiên bản khác nhau của VS, không sử dụng vị trí cài đặt mặc định, sử dụng phiên bản từ Windows SDK): đó là lý do tại sao tôi không chỉ định. - Richard
Cách dễ nhất để sử dụng dumpbin nếu bạn khởi chạy nó từ dòng lệnh studio trực quan: stackoverflow.com/a/477389/1390430 - Ben


Nếu bạn không có hoặc muốn toàn bộ Windows SDK hoặc Visual Studio, bạn có thể sử dụng sigcheck.exe từ SysInternals:

sigcheck.exe C:\Windows\Notepad.exe

Đầu ra:

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

40
2017-09-06 15:02



Dường như không phải lúc nào cũng chính xác: Hãy thử sử dụng nó với LinqPad.exe (phiên bản AnyCPU-64bit) và Sigcheck sẽ cho bạn biết đó là "32 bit" ... - Matt
@Matt thú vị. LinqPad giống như một ứng dụng .net; Tôi tự hỏi nếu sigcheck chỉ hoạt động chính xác trên thực thi bản địa (cho mục đích này). - briantist
Có, đó là một ứng dụng .NET. Trong .NET, nếu nó không được biên dịch trước, bạn có thể nhắm mục tiêu "x86" hoặc "AnyCPU". "x86" sẽ luôn chạy 32 bit, nhưng AnyCPU sẽ chạy 64 bit trên hệ thống 64 bit, nhưng 32 bit trên hệ thống 32 bit. SigCheck nên xem xét điều này và hiển thị ít nhất là ".NET 32 bit hoặc 64 bit (AnyCPU)". Ví dụ ILSpy cho biết trong trường hợp này là "Kiến trúc: AnyCPU (ưu tiên 64 bit)" - nhưng ILSpy sẽ không hoạt động đối với non-.NET EXE. - Matt
Đó có thể là trường hợp, giống như tiêu đề "MZ" cũ chỉ có cho hệ điều hành không phải Windows ("DOS") nói "Ứng dụng này yêu cầu Microsoft Windows" ... ;-) - Matt
Vâng, thời gian cũ tốt, nơi bạn đã có một trình gỡ rối DOS trong trình bao và có thể tháo rời mã (chỉ chứa một cuộc gọi DOS in thông báo này) ... và thay thế văn bản bằng "Câu trả lời là 42." :-D - Matt


Tôi có thể xác nhận rằng file tiện ích (ví dụ: từ cygwin) sẽ phân biệt giữa các tệp thực thi 32 và 64 bit. Chúng xuất hiện như sau:

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

Như bạn có thể thấy, nó rất rõ ràng đó là cái gì. Ngoài ra nó phân biệt giữa giao diện điều khiển và thực thi GUI, cũng rõ ràng đó là cái nào.


33
2018-01-17 02:08



Giải pháp này khá phổ biến cho bất kỳ nhà phát triển nào đã cài đặt msysgit. - FrontierPsycho
Tại sao các tệp thi hành trong cửa sổ có MZ thay vì PE? - Mohammadreza Panahi


Một phương pháp đơn giản là chạy nó (giả sử bạn tin tưởng nó) và hãy xem tab quá trình trong trình quản lý tác vụ. Quy trình 32 bit sẽ hiển thị "* 32" ở cuối tên quy trình. Nếu đó không phải là thứ bạn sẵn sàng chạy trên máy tính, bạn có thể thử EXE Explorer. Nó sẽ hiển thị một loạt các thông tin về các tập tin thực thi bao gồm nếu nó là 32 hoặc 64bit.


30
2017-11-17 10:39



Thật không may, điều này đòi hỏi bạn phải chạy tập tin thực thi. Có lẽ bạn cần phải kiểm tra kiến ​​trúc của chương trình như là một phương pháp xử lý sự cố về lý do tại sao nó không chạy. - Mike Christiansen
Làm thế nào để bạn chạy một DLL? - user34660
@ user34660 RUNDLL32.EXE <dllname>, <entrypoint> - samsara
@samusarin phải ở trong bài đăng. - user34660
@ user34660 Bạn đúng về mặt kỹ thuật, một DLL không có main điểm vào và do đó sẽ không thực hiện như một quy trình độc lập. Có một hàm khởi tạo được gọi khi nó được nạp nhưng đó không phải là "chính". - samsara


Phiên bản 64 bit của Process Explorer Có thể cho bạn biết. Chỉ cần chạy tệp thực thi và mở cửa sổ thuộc tính của quy trình. Trên tab chính có một mục có nội dung "Hình ảnh: 32 Bit" hoặc "Hình ảnh: 64 Bit".

enter image description here


18
2017-11-17 13:36



Simply run the executable Và nếu bạn không muốn chạy chương trình? - Synetech
@Synetech Câu hỏi ban đầu không ngụ ý đó là trường hợp. - Andrew Lambert
Đây là phương pháp dễ nhất cho tôi, tôi nghĩ, trừ khi việc thực thi thoát ra quá nhanh. - starbeamrainbowlabs
Làm thế nào để bạn chạy một DLL? - user34660


Nhiều người có sự xuất sắc 7-zip đã cài đặt và đã thêm thư mục 7-Zip vào PATH. 7-zip hiểu các định dạng tệp khác với ZIP và RAR, chẳng hạn như tệp MSI và tệp thi hành PE. Đơn giản chỉ cần sử dụng dòng lệnh 7z.exe trên tệp PE (Exe hoặc DLL) được đề cập:

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

Đầu ra sẽ bao gồm các dòng như sau, với CPU đọc dòng x86 hoặc là x64, đó là những gì đang được hỏi ở đây:

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

18
2017-10-04 10:56





Phương thức chạy một tệp thực thi và sau đó kiểm tra trong quá trình thám hiểm hoặc công cụ tương tự, có một số nhược điểm rõ ràng:

  1. Chúng ta phải thực hiện quy trình.
  2. Đối với các quy trình sống ngắn (như các loại thế giới chào echo.), Quá trình thám hiểm có thể thậm chí không đăng ký rằng một quá trình mới đã bắt đầu.

Phương pháp Dumpbin.exe có thể giải quyết mục đích có thể.

Một lựa chọn khác là sử dụng Cygwin's tập tin chỉ huy. Tuy nhiên, tôi đã không thử nghiệm nó trên cửa sổ. Nó hoạt động tốt trên Linux.

Usage: file program_under_test.exe

EDIT: Chỉ cần thử nghiệm file.exe trên cửa sổ. hoạt động tốt. :)


13
2017-09-27 07:08



Chỉ muốn nói, rằng có một số tình huống, nơi mà phương pháp của Drac sẽ không có ích gì nhiều. - anishsane
>> Điều này vẫn yêu cầu chạy chương trình mà tác giả muốn tránh: Không .. chúng tôi chạy nó như: file.exe program_under_test.exe - anishsane
Và những người muốn tránh cài đặt toàn bộ cygwin gói có thể lấy gnuwin32 file gói. - Bob
@anishsane Hoàn toàn sai. file chỉ cần đọc dữ liệu từ đĩa ở định dạng nhị phân và kiểm tra mọi số ma thuật nhận dạng chúng, so sánh với cơ sở dữ liệu. Các chương trình 32 bit của Windows xuất hiện dưới dạng PE32, và cả hai chương trình 64-bit và .NET đều xuất hiện dưới dạng PE32 +. Các bitness của file chính nó tạo ra sự khác biệt hoàn toàn bằng không - cả ứng dụng 32 bit và 64 bit đều có thể đọc dữ liệu từ đĩa, đó là tất cả những gì cần. - Bob
@MarcH Ha! Cái đó Là hấp dẫn. Tôi đoán rằng có nghĩa là stub runtime .NET là 32-bit. Vì vậy, nó chạy một quá trình 32-bit cho một phần nhỏ của một giây, nhưng tất cả các quá trình đó là bắt đầu thời gian chạy .NET, mà tạo ra một quá trình 64-bit. - clacke


Cách đơn giản nhất (khi dữ liệu không được bảo mật)

Tôi thấy rằng Virustotal  File detail là cách đơn giản nhất để tìm hiểu xem nhị phân là 32 bit hay 64 bit.

Các Additional information tùy chọn cung cấp thêm nhiều thông tin hữu ích về tệp.

Virustotal analysis


[Virustotal TrID


13
2018-01-05 16:53





Dưới đây là một giải pháp Powershell, không có phụ thuộc bên ngoài hoặc bất cứ điều gì. Mở Powershell, dán hàm vào đó (nhấn Enter hai lần để bạn quay trở lại dấu nhắc), sau đó sử dụng nó như trong ví dụ của tôi bên dưới hàm:

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ưới đây là ví dụ đầu ra:

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

10
2018-03-19 12:09



Slickness. Kịch bản trên dường như để lại một tham chiếu đến tệp đang mở. Không thể xây dựng cho đến khi tôi đóng powerhell đầu tiên (chạy script để thẩm vấn DLL trong \ bin). - samsara
Rất tuyệt. +1. Itanium chắc chắn là 64bit mặc dù :) - Rich Homolka
@samusarin: có thể thêm $stream.dispose(); sau khi đóng cửa? Nên phát hành các tập tin xử lý. ( stackoverflow.com/questions/1999858/… ) - Yorik


Ngay cả một thực thi được đánh dấu là 32-bit có thể chạy như 64-bit nếu, ví dụ, đó là một thực thi .NET có thể chạy như 32- hoặc 64-bit. Để biết thêm thông tin, xem https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit, có câu trả lời cho biết rằng tiện ích CORFLAGS có thể được sử dụng để xác định cách một ứng dụng .NET sẽ chạy.

Đầu ra CORFLAGS.EXE

Đối với thực thi 32 bit:

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

Đối với thực thi 64 bit:

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

Đối với thực thi có thể chạy dưới dạng 32 hoặc 64 bit và sẽ chạy dưới dạng 64 bit khi có thể:

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

Đối với tệp thực thi có thể chạy dưới dạng 32 hoặc 64 bit, nhưng sẽ chạy dưới dạng 32 bit trừ khi được tải vào quy trình 64 bit:

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x20003
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 1
Signed    : 0

6
2017-10-07 15:32



Lệnh tuyệt vời, nhưng nó sẽ không hoạt động đối với các tệp thi hành / dll gốc (không quản lý). (corflags : error CF008 : The specified file does not have a valid managed header) - Tomasz Gandor
@TomaszGandor Có, ngữ cảnh của câu trả lời này chỉ được quản lý mã. Mã không được quản lý được trả lời bởi các câu trả lời khác. Theo tôi biết, chỉ có mã được quản lý mới có thể chuyển đổi giữa thực thi cả 32 và 64 bit. - BlueMonkMN