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);
TA贡献1842条经验 获得超12个赞
如果您安装了Cygwin(由于各种原因我强烈推荐),您可以在DLL上使用'file'实用程序
file <filename>
这将产生这样的输出:
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit
- 3 回答
- 0 关注
- 1372 浏览
添加回答
举报