Windows에서 바이너리가 32 비트인지 64 비트인지 쉽게 확인할 수 있습니까? 프로그램을 32 비트 시스템으로 옮기고 엄청난 실패를 경험하기 전에 확인해야합니다.
Windows에서 바이너리가 32 비트인지 64 비트인지 쉽게 확인할 수 있습니까? 프로그램을 32 비트 시스템으로 옮기고 엄청난 실패를 경험하기 전에 확인해야합니다.
답변:
Richard의 답변 에서 헤더 값을 검사 한 후 빠르고 쉽고 솔루션이 필요하며 텍스트 편집기 만 있으면됩니다. 심지어 Windows의 기본 notepad.exe도 작동합니다.
텍스트 편집기에서 실행 파일을 엽니 다. Open...
Windows는 Open with...
실행 파일의 상황에 맞는 메뉴에 옵션을 표시하지 않으므로 끌어서 놓거나 편집기 대화 상자를 사용해야 할 수도 있습니다 .
의 첫 번째 인쇄 후 첫 번째 인쇄 가능 문자를 확인하십시오 PE
. 이 부분은 최소한 일부 공백으로 둘러싸 일 가능성이 높으므로 (많을 수도 있음) 시각적으로 쉽게 수행 할 수 있습니다.
찾을 내용은 다음과 같습니다.
PE L
PE d†
경고 : 큰 파일에서 기본 메모장을 사용하면 속도가 매우 느릴 수 있으므로 메가 바이트보다 크거나 적은 파일에는 사용하지 않는 것이 좋습니다. 필자의 경우 12 MiB 파일을 표시하는 데 약 30 초가 걸렸습니다. 그러나 메모장 ++은 120 MiB 실행 파일을 거의 즉시 표시 할 수있었습니다.
이 방법은 추가 소프트웨어를 설치할 수없는 컴퓨터에서 파일을 검사해야 할 경우에 유용합니다.
HEX-Editor를 사용할 수있는 경우 PE Signature의 오프셋은 offset에 0x3C
있습니다. 서명은 PE\0\0
Little Endian에서 문자 "P"및 "E"뒤에 2 개의 널 바이트가 뒤 따릅니다.
관련 값은 0x8664
x64 실행 파일과 0x14c
x86에 대한 것입니다. 더 많은 가능한 값이 있지만 아마도 이러한 값을 얻지 못하거나 Windows PC에서 이러한 실행 파일을 실행할 수 없습니다.
시스템 유형의 전체 목록과 나머지 .exe 사양은 Microsoft PE 및 COFF 사양 시스템 유형 섹션 에서 찾을 수 있습니다 .
Microsoft PE and COFF Specification
. 이것은 문서화 된 계약서와 PE 헤더의 정확한 주소를 찾는 방법에 대한 지침입니다. 모든 .exe
파일에서. Microsoft 자체 실행 파일 형식에 대한 Microsoft의 공식 사양보다 신뢰할 수있는 출처가 있다면 그것이 무엇인지 알고 싶습니다.
이 SDK 도구 dumpbin.exe
과 /headers
옵션은이 정보를,이 두 (I 키 정보 굵은 추가 한) 비교를 포함
PS [64] E : \ # 4> 덤프 빈 / headers C : \ Windows \ system32 \ cmd.exe Microsoft (R) COFF / PE 덤퍼 버전 10.00.40219.01 저작권 (C) Microsoft Corporation. 판권 소유. 파일 C : \ Windows \ system32 \ cmd.exe의 덤프 PE 서명 발견 파일 유형 : EXECUTABLE IMAGE 파일 헤더 값 8664 기계 (x64) 6 개의 섹션 4CE798E5 타임 스탬프 토요일 11 월 20 일 09:46:13 2010 기호 테이블에 대한 0 파일 포인터 0 개의 기호 옵션 헤더의 F0 크기 22 특성 실행 가능 응용 프로그램은 큰 (> 2GB) 주소를 처리 할 수 있습니다 [...]
과
PS [64] E : \ # 5> 덤프 빈 / headers C : \ Windows \ syswow64 \ cmd.exe Microsoft (R) COFF / PE 덤퍼 버전 10.00.40219.01 저작권 (C) Microsoft Corporation. 판권 소유. 파일 C : \ Windows \ syswow64 \ cmd.exe 덤프 PE 서명 발견 파일 유형 : EXECUTABLE IMAGE 파일 헤더 값 14C 머신 (x86) 섹션 수 4CE78E2B 타임 스탬프 토요일 11 월 20 일 09:00:27 2010 기호 테이블에 대한 0 파일 포인터 0 개의 기호 옵션 헤더의 E0 크기 102 특성 실행 가능 32 비트 워드 머신 [...]
dumpbin /headers | findstr "machine"
때 QA가 찾고있는 것을 쉽게
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
전체 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
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 실행 파일을 구별하며 어느 것이 어느 것인지 분명합니다.
MZ
대신에 실행 파일 이 PE
있습니까?
간단한 방법은 실행하고 (신뢰한다고 가정) 작업 관리자의 프로세스 탭을 살펴 보는 것입니다. 32 비트 프로세스는 프로세스 이름 끝에 "* 32"를 표시합니다. 컴퓨터에서 기꺼이 실행하려는 것이 아닌 경우 EXE 탐색기를 사용해보십시오 . 32 또는 64 비트인지 여부를 포함하여 실행 파일에 대한 모든 정보를 보여줍니다.
main
진입 점이 없으므로 독립 프로세스로 실행되지 않습니다. 로드 될 때 호출되는 초기화 함수가 있지만 "메인"이 아닙니다.
많은 사람들이 훌륭한 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
file
내부 에 구현 이 포함 되어 있습니까?
64 비트 버전의 Process Explorer 가 알려줄 수 있습니다. 실행 파일을 실행하고 프로세스의 속성 창을 열기 만하면됩니다. 기본 탭에는 "Image : 32 Bit"또는 "Image : 64 Bit"라는 항목이 있습니다.
Simply run the executable
프로그램 을 실행 하지 않으려면 어떻게해야 합니까?
가장 간단한 방법 (데이터가 기밀이 아닌 경우)
나는 것을 발견 Virustotal은 File detail
바이너리 32 비트 또는 64 비트인지 확인하는 가장 간단한 방법입니다.
이 Additional information
옵션은 파일에 대한 유용한 정보를 제공합니다.
실행 파일을 실행하고 프로세스 탐색기 또는 유사한 도구를 체크인하는 방법에는 몇 가지 명백한 단점이 있습니다.
Dumpbin.exe 방법은 아마도 목적을 해결할 수 있습니다.
또 다른 대안은 cygwin의 파일 명령 을 사용하는 것 입니다. 그러나 Windows에서 테스트하지 않았습니다. Linux에서 잘 작동합니다.
Usage: file program_under_test.exe
편집 : 방금 창에서 file.exe를 테스트했습니다. 잘 작동합니다. :)
cygwin
패키지를 설치하지 않으려는 사람들 은 gnuwin32 file
패키지를 얻을 수 있습니다 .
file
디스크에서 이진 형식으로 데이터를 읽고 데이터베이스와 비교하여 데이터를 식별하는 모든 마법의 숫자를 확인합니다. Windows의 32 비트 프로그램은 PE32로, 64 비트 및 .NET 프로그램은 PE32 +로 나타납니다. file
32 비트 및 64 비트 응용 프로그램 모두 디스크에서 데이터를 읽을 수 있으므로 필요한 비트만으로도 비트 자체의 차이는 전혀 없습니다.
다음은 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
$stream.dispose();
닫은 후에 추가 할 수 있습니까? 파일 핸들을 해제해야합니다. ( stackoverflow.com/questions/1999858/… )
예를 들어 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 비트로 실행할 수 있지만 64 비트 프로세스로로드되지 않으면 32 비트로 실행되는 실행 파일의 경우 :
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
)
Windows 7의 경우 Windows 탐색기에서 실행 파일을 마우스 오른쪽 단추로 클릭하고 특성을 선택하십시오. 속성 창에서 호환성 탭을 선택하십시오. 호환성 모드 섹션에 Windows XP가 표시되면 32 비트 실행 파일입니다. Windows Vista가 표시되면 64 비트입니다.
Windows 8
Windows XP SP2
되지만 일부는 Vista
또는로 표시됩니다 Windows 8
. 따라서이 방법은 올바르지 않습니다.
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 서명을 읽고 결과를 표시합니다.
레지스트리를 조작 할 수 없거나 변경하고 싶지 않은 경우 QuickLaunch 막대에서 .vbs 파일을 복사하고 실행 파일을 드래그하십시오.
나는 이것을 언급하지 않았습니다. 이 정보를 제공 할 수있는 NTCore의 CFF Explorer라는 PE 뷰어 프로그램 이 있습니다. 휴대용으로 다운로드하여 실행할 수 있지만 원하는 경우 설치할 수도 있습니다.
바이너리 ( .exe
, .dll
등)를 마우스 오른쪽 버튼으로 클릭 하고 "CFF 탐색기로 열기"를 선택하십시오. Nt 헤더로 이동-> 파일 헤더-> "특성"필드에서 "여기를 클릭하십시오"를 클릭하십시오.
32 비트 프로그램 인 경우 "32 비트 워드 머신"확인란이 선택됩니다. 예를 들어 아래 이미지에서 볼 수 있듯이 32 비트 버전의 Notepad ++를 설치했습니다. 그렇지 않으면 64 비트입니다.
내 두 센트 : C ++ 개발자로서 종속성 워커 ( http://www.dependencywalker.com/ )는 64/32 비트뿐만 아니라 관련된 모든 Dll을 표시하는 매우 유익합니다.
모든 파일 이름 왼쪽에 64가 표시됩니다 ...