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條經驗 獲得超13個贊
如果您安裝了Cygwin(由于各種原因我強烈推薦),您可以在DLL上使用'file'實用程序
file <filename>
這將產生這樣的輸出:
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit
- 3 回答
- 0 關注
- 1497 瀏覽
添加回答
舉報
