摇曳的蔷薇
血淋淋的细节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);