Windows DLL ファイルをテストして、32 ビットか 64 ビットかを判断するにはどうすればよいですか?[重複]

StackOverflow https://stackoverflow.com/questions/495244

  •  20-08-2019
  •  | 
  •  

質問

指定されたディレクトリ内のすべての DLL ファイルが特定のビルド タイプであることを確認するテスト スクリプトまたはプログラムを作成したいと考えています。

これを SDK のビルド プロセスの最後に健全性チェックとして使用し、64 ビット バージョンに 32 ビット DLL ファイルが何らかの形で組み込まれていないこと、またはその逆のことを確認します。

DLL ファイルを調べてその種類を判断する簡単な方法はありますか?

このソリューションは xp32 と xp64 の両方で動作するはずです。

役に立ちましたか?

解決

悲惨な詳細

DLL は PE 実行可能形式を使用するため、ファイルからその情報を読み取るのはそれほど難しくありません。

これを参照してください PE ファイル形式に関する MSDN 記事 概要については。MS-DOS ヘッダーを読んでから、 IMAGE_NT_HEADERS 構造。これには、 IMAGE_FILE_HEADER 次のいずれかの値を含む Machine メンバーに必要な情報を含む構造体

  • IMAGE_FILE_MACHINE_I386 (0x014c)
  • IMAGE_FILE_MACHINE_IA64 (0x0200)
  • IMAGE_FILE_MACHINE_AMD64 (0x8664)

この情報はファイル内の固定オフセットにある必要がありますが、今後の変更に確実に対応できるように、ファイルをスキャンして MS-DOS ヘッダーと IMAGE_NT_HEADERS の署名を確認することをお勧めします。

ImageHelp を使用してヘッダーを読み取ります...

を使用することもできます。 イメージヘルプ API これを行うには、DLLをロードします 画像のロード そしてあなたは LOADED_IMAGE IMAGE_NT_HEADERS 構造体へのポインタを含む構造体。ImageUnload を使用して LOADED_IMAGE の割り当てを解除します。

...または、この大まかな Perl スクリプトを適応させます

これが仕事を完了させる大まかな Perl スクリプトです。ファイルに DOS ヘッダーがあることを確認し、IMAGE_DOS_HEADER の 60 バイトから PE オフセットをファイルに読み取ります。

次に、PE 部分の先頭までシークし、署名を読み取ってチェックし、関心のある値を抽出します。

#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];

open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {

   ($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
   die("Not an executable") if ($magic ne 'MZ');

   seek(EXE,$offset,SEEK_SET);
   if (read(EXE, $pehdr, 6)){
       ($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
       die("No a PE Executable") if ($sig ne 'PE');

       if ($machine == 0x014c){
            print "i386\n";
       }
       elsif ($machine == 0x0200){
            print "IA64\n";
       }
       elsif ($machine == 0x8664){
            print "AMD64\n";
       }
       else{
            printf("Unknown machine type 0x%lx\n", $machine);
       }
   }
}

close(EXE);

他のヒント

粗製の方法は、それぞれのDLLにVisual Studioツールからヘッダオプションを指定してDUMPBINを呼び出して、適切な出力を探すことになります

dumpbin /headers my32bit.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               1 number of sections
        45499E0A time date stamp Thu Nov 02 03:28:10 2006
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)

あなたはそれがパウロが言及14C値を含む32ビットのDLLを、である出力のカップルの手がかりを見ることができます。スクリプト内で探しやすいはずです。

あなたは Cygwinのの(私は強く、様々な理由のためにお勧めしている)がインストールされている場合は、

、あなたは "を使用することができますDLL上のファイル」ユーティリティ

file <filename>

このような出力を与えることになるます:

icuuc36.dll: MS-DOS executable PE  for MS Windows (DLL) (GUI) Intel 80386 32-bit

依存関係ウォーカーは(もほぼ)すべてを伝えます。 http://www.dependencywalker.com/する

これは、それを得る、それを抽出し、幹部を実行-JUST「インストール」しません。 アプリケーション

|これは、任意のx32またはx64の窓モジュールのために動作します。 今思い出すと、

すべての依存関係、すなわちDLLモジュール、およびAPPL以降を見ることが非常に簡単です。それはフルのx64、x32の(x86の)または各々のビットであればいずれか確認することができ、依存関係の和です。

モジュールがために建てられたCPUの種類は、「CPU」の欄にあります。ほとんどの64ビットAPは依然としてすべてのx86 B / W 32ビットAPが、それぞれのビットです。

オタク/プログラマのための

美しいプログラムと、それは無料です...

私は正確にはない非常にシンプルなツールを書かれている - 。それはPEデコンストラクタと呼ばれています。

単にそれを起動し、あなたのDLLファイルをロードします:

ここに画像の説明を入力します

上記の例では、ロードされたDLLは、32ビットである。

あなたは(私は唯一のATMをコンパイルした64ビットバージョンを持っている)、ここでそれをダウンロードすることができます。
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exeする

古い32ビット版はこちら:
http://dl.dropbox.com/u/31080052/pedeconstructor.zipする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top