misc.log

日常茶飯事とお仕事と

Windowsアプリが32bitか64bitか判定する方法

Windowsで動く、実行形式のファイル、拡張子が「.exe」になっている、いわゆる「アプリ」ですが、アプリが作られた際の方式(アーキテクチャ)の違いにより、32bitアプリや64bitアプリといった種類が存在します。しかし、Windows Explorerで見ても、デスクトップなどのアイコンを見ても、それが32bitか64bitかは判断できません。

ここでは、アプリ自体の中身を調べて32bitか64bitかを判断する方法の一例を紹介します。なお、詳しいツールの使い方などについての説明は行いません。ある程度、プログラム開発やシステム開発などに携わってIT系の知識がある人を前提とさせていただきます。

バイナリーエディタでPEヘッダーを見る

実行形式ファイル(以下EXEファイルと略記)をバイナリーエディタで確認すると、ファイルの冒頭、アドレスにして「0x100~0x200」のあたりに、「50 45」で始まるブロックがあります。ASCII表示だと「P E」となるこの部分、ファイルの特徴等について記述されたPEヘッダー*1と呼ばれるエリアです。この「P E」のすぐうしろを見てください。この部分が下記のどちらかで、32bit、64bitの判定が可能です。

  • 4C 01 …… 32bitアプリケーション
  • 64 86 …… 64bitアプリケーション
64bitアプリケーション「Diablo IV」のPEヘッダー部分

(無理矢理)テキストエディターで見る

バイナリーエディターを使った方法を紹介しましたが、少々無理矢理ではあるものの、テキストエディターを使っても同様の事ができます。下図は、32bitアプリケーションである「Excel.exe」を、Windows標準のメモ帳で開いてみたところです。上の方に「PE」という文字があり、その後ろに「L」と書かれています。この部分の文字で、以下のように判別が可能です。

  • 「PE・・L」…… 32bitアプリケーション
  • 「PE・・d」…… 64bitアプリケーション
32bitアプリケーション「Excel」をメモ帳で開いたところ

冒頭に書いたDiablo IVの場合と同じように、バイナリーエディターで見た様子は下記の通り。右の「Decoded Text」のところが「PE・・L」になっているのが分かるかと思います。

32bitアプリケーション「Excel」をバイナリーエディターで開いたところ

判別に使っている情報の正体

この判別に使っている「PE」という文字に連なる「4C 01」や「64 86」といった情報の正体ですが、WindowsのEXEファイルに含まれる「PEヘッダー」と呼ばれる情報のうち「IMAGE_FILE_MACHINE」と呼ばれる、EXEファイルが動くコンピューターの種類を指定する情報です。これはマイクロソフトによってルールが定められており、今巷に出回っているIntelやAMDといったメーカーのCPU以外にも、様々なCPUで動くコンピューターに対応できるよう、いろんな種類が定義されています。以下に一例を示します。

IMAGE_FILE定数の種類(抜粋)
  • IMAGE_FILE_MACHINE_I386(インテル/AMD 32bit CPU用) …… 0x014C
  • IMAGE_FILE_MACHINE_AMND64(インテル/AMD 64bit CPU用)…… 0x8664
  • IMAGE_FILE_MACHINE_ARM(ARM製CPU用)…… 0x01C0
  • IMAGE_FILE_MACHINE_POWERPC(古いApple社CPU用)…… 0x01F0
  • IMAGE_FILE_MACHINE_R4000(MIPS R4000用)…… 0x0166

詳しくは、下記サイトに列挙されています。
learn.microsoft.com

上記の「IMAGE_FILE_MACHINE_I386」の値「014C」を見て、冒頭に書いた『32bitならば「4C 01」』と違うじゃないかと思われるかもしれません。これは、コンピューターの中にはデータの上位桁と下位桁を交換して保持する「リトルエンディアン」と呼ばれる方式のものがあるためです。Windowsなどが動いている、市販のパソコンで使われるインテルやAMD社のCPUは、このリトルエンディアン方式を採用しており、データを書き込んだり取り扱ったりする際に1バイト(16進数ならば2桁分)ずつ、上下を入れ替えて保存します。そのため、Windowsなどで使われているEXEファイルの中身も、値を保存する部分についは上下が逆転した形で保存されており、マイクロソフトのルールでは「01 4C」であっても、実際のファイルの中身は「4C 01」になっています。

参考情報

Win32 API IMAGE_FILE_HEADER構造体

ファイル情報を取得するAPIで扱う構造体の定義情報です。この中のメンバー「Machine」の内容が、前述の「IMAGE_FILE_MACHINE……」になります。
learn.microsoft.com

IMAGE_FILE_MACHINEイメージファイルマシン定数

learn.microsoft.com

アーキテクチャ判別ツール(HEROUSE PE Header Reader)

こういうツールを作って下さっている方もいらっしゃいます。お手軽に調べるならこういうものを使うのも手です。
www.vector.co.jp

*1:PE: Portable Executable の略