当前位置:  开发笔记 > 编程语言 > 正文

如何测试Windows DLL文件以确定它是32位还是64位?

如何解决《如何测试WindowsDLL文件以确定它是32位还是64位?》经验,为你挑选了5个好方法。

我想编写一个测试脚本或程序,断言给定目录中的所有DLL文件都是特定的构建类型.

我会在SDK的构建过程结束时使用它作为一个健全性检查,以确保64位版本没有以某种方式获得一些32位DLL文件,反之亦然.

有没有一种简单的方法来查看DLL文件并确定其类型?

该解决方案应该适用于xp32和xp64.



1> Jeremy..:

一种粗略的方法是使用每个DLL上的Visual Studio工具中的headers选项调用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)

您可以在该输出中看到一些线索,它是一个32位DLL,包括Paul提到的14C值.应该很容易在脚本中查找.


警告:此方法似乎不适用于任何.NET?对于所有.NET .dll或.exe程序,返回32位,无论它们是针对x32还是x32/x64("所有CPU")进行编译.看起来好像每个.NET可执行文件都有一个32位本机标头,并在调用它时调用相应的32位或64位.NET运行时.
@Contango:这并不完全正确(x64只有DLL显示正确的标题,即使是.NET可执行文件)."任何CPU"部分都是正确的,因为"实际位数"将在装配负载上确定,因此不能在装配本身中进行硬编码.您可以使用`dumpbin`附带的`corflags`实用程序来查看有关.NET可执行文件的信息.
在此处使用corflag的示例http://stackoverflow.com/a/2418287/74585

2> DevSolar..:

如果您安装了Cygwin(由于各种原因我强烈推荐),您可以在DLL上使用'file'实用程序

file 

这将产生这样的输出:

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


64位DLL的示例输出:`boost_math_c99f-vc140-mt-1_58.dll:PE32 +可执行文件(DLL)(控制台)x86-64,用于MS Windows
@BradLaney:这很有趣,因为上面的输出是从我的框中复制和粘贴(WinXP/Cygwin).在另一个盒子(Win7)上测试给我:`MS-DOS可执行文件,用于MS Windows 3.x(驱动程序)的NE用于"Windows\system\COMMDLG.DLL",用于MS Windows(DLL)(GUI)的PE32可执行文件英特尔80386 32位用于"Program Files\Internet Explorer\iecompat.dll"...此时我停止测试并仍然声称,如果你得到的只是"单声道",要么你只测试了单声道组件,要么您的Cygwin安装是borked.
呃......问题出在哪里?`file `.我不确定`file`是否是核心设置的一部分,或者你是否必须选择它进行安装,但它在Cygwin中肯定可用,因为我过去曾使用它.
任何使用MingW并且没有意识到的人,这也是基于Cygwin的东西,它也有这个.

3> Paul Dixon..:

血淋淋的细节

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读取标题...

您还可以使用ImageHelp API来做到这一点-加载使用DLL 的LoadImage,你会得到一个LOADED_IMAGE结构,其中将包含一个指向IMAGE_NT_HEADERS结构.使用ImageUnload释放LOADED_IMAGE.

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

这是粗略的Perl脚本,可以完成工作.它检查文件是否有DOS标头,然后从IMAGE_DOS_HEADER 60字节读取PE偏移到文件中.

然后它寻求PE部分的开始,读取签名并检查它,然后提取我们感兴趣的值.

#!/usr/bin/perl
#
# usage: petype 
#
$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);


非常便利.我创建了代码的Python翻译:https://github.com/tgandor/meats/blob/master/missing/arch_of.py

4> 小智..:

Dependency Walker告诉所有人(差不多). http://www.dependencywalker.com/

它不"安装" - 只需获取它,提取它并运行exec.它适用于任何x32或x64 windows模块应用程序.

我记得,看到所有依赖项,即dll模块,以及自应用程序以来,它是相当简单的.是一个依赖关系的总和,可以确定它是否是完整的x64,x32(x86)或每个的位.

为其构建模块的CPU类型位于"CPU"列中.大多数64位aps仍然是每个,但32位ap w/b所有x86.

极客/程序员的美丽程序,它是免费的......


Dependency Walker似乎不适用于.NET .dll或.exe文件.使用32位和64位.NET控制台应用程序进行了快速测试,但它无法区分.
@Gravitas对于.Net文件,您需要使用CorFlags.exe
如果我完成这项工作,我只需让用户上传他/她的dll文件并显示信息,而无需下载任何可执行文件并安装并运行它.

5> Nathan Osman..:

我写了一个非常简单的工具,它就是这个 - 它被称为PE Deconstructor.

只需将其启动并加载您的DLL文件:

在此输入图像描述

在上面的示例中,加载的DLL是32位.

你可以在这里下载它(我只有64位版本编译的ATM):http:
//files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

这里有一个较旧的32位版本:http:
//dl.dropbox.com/u/31080052/pedeconstructor.zip


我在PE Deconstructor amd64可执行文件上尝试了这个,它说它是32位.
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有