pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


Windows向けのEXEやDLLが、32bitなのか64bitなのかを調べる方法をいくつか考えてみる

アプリケーションとDLLのビット数が合わないと動かないので、確認方法を把握したいと思った

あるツールのビット数と、そのツールが使うDLLのビット数が合っていないことに気づかず、意外に手間取理ました。そこで EXE や DLL のビット数の確認方法を考察してみることにした。

とりあえず見つけた方法はこんなところ。

  • dumpbinコマンドで見る
  • バイナリを直接見る
  • fileコマンドで見る
  • 7zip のコマンドラインツールを使う

この中では、自分の環境では file コマンドでチェックするのが最もよさげ。

dumpbin コマンドで見る

Visual Studio に含まれる dumpbin.exe で見れるらしい。

こんなふうに実行すると、x64 or x86 という情報が出るらしい。

dumpbin.exe /headers ファイル名 | findstr machine

でも、自分の環境には Visual Studio を入れていないので、この方法は取れない。

直接見る

0x80 前後に以下のようなデータの並びを探せばよいそうです。

50 45 00 00 4C 01 = 32bit
50 45 00 00 64 86 = 64bit

うん、わかった。でもちょっとめんどくさい。だけど、データサイスの小さいバイナリなら、notepad や command prompt で more コマンドを使ってこんなふうに上記のデータを探せます。そう考えると、これはこれで追加のツールをインストールできない環境では悪くない方法です。

32-bit の場合

f:id:pslabo:20200713202510p:plain f:id:pslabo:20200713202810p:plain

64-bit の場合

f:id:pslabo:20200713202410p:plain f:id:pslabo:20200713202741p:plain

file コマンドで見る

macOS, Ubuntu, CentOS, cygwin などに含まれる GNU file コマンドを使えば容易に確認できます。Windows 10 で WSL を入れていれば file コマンドが利用可能です。

EXEはこんなふうに示される。

$ file System32/net.exe SysWOW64/net.exe
System32/net.exe: PE32+ executable (console) x86-64, for MS Windows
SysWOW64/net.exe: PE32 executable (console) Intel 80386, for MS Windows

DLLも、こんなふうに示される。

$ file System32/winusb.dll SysWOW64/winusb.dll
System32/winusb.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
SysWOW64/winusb.dll: PE32 executable (DLL) (console) Intel 80386, for MS Windows

file コマンドはさまざまなファイルのフォーマット判定に利用できるから、これが最も汎用性が高い。

7zコマンドを使用する

7-zip をインストール済みの場合は 7z.exe l some.exe | findstr CPU のように実行すると "CPU = x86" または "CPU = x64" という結果が取得できるそうです。

実際にやってみると、ごらんのとおり。

C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\system32\cmd.exe | findstr CPU
CPU = x64

C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\syswow64\cmd.exe | findstr CPU
CPU = x86

C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\system32\winusb.dll | findstr CPU
CPU = x64

C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\syswow64\winusb.dll | findstr CPU
CPU = x86

まとめてみると、調べ方はこんなかんじです。

  • 自分の Windows 10 環境では WSLで Ubuntu を入れているので、file コマンドが一番ラクだということがわかりました

  • WSLがなく 7zip が利用可能 or インストール可能なら 7zip を使う

  • WSL がなく、7zip もインストールできないようなら、バイナリを直接見て"PE L" or "PE d" を探す