Có cách nào dễ dàng để kiểm tra xem nhị phân là 32 hay 64 bit trên Windows không? Tôi cần kiểm tra trước khi chuyển chương trình sang máy 32 bit và gặp thất bại ngoạn mục.
Có cách nào dễ dàng để kiểm tra xem nhị phân là 32 hay 64 bit trên Windows không? Tôi cần kiểm tra trước khi chuyển chương trình sang máy 32 bit và gặp thất bại ngoạn mụ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ỉ cần một trình soạn thảo văn bản. Ngay cả notepad.exe mặc định của Windows cũng sẽ hoạt động.
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 Open...
hộp thoại của trình soạn thảo , vì Windows không hiển thị Open with...
tùy chọn trong menu ngữ cảnh cho các tệp thực thi.
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 rất có thể được bao quanh bởi ít nhất một số khoảng trắng (có thể là rất nhiều), vì vậy nó có thể dễ dàng thực hiện một cách trực quan.
Đây là những gì bạn sẽ tìm thấy:
PE L
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 sử dụng nó cho các tệp lớn hơn một megabyte hoặc vài. Trong trường hợp của tôi, mất khoảng 30 giây để hiển thị tệp 12 MiB. Notepad ++, tuy nhiên, đã có thể hiển thị một tệp thực thi 120 MiB 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 mà bạn không thể cài đặt bất kỳ phần mềm bổ sung nào.
Nếu bạn có sẵn HEX-Editor, phần bù của Chữ ký PE được đặt ở vị trí bù 0x3C
. Chữ ký là PE\0\0
(chữ cái "P" và "E" theo sau là hai byte rỗng), theo sau là Loại máy hai byte trong Little Endian.
Các giá trị liên quan là 0x8664
cho x64 thực thi và 0x14c
cho x86. Có rất nhiều giá trị có thể hơn, nhưng có lẽ bạn sẽ không 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 thực thi đó trên PC Windows của mình.
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 phần Loại máy của Microsoft PE và COFF .
Microsoft PE and COFF Specification
, đó là một hợp đồng được ghi lại nhiều nhất có thể, cũng như 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 chính Microsoft, tôi rất muốn biết đó là gì.
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 đậm cho thông tin chính)
PS [64] E: \ # 4> dumpbin / tiêu đề C: \ Windows \ system32 \ cmd.exe Máy xúc lật Microsoft (R) COFF / PE Phiên bản 10:00.40219.01 Bản quyền (C) Tập đoàn Microsoft. Đã đăng ký Bản quyền. Kết xuất tệp C: \ Windows \ system32 \ cmd.exe Chữ ký PE được tìm thấy Loại tệp: HÌNH ẢNH THỰC HIỆN GIÁ TRỊ FILE Máy 8664 (x64) 6 số phần 4CE798E5 thời gian đóng dấu ngày 20 tháng 11 09:46:13 2010 Con trỏ tệp 0 vào bảng ký hiệu 0 số ký hiệu 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) [...]
và
PS [64] E: \ # 5> dumpbin / tiêu đề C: \ Windows \ syswow64 \ cmd.exe Máy xúc lật Microsoft (R) COFF / PE Phiên bản 10:00.40219.01 Bản quyền (C) Tập đoàn Microsoft. Đã đăng ký Bản quyền. Kết xuất tệp C: \ Windows \ syswow64 \ cmd.exe Chữ ký PE được tìm thấy Loại tệp: HÌNH ẢNH THỰC HIỆN GIÁ TRỊ FILE Máy 14C (x86) 4 số phần Dấu thời gian 4CE78E2B Thứ bảy ngày 20 tháng 11 09:00:27 2010 Con trỏ tệp 0 vào bảng ký hiệu 0 số ký hiệu Kích thước E0 của tiêu đề tùy chọn 102 đặc điểm Thực thi Máy 32 bit [...]
dumpbin /headers | findstr "machine"
đơn giản hóa rất nhiều cách trình bày về những gì QA đang tìm kiếm ...
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
Nếu bạn không có hoặc muốn toàn bộ SDK Windows hoặc Visual Studio, bạn có thể sử dụng sigcheck.exe
từ SysIternals :
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
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. Ngoài ra, nó phân biệt giữa thực thi giao diện điều khiển và GUI, cũng rõ ràng đó là.
MZ
thay vì PE
?
Một phương pháp đơn giản là chạy nó (giả sử bạn tin tưởng nó) và xem qua tab quy trình trong trình quản lý tác vụ. Các 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 thông tin về các tệp thực thi, bao gồm cả nếu nó là 32 hoặc 64 bit.
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 chức năng khởi tạo được gọi khi nó được tải nhưng đó không phải là "chính".
Nhiều người đã cài đặt 7-zip tuyệt vời 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 thực thi PE. Chỉ cần sử dụng dòng lệnh 7z.exe
trên tệp PE (exe hoặc DLL) trong câu hỏi:
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
dòng đọc x86
hoặc 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
file
thực hiện bên trong?
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 ghi "Hình ảnh: 32 bit" hoặc "Hình ảnh: 64 bit".
Simply run the executable
Và nếu bạn không muốn chạy chương trình thì sao?
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 thông tin hữu ích về nhiều tập tin.
Phương pháp chạy một tệp thực thi và sau đó kiểm tra trong trình thám hiểm quy trình hoặc công cụ tương tự, có một số nhược điểm rõ ràng:
Phương pháp Dumpbin.exe có thể giải quyết mục đích có thể.
Một cách khác là sử dụng lệnh tập tin của cygwin . Tuy nhiên, tôi chưa thử nó trên windows. Nó hoạt động tốt trên Linux.
Usage: file program_under_test.exe
EDIT: Chỉ cần kiểm tra file.exe trên cửa sổ. hoạt động tốt :)
file
chỉ cần đọc dữ liệu từ đĩa ở định dạng nhị phân và kiểm tra bất kỳ số ma thuật nào xác định 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ả chương trình 64 bit và .NET đều xuất hiện dưới dạng PE32 +. Độ file
bit của 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ì nó cần.
Đây là một giải pháp Powershell, không phụ thuộc bên ngoài hay bất cứ điều gì. Mở Powershell, dán chức năng vào đó (nhấn Enter hai lần để bạn quay lại dấu nhắc), sau đó sử dụng nó như trong các ví dụ của tôi bên dưới chức năng:
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
}
Đâ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
$stream.dispose();
sau khi đóng? Nên phát hành tập tin xử lý. ( stackoverflow.com/questions/1999858/ Lời )
Ngay cả một tệp thực thi được đánh dấu là 32 bit cũng có thể chạy là 64 bit, ví dụ, đó là tệp thực thi .NET có thể chạy dưới dạng 32 hoặc 64 bit. Để biết thêm thông tin, hãy xem https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit , trong đó 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 ứng dụng .NET sẽ chạy.
Đầu ra CORFLAGS.EXE
Đối với tệp 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
Để 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
Để 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
corflags : error CF008 : The specified file does not have a valid managed header
)
bạn cũng có thể sử dụng file
công cụ từ trong gói msys của mingw . Nó hoạt động như lệnh unix. file
Công cụ tương tự từ GNUwin32 .
Nếu bạn đang ở trên Windows 7, trên Windows Explorer, nhấp chuột phải vào tệp thực thi và chọn Thuộc tính. Trong cửa sổ thuộc tính chọn tab Tương thích. Nếu trong phần Chế độ tương thích bạn thấy Windows XP, thì đây là tệp thực thi 32 bit. Nếu bạn thấy Windows Vista, nó là 64 bit.
Windows 8
Windows XP SP2
nhưng những người khác hiển thị như Vista
hoặc Windows 8
. Vì vậy phương pháp này không đúng.
Tạo một tệp văn bản có tên exetest.reg và chứa mã này:
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\""
Tạo một tệp văn bản có tên x86TestStart.bat
chỉ chứa dòng mã này và lưu nó trong C: \ temp:
c:\temp\x86or64.vbs %1
Tạo một tệp văn bản có tên x86or64.vbs
chứa mã này và lưu nó trong 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
Nhấp đúp chuột vào tập tin exetest.reg: một khóa mới sẽ được thêm vào sổ đăng ký windows:
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
Nó sẽ xuất hiện dưới dạng " 32/64 bit test " trong menu ngữ cảnh khi nhấp chuột phải vào tệp thực thi.
Nhấp vào mục sẽ dẫn đến bắt đầu tệp bó c:\\temp\\x86TestStart.bat\
, bắt đầu tệp VBscript x86or64.vbs
, đọc chữ ký exe và hiển thị kết quả.
Nếu bạn không thể hoặc không muốn giả mạo đăng ký, chỉ cần sao chép tệp .vbs trong thanh QuickLaunch và kéo tệp thực thi trên nó.
Hai xu của tôi sẽ chỉ là tải xuống walker walker và kiểm tra những gì cho kiến trúc đã được sử dụng trong một trong các tập tin thực thi.
Chỉ cần tải xuống ứng dụng, khởi động nó, nhấp vào biểu tượng mở → tìm tệp * .exe → chọn và ở phía dưới sau khi quét phản chiếu xong bạn thấy một lưới có dữ liệu trong đó một cột có chi tiết "kiến trúc" trong đó (x86, x64)
Mở thực thi và xem kiến trúc xây dựng
Tôi chưa thấy điều này được đề cập. Có một chương trình xem PE được gọi là CFF Explorer của NTCore , có thể cung cấp cho bạn thông tin này. Nó có thể được tải xuống và chạy dưới dạng di động, nhưng bạn cũng có thể cài đặt nó, nếu bạn muốn.
Nhấp chuột phải vào tệp nhị phân ( .exe
, .dll
v.v.) và chọn "Mở bằng CFF Explorer". Chuyển đến Tiêu đề Nt -> Tiêu đề tệp -> Trên trường "Đặc điểm", nhấp vào "Nhấp vào đây"
Nếu đó là chương trình 32 bit, hộp kiểm "Máy từ 32 bit" sẽ được chọn. Chẳng hạn, tôi đã cài đặt phiên bản 32 bit của Notepad ++ như bạn có thể thấy trong hình bên dưới. Nếu không, nó là 64 bit.
.DMP
dump trong Visual Studiohai xu của tôi: với tư cách là nhà phát triển C ++, walker walker ( http://www.dependencywalker.com/ ) rất nhiều thông tin, không chỉ hiển thị 64/32 bit, mà còn mọi DLL liên quan:
Bạn có thể thấy 64 ở bên trái của mỗi tên tệp ...
Cột nền tảng trong trình quản lý tác vụ của windows 10
Windows 7 không có cột nền tảng. Vì vậy, trình quản lý tác vụ Windows 7 sẽ không hiển thị nó.
Trong windows 10, việc chọn các cột không nằm dưới 'view' nữa. Trong Windows 10, khi trong tab chi tiết, bạn nhấp chuột phải vào tiêu đề cột rồi 'chọn cột'. Sau đó chọn hộp cho 'nền tảng'.