上帝保佑 - God4

God Bless

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  这是一个很古老的问题,Windows的文件浏览器在文件属性显示上一直没有明确地显示exe、dll等PE格式文件是32位还是64位。虽然这对于普通用户不是很重要,但是很多情况下却非常有用。举个例子,Windows的0xc000007b错误,报错信息非常简洁,让人无所适从,其实很多时候是因为dll文件的32位和64位弄错的问题,此处报错完全可以报出到底是哪个模块出的问题,但是弹窗却只是轻描淡写地说了一句“应用程序无法正常启动(0xc000007b)”。

  

  今天把判断exe、dll等文件是32位还是64位的方法总结了一下,有些很简单,有些需要第三方程序,最灵活的是可以自己写代码检测,具体如下,其中带*标记的为推荐方法。

一、通过属性中的颜色模式设置判断*

  来源:Window上 判断软件32位 64位 方法

  https://blog.csdn.net/wanghuiyao/article/details/80962198

  该方法只针对exe等可执行文件,通过右键打开“属性”页来判断,在“兼容性”选项卡中,下面有“简化的颜色模式”和“低分辨率运行”设置项,如果这两项可选择,就是32位程序,否则,是64位程序。

  

二、通过任务管理器查看*

  来源:怎么检测exe或DLL文件是32位还是64位的

  http://www.winwin7.com/JC/17072.html

  也是简单却不通用的方法,前提1:必须是可执行程序,前提2:必须是在运行状态下,才能通过任务管理器查看。任务列表里注明是32位的,就是32位,否则就是64位。该方法对于dll、ocx文件也无能为力。

  

三、通过记事本查看*

  来源:怎么检测exe或DLL文件是32位还是64位的

  http://www.winwin7.com/JC/17072.html

  直接用记事本或者Notepad++、UltraEdit打开exe、dll等文件查看,不用管乱码,直接从开头向后寻找PE L或者PE d,如果出现PE L则是32位文件,PE d则是64位文件。该方法简单通用,但是一次只能一个文件。

  

四、通过7z压缩软件查看

  来源:怎么检测exe或DLL文件是32位还是64位的

  http://www.winwin7.com/JC/17072.html

  如果你的机器上安装了7z压缩软件,可以用7z按压缩文件打开exe、dll等文件,然后点击“信息”进行查看,弹出的属性框中会标明CPU类型。

  

五、使用DumpBin查看*

  来源:Dumpbin命令查看软件32位/64位

  https://www.it610.com/article/5499727.htm

  参考:DUMPBIN Reference

  https://docs.microsoft.com/en-us/cpp/build/reference/dumpbin-reference?view=vs-2019

  DumpBin.exe是Microsoft Visual Studio自带的一个工具,用于显示有关通用对象文件格式 (COFF) 的二进制文件的信息,功能强大,通过/HEADERS命令可以简单、方便、快速地判断程序或动态库是32位还是64位。

  

六、使用CorFlags查看

  来源:检查DLL,EXE文件是64位或者32位的方法

  https://www.cnblogs.com/chriskwok/p/9682940.html

  参考:CorFlags.exe (CorFlags Conversion Tool)

  https://docs.microsoft.com/en-us/dotnet/framework/tools/corflags-exe-corflags-conversion-tool

  CorFlags.exe是Microsoft .NET Framework Tools自带的一个工具,可以查看基于.NET Framework开发的exe、dll等文件头信息,但是对于普通编译的文件,会报“error CF008 : The specified file does not have a valid managed header”错误。

  

七、使用EXE 64bit Detector、Dependency Walker、CFF Explorer等工具查看

  来源:32位程序访问64位System32目录时的重定向问题

  https://blog.csdn.net/henter/article/details/79448375

八、使用eXeScope、PeStudio等PE工具查看

九、使用IDA、OllyDbg等反编译工具查看

