Windowsでバイナリが32ビットか64ビットかを確認する簡単な方法はありますか?プログラムを32ビットマシンに移行して壮大な失敗を経験する前に、私はチェックする必要があります。
Richardの答え からヘッダー値を調べた後、私は速くて簡単で、テキストエディタだけを必要とする解決策を思いつきました。 Windowsのデフォルトのnotepad.exeでも動作します。
実行ファイルをテキストエディタで開きます。 Windowsは実行可能ファイルのコンテキストメニューにOpen...
オプションを表示しないため、ドラッグアンドドロップするか、エディタのOpen with...
ダイアログを使用する必要があります。
PE
が最初に出現した後の最初の印刷可能文字を確認してください。この部分は、少なくともいくつかの空白で囲まれている可能性が最も高いので(それが多い場合もあります)、視覚的に簡単に行うことができます。
これがあなたが見つけようとしているものです:
PE L
PE d†
警告の言葉:大きなファイルにデフォルトのメモ帳を使用すると非常に遅くなる可能性があるので、1メガバイトまたは2、3より大きいファイルには使用しないでください。私の場合、12 MiBファイルを表示するのに約30秒かかりました。しかし、Notepad ++は、ほぼ即座に120 MiBの実行ファイルを表示することができました。
これは、追加のソフトウェアをインストールできないマシン上のファイルを調べる必要がある場合に便利な解決策です。
使用可能なHEXエディタがある場合、PE署名のオフセットはoffset 0x3C
にあります。シグネチャはPE\0\0
(文字 "P"と "E"の後に2つのnullバイトが続く)、続いてリトルエンディアンの2バイトのマシンタイプです。
関連する値は、x64実行可能ファイルの場合は0x8664
、x86の場合は0x14c
です。もっとたくさんの可能な値があります、しかし、あなたはこれらのうちのどれにも遭遇することはおそらくないでしょう、あるいはあなたのウィンドウズPCの上でそのような実行可能ファイルを実行することができるでしょう。
残りの.exe仕様とともに、マシンタイプの完全なリストは、 Microsoft PEおよびCOFFの仕様にあります。 セクション。
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)マイクロソフトコーポレーション。 ファイルのダンプC:\ Windows\system32\cmd.exe PE署名が見つかりました ファイルの種類:EXECUTABLE IMAGE ファイルヘッダー値 8664マシン(x 64) 6個のセクション 4CE798E5タイム・日付・スタンプSat Nov 20 09:46:13 2010 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)マイクロソフトコーポレーション。 ファイルC:\ Windows\syswow 64\cmd.exeのダンプ PE署名が見つかった ファイルの種類:EXECUTABLE IMAGE ファイルヘッダー値 14Cマシン(x86) 4つのセクション 4CE78E2Bタイム・スタンプ日付11月20日09:00:27 2010 0シンボル・テーブルへのファイル・ポインタ 0個のシンボルの数[.____ E0サイズのオプションヘッダー 102の特性 実行可能ファイル 32ビットワードマシン [...]
Windows SDKまたはVisual Studio全体を所有していない、または必要としない場合は、SysInternalsの sigcheck.exe
を使用できます 。
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の実行ファイルを区別しますが、どちらがどれであるかも明らかです。
簡単な方法はそれを実行し(あなたがそれを信頼していると仮定して)タスクマネージャのプロセスタブを見てみることです。 32ビットプロセスでは、プロセス名の最後に "* 32"が表示されます。それがあなたのコンピュータ上で実行しても構わないと思っている場合は、 EXEエクスプローラ を試すことができます。それが32または64ビットであるかどうかを含む実行可能ファイルに関する情報の全体の束を示します。
多くの人が優れた 7-Zip をインストールしており、7-ZipフォルダをPATH
に追加しています。 7-Zipは、MSIファイルやPE実行可能ファイルなど、ZipおよびRAR以外のファイル形式を認識します。問題のPEファイル(ExeまたはDLL)にコマンドライン7z.exe
を使用するだけです。
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
64ビットバージョンの Process Explorer でわかります。実行ファイルを実行してプロセスのプロパティウィンドウを開くだけです。メインタブに「Image:32 Bit」または「Image:64 Bit」というエントリがあります。
最も簡単な方法(データが機密ではない場合)
VirustotalFile detail
がバイナリが32ビットか64ビットかを調べる最も簡単な方法です。
Additional information
オプションは、ファイルに関する多くの役に立つ情報をさらに提供します。
実行可能ファイルを実行してからエクスプローラなどのツールをチェックインする方法には、明らかな欠点がいくつかあります。
Dumpbin.exeメソッドはおそらく目的を解決することができます。
他の方法はcygwinのfileコマンドを使うことです。しかし、私はWindows上でそれをテストしていません。それはLinux上でうまく動作します。
Usage: file program_under_test.exe
編集:ちょうどウィンドウ上でfile.exeをテストしました。正常に動作します。 :)
これが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
たとえば、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
Windows 7をお使いの場合は、Windowsエクスプローラで、実行ファイルを右クリックして[プロパティ]を選択します。プロパティウィンドウで[互換性]タブを選択します。互換モードのセクションにWindows XPが表示されている場合、これは32ビットの実行ファイルです。あなたがWindows Vistaを見れば、それは64ビットです。
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ファイルをダブルクリックします。新しいキーがウィンドウズのレジストリに追加されます。
[HKEY_CLASSES_ROOT\exefile\Shell\command32_64\command]
実行可能ファイルを右クリックすると、コンテキストメニューに「32/64ビットテスト」と表示されます。
項目をクリックすると、VB署名ファイルc:\\temp\\x86TestStart.bat\
を起動するバッチファイルx86or64.vbs
が起動されます。このファイルはexe署名を読み取り結果を表示します。
レジストリを改ざんできない、または改ざんしたくない場合は、QuickLaunchバーにある.vbsファイルをコピーし、その上に実行ファイルをドラッグします。
私の2セントは、単に dependency walker をダウンロードして、アーキテクチャが実行可能ファイルの1つで使用されているものを確認することです。
単にアプリをダウンロードして起動し、開いたアイコンをクリックしてください。* * .exeファイルを検索してください。 x 64)
実行可能ファイルを開いてビルドアーキテクチャを確認する
.DMP
dumpを開きます。私はこれが言及されているのを見たことがない。この情報を提供できる NTCore によるCFF Explorerと呼ばれるPEビューアプログラムがあります。ダウンロードしてポータブルとして実行することもできますが、必要に応じてインストールすることもできます。
バイナリ(.exe
、.dll
など)を右クリックして[Open with CFF Explorer]を選択します。 Ntヘッダ - >ファイルヘッダ - > "特性"欄で "ここをクリック"をクリック
32ビットプログラムの場合は、[32ビットワードマシン]チェックボックスがオンになります。たとえば、下の図に示すように、32ビット版のNotepad ++をインストールしました。それ以外の場合は64ビットです。
それでも、 WSL のfile
コマンドは非常にうまく機能します。
file /mnt/c/p/bin/rg.exe
は次のように出力されます。
/mnt/c/p/bin/rg.exe: PE32+ executable (console) x86-64, for MS Windows
file /mnt/c/p/bin/u.exe
は次のように出力されます。
/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
私の2セント:C++開発者として、依存関係ウォーカー( http://www.dependencywalker.com/ )は非常に有益であり、64/64を表示するだけではありません。 32ビットだけでなく、すべてのDllが関係していました:
すべてのファイル名の左側に64が表示されます。