为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

我想编写一个测试脚本或程序,断言给定目录中的所有DLL文件都是特定的构建类型。我会在SDK的构建过程结束时使用它作为一个健全性检查,以确保64位版本没有以某种方式获得一些32位DLL文件,反之亦然。有没有一种简单的方法来查看DLL文件并确定其类型?该解决方案应该适用于xp32和xp64。
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

血淋淋的细节

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 <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);


查看完整回答
反对 回复 2019-08-30
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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


file <filename>

这将产生这样的输出:


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


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 1304 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信