web-dev-qa-db-ja.com

Windowsでバイナリーが32ビットか64ビットかを確認する方法

Windowsでバイナリが32ビットか64ビットかを確認する簡単な方法はありますか?プログラムを32ビットマシンに移行して壮大な失敗を経験する前に、私はチェックする必要があります。

303
Septagram

Richardの答え からヘッダー値を調べた後、私は速くて簡単で、テキストエディタだけを必要とする解決策を思いつきました。 Windowsのデフォルトのnotepad.exeでも動作します。

  1. 実行ファイルをテキストエディタで開きます。 Windowsは実行可能ファイルのコンテキストメニューにOpen...オプションを表示しないため、ドラッグアンドドロップするか、エディタのOpen with...ダイアログを使用する必要があります。

  2. PEが最初に出現した後の最初の印刷可能文字を確認してください。この部分は、少なくともいくつかの空白で囲まれている可能性が最も高いので(それが多い場合もあります)、視覚的に簡単に行うことができます。

これがあなたが見つけようとしているものです:

x86:

PE  L

x 64:

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の仕様にあります。 セクション。

320
Alexander Revo

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ビットワードマシン
 [...] 
117
Richard

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
43
briantist

私は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の実行ファイルを区別しますが、どちらがどれであるかも明らかです。

37
wmassingham

簡単な方法はそれを実行し(あなたがそれを信頼していると仮定して)タスクマネージャのプロセスタブを見てみることです。 32ビットプロセスでは、プロセス名の最後に "* 32"が表示されます。それがあなたのコンピュータ上で実行しても構わないと思っている場合は、 EXEエクスプローラ を試すことができます。それが32または64ビットであるかどうかを含む実行可能ファイルに関する情報の全体の束を示します。

30
Dracs

多くの人が優れた 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
23
Lumi

64ビットバージョンの Process Explorer でわかります。実行ファイルを実行してプロセスのプロパティウィンドウを開くだけです。メインタブに「Image:32 Bit」または「Image:64 Bit」というエントリがあります。

enter image description here

18
Andrew Lambert

最も簡単な方法(データが機密ではない場合)

VirustotalFile detailがバイナリが32ビットか64ビットかを調べる最も簡単な方法です。

Additional informationオプションは、ファイルに関する多くの役に立つ情報をさらに提供します。

Virustotal analysis


[Virustotal TrID

14
marsh-wiggle

実行可能ファイルを実行してからエクスプローラなどのツールをチェックインする方法には、明らかな欠点がいくつかあります。

  1. プロセスを実行する必要があります。
  2. 寿命が短いプロセス(echo hello world型など)では、プロセスエクスプローラは新しいプロセスが開始されたことさえ登録しないかもしれません。

Dumpbin.exeメソッドはおそらく目的を解決することができます。

他の方法はcygwinのfileコマンドを使うことです。しかし、私はWindows上でそれをテストしていません。それはLinux上でうまく動作します。

Usage: file program_under_test.exe

編集:ちょうどウィンドウ上でfile.exeをテストしました。正常に動作します。 :)

13
anishsane

これが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
11
megamorf

たとえば、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
6
BlueMonkMN

mingwの msysバンドル 内からfileツールを使用することもできます。 unixコマンドのように機能します。同様のことが GNUwin32fileツールにも当てはまります。

4
Bastian Ebeling

Windows 7をお使いの場合は、Windowsエクスプローラで、実行ファイルを右クリックして[プロパティ]を選択します。プロパティウィンドウで[互換性]タブを選択します。互換モードのセクションにWindows XPが表示されている場合、これは32ビットの実行ファイルです。あなたがWindows Vistaを見れば、それは64ビットです。

3
axxis

コンテキストメニューに32/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
jumpjack

私の2セントは、単に dependency walker をダウンロードして、アーキテクチャが実行可能ファイルの1つで使用されているものを確認することです。

どうやって使うのですか:

単にアプリをダウンロードして起動し、開いたアイコンをクリックしてください。* * .exeファイルを検索してください。 x 64)

実行可能ファイルを開いてビルドアーキテクチャを確認する

dependency walker screenshot

2
stenly

Windows 10のタスクマネージャーのプラットフォーム列

Windows 7にはプラットフォーム列がありません。そのため、Windows 7タスクマネージャーでは表示されません。

Windows 10では、列を選択することは「表示」ではなくなりました。 Windows 10では、詳細タブで列ヘッダーを右クリックしてから「列を選択」します。次に、「プラットフォーム」のチェックボックスをオンにします。

enter image description here

enter image description here

0
barlop
  • アプリケーションを実行する
  • タスクマネージャを開く
  • 右クリックしてダンプファイルを作成する
  • パスを書き留めます
  • パスに移動し、Visual Studioで.DMP dumpを開きます。
  • そこにあなたはすべての詳細を得ます
  • プロセスアーキテクチャの確認
0
user429538

私はこれが言及されているのを見たことがない。この情報を提供できる NTCore によるCFF Explorerと呼ばれるPEビューアプログラムがあります。ダウンロードしてポータブルとして実行することもできますが、必要に応じてインストールすることもできます。

バイナリ(.exe.dllなど)を右クリックして[Open with CFF Explorer]を選択します。 Ntヘッダ - >ファイルヘッダ - > "特性"欄で "ここをクリック"をクリック

32ビットプログラムの場合は、[32ビットワードマシン]チェックボックスがオンになります。たとえば、下の図に示すように、32ビット版のNotepad ++をインストールしました。それ以外の場合は64ビットです。

enter image description here

0
Nikos

それでも、 WSLfileコマンドは非常にうまく機能します。

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
0
Bohr

私の2セント:C++開発者として、依存関係ウォーカー( http://www.dependencywalker.com/ )は非常に有益であり、64/64を表示するだけではありません。 32ビットだけでなく、すべてのDllが関係していました: enter image description here

すべてのファイル名の左側に64が表示されます。

0
ingconti