mor*_*lli 256 windows dll 32bit-64bit
我想编写一个测试脚本或程序,断言给定目录中的所有DLL文件都是特定的构建类型.
我会在SDK的构建过程结束时使用它作为一个健全性检查,以确保64位版本没有以某种方式获得一些32位DLL文件,反之亦然.
有没有一种简单的方法来查看DLL文件并确定其类型?
该解决方案应该适用于xp32和xp64.
Jer*_*emy 163
一种粗略的方法是使用每个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值.应该很容易在脚本中查找.
Dev*_*lar 109
如果您安装了Cygwin(由于各种原因我强烈推荐),您可以在DLL上使用'file'实用程序
file <filename>
Run Code Online (Sandbox Code Playgroud)
这将产生这样的输出:
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit
Run Code Online (Sandbox Code Playgroud)
Pau*_*xon 106
DLL使用PE可执行格式,从文件中读取该信息并不太棘手.
有关概述,请参阅有关PE文件格式的此MSDN文章.您需要读取MS-DOS标头,然后读取IMAGE_NT_HEADERS结构.它包含IMAGE_FILE_HEADER结构,其中包含Machine成员中需要的信息,其中包含以下值之一
此信息应该在文件中的固定偏移量,但我仍然建议遍历该文件并检查MS-DOS标头和IMAGE_NT_HEADERS的签名,以确保您应对任何未来的更改.
您还可以使用ImageHelp API来做到这一点-加载使用DLL 的LoadImage,你会得到一个LOADED_IMAGE结构,其中将包含一个指向IMAGE_NT_HEADERS结构.使用ImageUnload释放LOADED_IMAGE.
这是粗略的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);
Run Code Online (Sandbox Code Playgroud)
小智 46
Dependency Walker告诉所有人(差不多). http://www.dependencywalker.com/
它不"安装" - 只需获取它,提取它并运行exec.它适用于任何x32或x64 windows模块应用程序.
我记得,看到所有依赖项,即dll模块,以及自应用程序以来,它是相当简单的.是一个依赖关系的总和,可以确定它是否是完整的x64,x32(x86)或每个的位.
为其构建模块的CPU类型位于"CPU"列中.大多数64位aps仍然是每个,但32位ap w/b所有x86.
极客/程序员的美丽程序,它是免费的......
Nat*_*man 40
我写了一个非常简单的工具,它就是这个 - 它被称为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
| 归档时间: |
|
| 查看次数: |
249069 次 |
| 最近记录: |