Pertanyaan Bagaimana cara memeriksa apakah biner adalah 32 atau 64 bit di Windows?


Apakah ada cara mudah untuk memeriksa apakah biner adalah 32 atau 64 bit di Windows? Saya harus memeriksa sebelum saya memindahkan program ke mesin 32-bit dan mengalami kegagalan spektakuler.


257
2017-11-17 10:29


asal


Pertanyaan ini serupaNamun, perlu beberapa pekerjaan untuk memeriksanya. - ST3
@Guillaume: Gambar yang dapat dieksekusi bukanlah proses. Task Manager hanya menunjukkan proses. - IInspectable


Jawaban:


Setelah memeriksa nilai header dari Jawaban Richard, Saya menemukan solusi yang cepat, mudah, dan hanya membutuhkan editor teks. Bahkan notepad.exe bawaan Windows 'akan berfungsi.

  1. Buka executable di editor teks. Anda mungkin harus drag-and-drop atau gunakan editornya Open... dialog, karena Windows tidak muncul Open with... pilihan dalam menu konteks untuk executable.

  2. Periksa karakter yang dapat dicetak pertama setelah kemunculan pertama PE. Bagian ini kemungkinan besar dikelilingi oleh setidaknya beberapa spasi (bisa banyak), sehingga dapat dengan mudah dilakukan secara visual.

Inilah yang akan Anda temukan:

x86:

PE  L

x64:

PE  d†

Sebuah kata peringatan: menggunakan Notepad default pada file besar bisa sangat lambat, jadi lebih baik tidak menggunakannya untuk file yang lebih besar dari satu megabyte atau sedikit. Dalam kasus saya membutuhkan waktu sekitar 30 detik untuk menampilkan file 12 MiB. Notepad ++, bagaimanapun, mampu menampilkan 120 MiB yang dapat dieksekusi hampir seketika.

Ini adalah solusi yang mungkin berguna jika Anda perlu memeriksa file pada mesin Anda tidak dapat menginstal perangkat lunak tambahan.

Informasi tambahan:

Jika Anda memiliki Editor-HEX tersedia, offset PE Signature terletak pada offset 0x3C. Tanda tangan itu PE\0\0 (huruf "P" dan "E" diikuti oleh dua byte nol), diikuti oleh Jenis Mesin dua byte di Little Endian.

Nilai yang relevan adalah 0x8664 untuk x64 dapat dieksekusi dan 0x14c untuk x86. Ada lebih banyak kemungkinan nilai, tetapi Anda mungkin tidak akan pernah menemukan ini, atau dapat menjalankan executable tersebut pada PC Windows Anda.

Daftar lengkap jenis mesin, bersama dengan sisa spesifikasi .exe dapat ditemukan di Spesifikasi Microsoft PE dan COFF  Jenis Mesin bagian.


270
2018-03-13 17:08



Hei, ini agak tidak sopan. Dan untuk menjadi lebih baik, karena ini tampaknya menjadi solusi tercepat dan termudah untuk sebagian besar kasus :) - Septagram
Contoh langka ketika notepad mengalahkan notepad ++. Notepad menunjukkan ini dengan benar, di notepad Anda telah dipusingkan dengan encoding untuk membuatnya menunjukkan tetapi itu berhasil! - zar
@CoDEmanX opsi ini berarti IDE atau JIT membuat pilihan untuk Anda. Lihat pertanyaan iniatau ini posting blog untuk lebih jelasnya. - Alexander Revo
Maha Guru Ching Hai: Terimalah jika Anda benar-benar merasa terganggu untuk membaca seluruh pos sebelum menurunkannya, Anda akan melihat tautan ke Microsoft PE and COFF Specification, yang merupakan kontrak terdokumentasi sebanyak yang bisa didapat, serta petunjuk tentang cara menemukan alamat yang tepat dari header PE di .exe mengajukan. Jika Anda memiliki sumber yang lebih andal daripada spesifikasi resmi Microsoft pada format eksekusi Microsoft sendiri, saya ingin tahu apa itu. - Alexander Revo
Untuk file yang dimulai dengan "MZ", Anda perlu melihat lebih jauh. Saya menemukan PE..L di offset 0x110, tepat setelah "RichMQ _........". - jnnnnn


Alat SDK dumpbin.exe dengan /headers pilihan mencakup informasi ini, bandingkan kedua (saya telah menambahkan tebal untuk informasi kunci)

