Apakah ada cara mudah untuk memeriksa apakah biner 32 atau 64 bit pada Windows? Saya perlu memeriksa sebelum saya memindahkan program ke mesin 32bit dan mengalami kegagalan yang spektakuler.
Apakah ada cara mudah untuk memeriksa apakah biner 32 atau 64 bit pada Windows? Saya perlu memeriksa sebelum saya memindahkan program ke mesin 32bit dan mengalami kegagalan yang spektakuler.
Jawaban:
Setelah memeriksa nilai header dari jawaban Richard , saya menemukan solusi yang cepat, mudah, dan hanya memerlukan editor teks. Bahkan notepad.exe standar Windows akan berfungsi.
Buka editor teks yang dapat dieksekusi. Anda mungkin harus menyeret-dan-jatuhkan atau menggunakan Open...
dialog editor , karena Windows tidak menampilkan Open with...
opsi dalam menu konteks untuk executable.
Periksa karakter yang dapat dicetak pertama setelah kejadian pertama PE
. Bagian ini kemungkinan besar akan dikelilingi oleh setidaknya beberapa spasi putih (bisa banyak), sehingga dapat dengan mudah dilakukan secara visual.
Inilah yang akan Anda temukan:
PE L
PE d†
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 beberapa. Dalam kasus saya dalam waktu sekitar 30 detik untuk menampilkan file 12 MIB. Notepad ++, bagaimanapun, mampu menampilkan 120 MiB yang dapat dieksekusi hampir secara instan.
Ini adalah solusi yang mungkin berguna jika Anda perlu memeriksa file pada mesin yang tidak dapat Anda instal dengan perangkat lunak tambahan.
Jika Anda memiliki HEX-Editor tersedia, offset PE Signature terletak di offset 0x3C
. Tanda tangan adalah PE\0\0
(huruf "P" dan "E" diikuti oleh dua byte nol), diikuti oleh Tipe Mesin dua byte di Little Endian.
Nilai yang relevan 0x8664
untuk dieksekusi x64 dan 0x14c
untuk x86. Ada lebih banyak nilai yang mungkin, tetapi Anda mungkin tidak akan pernah menemukan salah satu dari ini, atau dapat menjalankan executable tersebut pada PC Windows Anda.
Daftar lengkap jenis mesin, bersama dengan spesifikasi .exe lainnya dapat ditemukan di bagian Jenis Mesin Spesifikasi Microsoft PE dan COFF .
Microsoft PE and COFF Specification
, yang merupakan kontrak terdokumentasi sebanyak mungkin, serta petunjuk tentang cara menemukan alamat pasti header PE dalam .exe
file apa pun . Jika Anda memiliki sumber yang lebih andal daripada spesifikasi resmi Microsoft tentang format Microsoft yang dapat dieksekusi, saya ingin tahu apa itu.
Alat SDK dumpbin.exe
dengan /headers
opsi menyertakan informasi ini, bandingkan keduanya (saya telah menambahkan huruf tebal untuk informasi utama)
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 file C: \ Windows \ system32 \ cmd.exe Tanda tangan PE ditemukan Jenis File: GAMBAR EXECUTABLE NILAI HEADER FILE Mesin 8664 (x64) 6 jumlah bagian 4CE798E5 cap tanggal waktu Sat 20 Nov 09:46:13 2010 0 penunjuk file ke tabel simbol 0 jumlah simbol Ukuran header F0 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 file C: \ Windows \ syswow64 \ cmd.exe Tanda tangan PE ditemukan Jenis File: GAMBAR EXECUTABLE NILAI HEADER FILE Mesin 14C (x86) 4 jumlah bagian Stempel tanggal waktu 4CE78E2B, Sat 20 Nov 09:00:27 2010 0 penunjuk file ke tabel simbol 0 jumlah simbol E0 ukuran header opsional 102 karakteristik Dapat dieksekusi Mesin kata 32 bit [...]
dumpbin /headers | findstr "machine"
sangat menyederhanakan presentasi apa yang dicari QA ...
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
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
Saya dapat mengkonfirmasi 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 executable GUI, juga jelas mana yang.
MZ
bukan PE
?
Metode sederhana adalah menjalankannya (dengan asumsi Anda memercayainya) dan lihat tab proses di task manager. Proses 32bit akan menampilkan "* 32" di akhir nama proses. Jika itu bukan sesuatu yang Anda inginkan untuk dijalankan di komputer Anda, Anda dapat mencoba EXE Explorer . Ini akan menampilkan sejumlah besar info tentang executable termasuk apakah itu 32 atau 64bit.
main
titik masuk dan tidak akan dijalankan sebagai proses yang berdiri sendiri. Ada fungsi inisialisasi yang dipanggil ketika dimuat tetapi itu bukan "utama".
Banyak orang memasang 7-zip yang luar biasa , dan telah menambahkan folder 7-Zip ke mereka PATH
. 7-zip memahami format file selain ZIP dan RAR, seperti file MSI dan executable PE. Cukup gunakan baris perintah 7z.exe
pada file PE (Exe atau DLL) dalam pertanyaan:
7z l some.exe | more
7z l some.exe | findstr CPU
Keluaran akan mencakup baris sebagai berikut, dengan CPU
baris yang membaca salah satu x86
atau x64
, yang ditanyakan 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
file
implementasi di dalamnya?
Versi 64-bit dari Proses Explorer dapat memberi tahu Anda. Cukup jalankan executable dan buka jendela properti proses. Pada tab utama ada entri yang mengatakan "Gambar: 32 Bit" atau "Gambar: 64 Bit".
Simply run the executable
Dan bagaimana jika Anda tidak ingin menjalankan program?
Cara paling sederhana (saat data tidak dirahasiakan)
Saya menemukan bahwa Virustotal File detail
adalah cara paling sederhana untuk mengetahui apakah biner adalah 32 bit atau 64 bit.
The Additional information
pilihan memberikan selain informasi banyak membantu tentang file.
Metode menjalankan yang dapat dieksekusi & kemudian memeriksa dalam proses explorer atau alat serupa, memiliki beberapa kelemahan yang jelas:
Metode Dumpbin.exe dapat memecahkan tujuan mungkin.
Alternatif lain adalah menggunakan perintah file cygwin . Namun, saya belum mengujinya di windows. Ini bekerja dengan baik di Linux.
Usage: file program_under_test.exe
EDIT: Baru saja menguji file.exe di jendela. bekerja dengan baik. :)
cygwin
paket dapat mengambil paket gnuwin32file
.
file
cukup membaca data dari disk dalam format biner dan memeriksa setiap angka ajaib yang mengidentifikasinya, membandingkannya dengan database. Program 32-bit Windows muncul sebagai PE32, dan program 64-bit dan .NET muncul sebagai PE32 +. Bitness file
itu sendiri benar-benar membuat perbedaan nol - baik aplikasi 32-bit dan 64-bit dapat membaca data dari disk, yang hanya itu yang dibutuhkan.
Inilah solusi Powershell, tidak ada ketergantungan eksternal atau apa pun. Buka Powershell, rekatkan fungsi di sana (tekan Enter dua kali sehingga Anda kembali ke prompt), lalu gunakan seperti dalam contoh saya di bawah fungsi:
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
}
Berikut ini contoh output:
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();
setelah tutup? Harus melepaskan file menangani. ( stackoverflow.com/questions/1999858/… )
Bahkan executable yang ditandai sebagai 32-bit dapat berjalan sebagai 64-bit jika, misalnya, ini adalah .NET yang dapat dijalankan sebagai 32- atau 64-bit. Untuk informasi lebih lanjut, lihat https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit , yang memiliki jawaban yang mengatakan bahwa Utilitas CORFLAGS dapat digunakan untuk menentukan bagaimana aplikasi .NET akan berjalan.
Output CORFLAGS.EXE
Untuk eksekusi 32-bit:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x3
ILONLY : 1
32BITREQ : 1
32BITPREF : 0
Signed : 0
Untuk 64-bit yang dapat dieksekusi:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
Untuk executable yang dapat dijalankan sebagai 32- atau 64-bit dan akan berjalan sebagai 64-bit jika memungkinkan:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
Untuk executable yang dapat berjalan sebagai 32- atau 64-bit, tetapi akan berjalan sebagai 32-bit kecuali dimuat ke dalam proses 64-bit:
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
)
Anda juga dapat menggunakan file
alat dari dalam bundel msys dari mingw . Ini bekerja seperti perintah unix. Serupa bekerja file
alat dari GNUwin32 .
Jika Anda menggunakan Windows 7, pada Windows Explorer, klik kanan pada executable dan pilih Properties. Di jendela properti pilih tab Kompatibilitas. Jika di bawah bagian Mode Kompatibilitas Anda melihat Windows XP, ini adalah 32 bit yang dapat dieksekusi. Jika Anda melihat Windows Vista, itu 64 bit.
Windows 8
Windows XP SP2
tetapi yang lain menunjukkan sebagai Vista
atau Windows 8
. Jadi metode ini tidak benar.
Buat file teks bernama exetest.reg dan berisi kode ini:
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\""
Buat file teks bernama x86TestStart.bat
hanya berisi baris kode ini dan simpan di C: \ temp:
c:\temp\x86or64.vbs %1
Buat file teks bernama x86or64.vbs
mengandung kode ini dan simpan di 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
Klik dua kali pada file exetest.reg: kunci baru akan ditambahkan di registri windows:
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
Ini akan muncul sebagai " uji 32/64 bit " dalam menu konteks setelah mengklik kanan pada file yang dapat dieksekusi.
Mengklik item akan menghasilkan file batch mulai c:\\temp\\x86TestStart.bat\
, yang memulai file VBscript x86or64.vbs
, yang membaca tanda tangan exe dan menunjukkan hasil.
Jika Anda tidak dapat atau tidak ingin merusak registri, cukup salin file .vbs di bilah QuickLaunch, dan seret yang dapat dieksekusi di atasnya.
Dua sen saya hanya akan mengunduh dependensi walker dan memeriksa arsitektur apa yang telah digunakan di salah satu file yang dapat dieksekusi.
Cukup unduh aplikasi, mulai saja, klik ikon buka → cari file * .exe → pilih dan di bagian bawah setelah pemindaian refleksi selesai Anda melihat kotak dengan data di mana satu kolom memiliki detail "arsitektur" di dalamnya (x86, x64)
Buka executable dan lihat arsitektur build
Saya belum melihat ini disebutkan. Ada program penampil PE yang disebut CFF Explorer oleh NTCore , yang dapat memberikan Anda informasi ini. Itu dapat diunduh dan dijalankan sebagai portable, tetapi Anda dapat menginstalnya juga, jika Anda mau.
Klik kanan pada biner ( .exe
, .dll
dll.) Dan pilih "Buka dengan CFF Explorer". Pergi ke Nt Headers -> File Header -> Pada bidang "Karakteristik" klik "Klik di sini"
Jika program 32bit, kotak centang "32 bit word machine" akan dicentang. Sebagai contoh, saya telah menginstal Notepad ++ versi 32bit seperti yang Anda lihat pada gambar di bawah ini. Kalau tidak, itu 64bit.
.DMP
dump di Visual Studiodua sen saya: sebagai pengembang C ++, dependency walker ( http://www.dependencywalker.com/ ) sangat informatif, tidak hanya menampilkan 64/32 bit, tetapi juga setiap Dll yang terlibat:
Anda dapat melihat 64 di sebelah kiri setiap nama file ...
Namun, WSL 's file
perintah bekerja sangat.
file /mnt/c/p/bin/rg.exe
akan menghasilkan:
/mnt/c/p/bin/rg.exe: PE32+ executable (console) x86-64, for MS Windows
file /mnt/c/p/bin/u.exe
akan menghasilkan:
/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
Kolom platform di task manager windows 10
Windows 7 tidak memiliki kolom platform. Jadi task manager Windows 7 tidak akan menunjukkannya.
Di windows 10 memilih kolom tidak lagi di bawah 'tampilan'. Di Windows 10, ketika di tab detail, Anda klik kanan tajuk kolom lalu 'pilih kolom'. Kemudian centang kotak untuk 'platform'.