Windowsでバイナリが32ビットか64ビットかを確認する簡単な方法はありますか?プログラムを32ビットマシンに移動して、重大な障害が発生する前に確認する必要があります。
Windowsでバイナリが32ビットか64ビットかを確認する簡単な方法はありますか?プログラムを32ビットマシンに移動して、重大な障害が発生する前に確認する必要があります。
回答:
リチャードの答えからヘッダー値を調べた後、高速で簡単で、テキストエディターのみを必要とするソリューションを思い付きました。Windowsのデフォルトのnotepad.exeでも動作します。
テキストエディターで実行可能ファイルを開きます。Open...
WindowsではOpen with...
実行可能ファイルのコンテキストメニューにオプションが表示されないため、ドラッグアンドドロップするか、エディターのダイアログを使用する必要があります。
の最初の出現後の最初の印刷可能文字を確認しPE
ます。この部分は、少なくともいくつかの空白に囲まれている可能性が高いため(多くの場合)、視覚的に簡単に行うことができます。
ここにあなたが見つけようとしているものがあります:
PE L
PE d†
警告:大きなファイルでデフォルトのメモ帳を使用すると、非常に遅くなる可能性があるため、1メガバイト以上のファイルには使用しないでください。私の場合、12 MiBファイルを表示するには約30秒かかりました。ただし、Notepad ++は、120 MiBの実行可能ファイルをほぼ瞬時に表示できました。
これは、追加のソフトウェアをインストールできないマシン上のファイルを検査する必要がある場合に役立つソリューションです。
HEX-Editorを使用できる場合、PE Signatureのオフセットはoffsetにあり0x3C
ます。署名はPE\0\0
(「P」と「E」の後に2つのヌルバイトが続く)、その後にリトルエンディアンの2バイトのマシンタイプが続きます。
関連する値は0x8664
、x64実行可能ファイルおよび0x14c
x86用です。より多くの可能な値がありますが、これらのいずれにも遭遇することはおそらくないでしょうし、Windows PCでそのような実行可能ファイルを実行することもできません。
マシンタイプの完全なリストは、残りの.exe仕様とともに、Microsoft PEおよびCOFF仕様の マシンタイプのセクションにあります。
Microsoft PE and COFF Specification
が表示されます。任意の.exe
ファイル内。マイクロソフト独自の実行可能形式に関するマイクロソフトの公式仕様よりも信頼できるソースがある場合は、それが何であるかを知りたいと思います。
オプション付きのSDKツールにはこの情報が含まれてdumpbin.exe
おり、/headers
これら2つを比較します(主要な情報に太字を追加しました)
PS [64] E:\#4> dumpbin / headers C:\ Windows \ system32 \ cmd.exe Microsoft(R)COFF / PE Dumperバージョン10.00.40219.01 著作権(C)Microsoft Corporation。全著作権所有。 ファイルC:\ Windows \ system32 \ cmd.exeのダンプ PE署名が見つかりました ファイルの種類:EXECUTABLE IMAGE ファイルヘッダー値 8664マシン(x64) 6つのセクション 4CE798E5日時スタンプ2010年11月20日土曜日09:46:13 シンボルテーブルへの0ファイルポインター 0個のシンボル オプションのヘッダーのF0サイズ 22の特徴 実行可能 アプリケーションは大きな(> 2GB)アドレスを処理できます [...]
そして
PS [64] E:\#5> dumpbin / headers C:\ Windows \ syswow64 \ cmd.exe Microsoft(R)COFF / PE Dumperバージョン10.00.40219.01 著作権(C)Microsoft Corporation。全著作権所有。 ファイルC:\ Windows \ syswow64 \ cmd.exeのダンプ PE署名が見つかりました ファイルの種類:EXECUTABLE IMAGE ファイルヘッダー値 14Cマシン(x86) 4つのセクション 4CE78E2B時刻日付スタンプ2010年11月20日09:00:27 シンボルテーブルへの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 Explorerを試してください。32ビットか64ビットかなど、実行可能ファイルに関する情報がすべて表示されます。
main
エントリポイントがないため、スタンドアロンプロセスとして実行されません。ロードされたときに呼び出される初期化関数がありますが、それは「メイン」ではありません。
多くの人が優れた7-zipをインストールしており、7-Zipフォルダーをに追加していPATH
ます。7-zipは、MSIファイルやPE実行可能ファイルなど、ZIPおよびRAR以外のファイル形式を認識します。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ビットバージョンのプロセスエクスプローラーで確認できます。実行可能ファイルを実行して、プロセスのプロパティウィンドウを開きます。メインタブには、「Image:32 Bit」または「Image:64 Bit」というエントリがあります。
Simply run the executable
そして、プログラムを実行したくない場合はどうなりますか?
最も簡単な方法(データが機密でない場合)
私はそれを見つけるVirustotalは File detail
バイナリが32ビットまたは64ビットであるかどうかを確認する最も簡単な方法です。
このAdditional information
オプションはさらに、ファイルに関する非常に役立つ情報を提供します。
実行可能ファイルを実行してからプロセスエクスプローラーまたは同様のツールをチェックインする方法には、明らかな欠点がいくつかあります。
Dumpbin.exeメソッドは、おそらく目的を解決できます。
別の選択肢は、cygwinのfileコマンドを使用することです。ただし、Windowsではテストしていません。Linuxでうまく機能します。
Usage: file program_under_test.exe
編集:ウィンドウでfile.exeをテストしました。正常に動作します。:)
file
単にバイナリ形式でディスクからデータを読み取り、それらを識別するマジックナンバーをチェックして、データベースと比較します。Windowsの32ビットプログラムはPE32として登場し、64ビットプログラムと.NETプログラムは両方ともPE32 +として登場します。file
それ自体のビットネスは、絶対にゼロの違いを生みます-32 ビットと64ビットの両方のアプリケーションは、ディスクからデータを読み取ることができます。
ここに、Powershellソリューションがあります。外部の依存関係などはありません。Powershellを開き、そこに関数を貼り付けて(Enterキーを2回押してプロンプトに戻ります)、関数の下の例のように使用します。
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
)
mingwのmsysバンドルfile
内からツールを使用することもできます。unixコマンドのように機能します。GNUwin32のツールでも同様に機能します。file
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 Explorerで開く」を選択します。Ntヘッダーに移動->ファイルヘッダー-> [特性]フィールドで[ここをクリック]をクリックします
32ビットプログラムの場合、チェックボックス「32ビットワードマシン」にチェックマークが付きます。たとえば、以下の画像に示すように、32ビットバージョンのNotepad ++をインストールしました。それ以外の場合は、64ビットです。
.DMP
、Visual Studioでダンプを開きます私の2セント:C ++開発者として、依存関係ウォーカー(http://www.dependencywalker.com/)は非常に有益で、64/32ビットだけでなく、関連するすべてのDllも表示します。
あなたはすべてのファイル名の左側に64を見ることができます...