我怎么可以测试一个窗DLL文件,以确定它是否是32位或64位?[重复]

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

  •  20-08-2019
  •  | 
  •  

这个问题已经有一个答案在这里:

我想写一个测试脚本或节目声称,所有DLL文件中给出的目录是一个特别建立的类型。

我会用这个作为一个理智的检查结束时建立进程上的一个SDK,以确保64位的版本,并没有某种程度上得到了一些32-bit DLL的文件,反之亦然。

是有一个简单的方法来看DLL文件并确定其类型?

该解决方案应该在两个工作xp32和xp64.

有帮助吗?

解决方案

血腥的细节

DLL使用PE可执行的格式,这还不算太难以读出这些信息的文件。

看看这个 MSDN条PE文件的格式 对于一个概述。你需要读MS-DOS头,然后读取 IMAGE_NT_HEADERS 结构。这包含的 IMAGE_FILE_HEADER 结构,其中包含的信息,你需要机器的成员,其中包含以下一个值

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

这一信息应在一个固定的抵消的文件,但我仍然建议通过文件和检查的签名MS-DOS头和IMAGE_NT_HEADERS可以肯定的是你应付的任何未来的变化。

使用ImageHelp读的头...

你也可以使用 ImageHelp API 要做到这一负荷的DLL LoadImage 你会得到一个 LOADED_IMAGE 结构,该结构将包含一个指向一个IMAGE_NT_HEADERS结构。释放LOADED_IMAGE与ImageUnload.

...或者适应这种粗糙的Perl脚本

这是粗糙Perl脚本,这能够完成任务。它检查,该文件有DOS头,然后读取PE偏离IMAGE_DOS_HEADER60字节的文件。

然后它寻求开始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);

其他提示

一个粗暴的方式就是呼叫dumpbin与标题的选择从Visual Studio工具,在各个DLL,并寻找适当的输出:

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)

你可以看到几个线索在这输出,这是一个32位问题,包括14C值,保罗提及。应该可以很容易地寻找在一个脚本。

如果你有 Cygwin 安装的(而我强烈建议由于各种原因),可以使用'文件'实用程序的DLL

file <filename>

这将得出这样的:

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

依赖Walker告诉所有(以及几乎).http://www.dependencywalker.com/

它没有"安装"-只要得到它,提取它和运行exec.它适用于任何x32或64windows模块|应用程序。

我记得这是相当简单的看到所有依赖性,即dll模块,并由于appl.是一笔依赖一个可以确定如果它是全64,x32(86)或位的每一个。

类型的CPU,该模块是建立在"CPU"一栏。大多数的64位aps仍然是一个位每但是32位ap w/b所有x86。

美丽的程序的怪才/程序员,它是免费的...

我已经写了一个非常简单的工具,正是这么做的-这是被称为PE拆解.

简单地火并载DLL文件:

enter image description here

在上面的例子,载DLL是32位。

你可以在这里下载(I只有64位版本编制ATM):
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