是否存在可获取DLL文件架构信息的Win32函数?
DLL架构检测实现方法
首先纠正一个常见误区:GetBinaryType() 并非只能检测EXE文件,传入DLL路径同样可以返回架构结果:
- 返回
SCS_32BIT_BINARY对应32位x86二进制 - 返回
SCS_64BIT_BINARY对应64位x64二进制 - 其余返回值可对应IA64、ARM、ARM64等其他架构
注意:该API对ARM、ARM64架构的识别支持从Windows 10 1607版本才开始加入,如果需要兼容更早的Windows版本,或者需要更精准的架构判定,直接解析PE文件头是兼容性最好、最可靠的方案,全程不需要加载DLL,完全可以在调用LoadLibrary()前完成校验。
手动解析PE头检测方案(推荐)
PE格式是Windows下EXE/DLL统一的可执行文件格式,直接读文件头判断不会触发DLL加载,也不存在系统版本兼容问题,步骤如下:
- 调用
CreateFile()以只读权限打开目标DLL文件 - 读取
IMAGE_DOS_HEADER结构,校验e_magic字段值是否为0x5A4D(即"MZ"标识),不匹配则不是合法的Windows可执行文件 - 移动文件指针到
e_lfanew字段存储的偏移位置,读取NT头签名,校验是否为0x00004550(即"PE\0\0"标识),不匹配则文件损坏或不是合法PE - 紧接NT签名后的结构为
IMAGE_FILE_HEADER,读取其中的Machine字段,根据字段值直接判定架构:0x014c:x86 32位架构0x8664:x64(AMD64/Intel64)64位架构0x01c0:ARM 32位架构0xaa64:ARM64 64位架构0x0200:Itanium(IA64)64位架构
- 校验完成后关闭文件句柄即可,整个过程不会加载DLL到进程内存,也不会执行DLL的任何代码,不存在架构不匹配导致的加载错误。
不建议使用
LoadLibraryEx配合LOAD_LIBRARY_AS_DATAFILE等标志加载DLL后再读取信息,这种方式依然可能因为DLL依赖缺失、权限不足等问题加载失败,远不如直接读取原始文件头稳定。
内容的提问来源于stack exchange,提问作者Ryan Glenn
相关产品推荐
相关产品推荐