PS [64] E: \ # 4> dumpbin / header C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Dumper Versi 10.00.40219.01
Hak Cipta (C) Microsoft Corporation. Seluruh hak cipta.


Dump dari file C: \ Windows \ system32 \ cmd.exe

Tanda tangan PE ditemukan

Jenis File: EXECUTABLE IMAGE

FILE HEADER VALUES
             Mesin 8664 (x64)
               6 jumlah bagian
        Cap tanggal waktu 4CE798E5 Sat Nov 20 09:46:13 2010
               0 file pointer ke tabel simbol
               0 jumlah simbol
              Ukuran f0 dari header opsional
              22 karakteristik
                   Dapat dieksekusi
                   Aplikasi dapat menangani alamat besar (> 2GB)
[...]

dan

PS [64] E: \ # 5> dumpbin / header C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper Versi 10.00.40219.01
Hak Cipta (C) Microsoft Corporation. Seluruh hak cipta.


Dump dari file C: \ Windows \ syswow64 \ cmd.exe

Tanda tangan PE ditemukan

Jenis File: EXECUTABLE IMAGE

FILE HEADER VALUES
              Mesin 14C (x86)
               4 jumlah bagian
        Cap tanggal waktu 4CE78E2B Sat Nov 20 09:00:27 2010
               0 file pointer ke tabel simbol
               0 jumlah simbol
              Ukuran E0 dari header opsional
             102 karakteristik
                   Dapat dieksekusi
                   Mesin 32 bit kata
[...]

109
2017-11-17 12:14



Anda juga bisa melihat (IA64) untuk Exit Itanium 64bit. - Darryl Braaten
seperti yang saya baca di tempat lain pada superuser, menggunakan dumpbin /headers | findstr "machine" sangat menyederhanakan penyajian apa yang dicari QA ... - user1055604
Dumpbin.exe terletak di sini: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David: tidak harus (versi VS yang berbeda, tidak menggunakan lokasi pemasangan default, menggunakan versi dari SDK Windows): itulah mengapa saya tidak menentukan. - Richard
Sangat mudah untuk menggunakan dumpbin jika Anda meluncurkannya dari baris perintah studio visual: stackoverflow.com/a/477389/1390430 - Ben


Jika Anda tidak memiliki atau menginginkan seluruh Windows SDK atau Visual Studio, Anda dapat menggunakan sigcheck.exe dari SysInternals:

sigcheck.exe C:\Windows\Notepad.exe

Keluaran:

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



Tampaknya tidak selalu akurat: Cobalah untuk menggunakannya dengan LinqPad.exe (versi AnyCPU-64bit) dan Sigcheck akan memberi tahu Anda bahwa itu "32 bit" ... - Matt
@Matt menarik. LinqPad terdengar seperti aplikasi .net; Saya ingin tahu apakah sigcheck hanya berfungsi dengan benar pada executable asli (untuk tujuan ini). - briantist
Ya, ini adalah aplikasi .NET. Di .NET, jika tidak dikompilasi, Anda dapat menargetkan "x86" atau "AnyCPU". "x86" akan selalu berjalan sebagai 32 bit, tetapi AnyCPU akan berjalan sebagai 64bit pada sistem 64 bit, tetapi sebagai 32 bit pada sistem 32 bit. SigCheck harus mempertimbangkan ini dan menunjukkan setidaknya ".NET 32 bit atau 64 bit (AnyCPU)". ILSpy misalnya mengatakan dalam hal ini "Architecture: AnyCPU (64-bit preferred)" - tetapi ILSpy tidak akan berfungsi untuk non-.NET EXE. - Matt
Mungkin itu yang terjadi, seperti header "MZ" lama yang hanya ada untuk OS non-Windows ("DOS") yang mengatakan "Aplikasi ini membutuhkan Microsoft Windows" ... ;-) - Matt
Ya, masa lalu yang baik, di mana Anda memiliki debugger DOS di shell dan bisa membongkar kode (yang hanya berisi satu panggilan DOS tunggal mencetak pesan ini) ... dan mengganti teks dengan "Jawabannya adalah 42." :-D - Matt


Saya dapat mengonfirmasi bahwa file utilitas (misalnya dari cygwin) akan membedakan antara executable 32- dan 64-bit. Mereka muncul sebagai berikut:

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

Seperti yang Anda lihat, sangat jelas yang mana. Selain itu membedakan antara konsol dan GUI executable, juga jelas yang mana.


33
2018-01-17 02:08