十、自己写代码进行检测*

  参考:dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

  https://www.cnblogs.com/hbccdf/p/dllchecktoolandsyswow64.html

  PE文件格式有着清晰的定义,自己写程序判断32位还是64位并不复杂,而且可以简单快速地实现批量检测。2014年按照缘生梦的帖子,基于.net写了一个检测程序,很好用,但是有个问题,很多机器上没有安装所需的.net版本,为了一个小功能又要下载安装各种包实在懒得折腾,还是VC6的程序方便小巧兼容性好啊。

  主要代码如下:

// 获取机器标志码
// -1 打开文件失败
// -2 读取文件失败
// -3 文件格式错误
// 0      任何处理器
// 0x14c  x86处理器
// 0x8664 x64处理器
// 0x166  MIPS处理器
// 0x1C0  ARM处理器
INT GetMachine(const TCHAR * szFilePath)
{
    // _tprintf(TEXT("%s\n"), szFilePath);

    // 打开文件
    FILE * fp = _tfopen(szFilePath, TEXT("rb"));
    if( fp == NULL )
    {
        return -1;
    }

    // 获取文件长度
    long len = filelength(fileno(fp));
    if( len < 0 )
    {
        fclose(fp);
        return -1;
    }

    // 文件格式错误
    if( len < 0x40 )
    {
        fclose(fp);
        return -3;
    }

    WORD buf;

    // 读取MZ文件头
    if( fread(&buf, 1, 2, fp) != 2 )
    {
        fclose(fp);
        return -2;
    }

    // 文件格式错误
    if( buf != 0x5A4D )
    {
        fclose(fp);
        return -3;
    }

    // 移到PE头偏移
    if( fseek(fp, 0x3C, SEEK_SET) )
    {
        fclose(fp);
        return -2;
    }

    // 读取PE头偏移
    if( fread(&buf, 1, 2, fp) != 2 )
    {
        fclose(fp);
        return -2;
    }

    // 文件格式错误
    if( len < buf + 6 )
    {
        fclose(fp);
        return -3;
    }

    // 移到PE头
    if( fseek(fp, buf, SEEK_SET) )
    {
        fclose(fp);
        return -2;
    }

    // 读取PE头
    if( fread(&buf, 1, 2, fp) != 2 )
    {
        fclose(fp);
        return -2;
    }

    // 文件格式错误
    if( buf != 0x4550 )
    {
        fclose(fp);
        return -3;
    }

    // 移到机器码
    if( fseek(fp, 2, SEEK_CUR) )
    {
        fclose(fp);
        return -2;
    }

    // 读取机器码
    if( fread(&buf, 1, 2, fp) != 2 )
    {
        fclose(fp);
        return -2;
    }

    fclose(fp);
    return buf;
}

  如果要检测64位系统System32目录下的文件,需要把文件重定向关闭:

BOOL DisableWow64FsRedirection()
{
    typedef BOOL (WINAPI* WOW64DISABLEWOW64FSREDIRECTION)(PVOID *OldValue);
    WOW64DISABLEWOW64FSREDIRECTION Wow64DisableWow64FsRedirection;

    HMODULE hKernel32 = GetModuleHandle(TEXT("kernel32.dll"));
    if( hKernel32 == NULL )
    {
        return FALSE;
    }

    Wow64DisableWow64FsRedirection = (WOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(hKernel32, "Wow64DisableWow64FsRedirection");
    if( Wow64DisableWow64FsRedirection == NULL )
    {
        return TRUE;
    }

    PVOID OldValue = NULL;
    if( Wow64DisableWow64FsRedirection(&OldValue) == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED )
    {
        return FALSE;
    }

    return TRUE;
}

  最后实现的PE32or64.exe文件,没有了.net平台需求,可以针对目录批量进行检测,效果不错:

  

  工具下载:https://download.csdn.net/download/god4/11899056

posted on 2019-10-22 18:36  God4  阅读(3008)  评论(0编辑  收藏  举报