Solusi ini cukup umum tersedia untuk pengembang yang telah menginstal msysgit. - FrontierPsycho
Mengapa file executable di windows punya MZ dari pada PE? - Mohammadreza Panahi


Metode sederhana adalah menjalankannya (dengan asumsi Anda memercayainya) dan melihat tab proses di task manager. Proses 32bit akan menampilkan "* 32" di akhir nama proses. Jika itu bukan sesuatu yang ingin Anda jalankan di komputer Anda, Anda dapat mencoba EXE Explorer. Ini akan menunjukkan sejumlah besar info tentang executable termasuk apakah itu 32 atau 64bit.


30
2017-11-17 10:39



Sayangnya, ini mengharuskan Anda menjalankan eksekusi. Mungkin Anda perlu memeriksa arsitektur program sebagai metode pemecahan masalah mengapa tidak berjalan. - Mike Christiansen
Bagaimana kamu menjalankan DLL? - user34660
@ user34660 RUNDLL32.EXE <dllname>, <entrypoint> - samsara
@samusarin yang seharusnya ada di pos. - user34660
@ user34660 Anda benar secara teknis, DLL tidak memiliki file main entry point dan tidak akan mengeksekusi sebagai proses yang berdiri sendiri. Ada fungsi inisialisasi yang dipanggil ketika dimuat tetapi itu bukan "utama". - samsara


Versi 64-bit dari Process Explorer dapat memberitahu Anda. Cukup jalankan file eksekusi dan buka jendela properti proses. Pada tab utama ada entri yang mengatakan "Gambar: 32 Bit" atau "Gambar: 64 Bit".

enter image description here


18
2017-11-17 13:36



Simply run the executable Dan bagaimana jika Anda tidak mau menjalankan program? - Synetech
@Synetech Pertanyaan aslinya tidak menyiratkan bahwa itulah yang terjadi. - Andrew Lambert
Ini adalah metode termudah untuk saya, saya pikir, kecuali eksekus keluar terlalu cepat. - starbeamrainbowlabs
Bagaimana kamu menjalankan DLL? - user34660


Banyak orang memiliki yang luar biasa 7-zip diinstal, dan telah menambahkan folder 7-Zip ke folder mereka PATH. 7-zip memahami format file selain ZIP dan RAR, seperti file MSI dan eksekutabel PE. Cukup gunakan baris perintah 7z.exe pada file PE (Exe atau DLL) yang dimaksud:

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

Output akan menyertakan garis sebagai berikut, dengan CPU membaca garis baik x86 atau x64, yang diminta di sini:

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





Metode menjalankan eksekusi & kemudian memeriksa proses explorer atau alat serupa, memiliki beberapa kelemahan yang jelas:

  1. Kami harus melaksanakan prosesnya.
  2. Untuk proses singkat (seperti echo hello world types.), Proses explorer mungkin tidak mencatat bahwa proses baru telah dimulai.

Metode Dumpbin.exe dapat memecahkan tujuan mungkin.

Alternatif lain adalah menggunakan cygwin mengajukan perintah. Namun, saya belum mengujinya di windows. Ini bekerja dengan baik di Linux.

Usage: file program_under_test.exe

EDIT: Hanya diuji file.exe di jendela. bekerja dengan baik. :)


13
2017-09-27 07:08



Hanya ingin mengatakan, bahwa ada beberapa situasi, di mana metode Dracs tidak akan banyak membantu. - anishsane
>> Ini masih membutuhkan menjalankan program yang ingin penulis hindari: Tidak .. kami menjalankannya seperti: file.exe program_under_test.exe - anishsane
Dan mereka yang ingin menghindari menginstal secara keseluruhan cygwin paket bisa ambil gnuwin32 file paket. - Bob
@anishane Benar-benar salah. file cukup membaca data dari disk dalam format biner dan memeriksa setiap angka ajaib yang mengidentifikasi mereka, membandingkan dengan database. Program Windows '32-bit muncul sebagai PE32, dan kedua program 64-bit dan .NET muncul sebagai PE32 +. Kekakuan file itu sendiri benar-benar membuat perbedaan nol - aplikasi 32-bit dan 64-bit dapat membaca data dari disk, yang dibutuhkan. - Bob
@MarcH Ha! Bahwa aku s menarik. Saya menduga itu berarti rintisan .NET runtime adalah 32-bit. Jadi itu menjalankan proses 32-bit untuk sepersekian detik, tetapi semua proses yang dilakukan adalah memulai .NET runtime, yang menciptakan proses 64-bit asli. - clacke