admin 管理员组

文章数量: 887021

    为了检测 exe、dll、ocx 等类型的文件是 32 位还是 64 位,网上有文章推荐使用 EXE 64bit Detector 之类的工具软件。EXE 64bit Detector 的官网是:http://securityxploded/exe-64bit-detector.php ,使用 EXE 64bit Detector 查看一般普通目录中文件的位数是有效的,但是如果用它查看 64 位 Windows 的系统目录下的文件就有可能出问题。

    例如,在 64 位 Windows 7 操作系统中,在 C:\Windows\SysWOW64 目录和 C:\Windows\System32 目录下,都有一个名为 aaclient.dll 的文件,这两个文件虽然同名,但是内容并不相同。使用博文: http://blog.csdn/henter/article/details/78678029 中介绍的 QuickHash 工具分别计算这两个文件的 Hash 值,可以看到 Hash 值不同,计算结果如下:





  64 位 Windows 操作系统在 C:\Windows\SysWOW64 目录中存放 32 位程序, 在 C:\Windows\System32 目录中存放 64 位程序,所以 C:\Windows\SysWOW64\aaclient.dll 是一个 32 位的 dll 文件,C:\Windows\System32\aaclient.dll 是一个 64 位的 dll 文件。

    如果将 32 位的 aaclient.dll 拷贝到临时创建的 C:\Temp\dll_bit_num\32bits 目录下,将 64 位的 aaclient.dll 拷贝到临时创建的C:\Temp\dll_bit_num\64bits 目录下,使用 EXE 64bit Detector 工具检测 dll 文件的位数,能够正确识别。如下图:



    可是如果直接使用 Exe64bitDetector 分别检测 64 位 Windows 系统目录 C:\Windows\SysWOW64 下和 C:\Windows\System32 下的 aaclient.dll 文件,检测结果就会出错,会将这两个文件都识别为 32 位的 dll 文件。如下图:



    出现这个错误的原因在于:当前使用的工具软件 Exe64bitDetector.exe 是一个 32 位的可执行程序,在 64 位的 Windows 操作系统中,当一个 32 位的可执行程序试图访问 64 位系统目录 \Windows\System32 下面的文件时,Windows 操作系统会自动将访问的目标路径重定向到 \Windows\SysWOW64 下。即 32 位的程序实际上访问不到  \Windows\System32 下面的文件!只能访问到对应的  \Windows\SysWOW64 下的同名文件(前提是同名文件存在)。而  64 位的可执行程序既能够正常访问 32 位系统目录 \Windows\SysWOW64 下的文件,又能够正常访问 64 位系统目录 \Windows\System32 下的文件。

    再举一个例子,工具软件 Dependency Walker 的官网 http://dependencywalker 上提供了 32 位和 64 位程序的下载,如下图:


    在 64 位 Windows 7 平台上,如果使用 32 位的 Dependency Walker 查看 C:\Windows\SysWOW64\aaclient.dll 文件,显示如下:



    如果使用 32 位的 Dependency Walker 查看 C:\Windows\System32\aaclient.dll 文件,显示如下:


    可以看出 32 位的 Dependency Walker 对 C:\Windows\System32\aaclient.dll 的文件位数判断是错误的!原因是它在打开文件时,被 64 位的 Windows 操作系统重定向到了 C:\Windows\SysWOW64\aaclient.dll 文件,所以此时它判断的是 C:\Windows\SysWOW64\aaclient.dll 的文件类型,当然就是 32 位的 dll 文件了。

    如果使用 64 位的 Dependency Walker 查看 C:\Windows\SysWOW64\aaclient.dll 文件,显示如下:



    如果使用 64 位的 Dependency Walker 查看 C:\Windows\System32\aaclient.dll 文件,显示如下:


    可以看出 64 位的 Dependency Walker 对 C:\Windows\SysWOW64\aaclient.dll 和 C:\Windows\System32\aaclient.dll 的文件位数所做的判断都是正确的。

    在 C:\Windows\System32\ 目录下有一个名为 aitstatic.exe 文件,而在 C:\Windows\SysWOW64 目录下不存在同名文件。如果启动 32 位的 Dependency Walker,从资源管理器窗口中将 C:\Windows\System32\aitstatic.exe 文件图标拖拽到 Dependency Walker 界面窗口中,会出现找不到文件的错误提示,如下图:


  但是该文件明明是存在的,出现这种错误的原因就在于 32 位的程序不能访问到 64 位 Windows 下的 \Windows\System32 目录。

  如果使用 64 位的 Dependency Walker,从资源管理器窗口中将 C:\Windows\System32\aitstatic.exe 文件图标拖拽到 Dependency Walker 界面窗口中,能够正常识别出该文件是一个 64 位的 exe 程序,显示如下:



    从上面的分析可知,32 位的可执行程序在 64 位 Windows 中执行时,如果访问存放 64 位系统文件的系统目录 \Windows\System32 ,就会被 64 位的 Windows 操作系统自动重定向为访问 \Windows\SysWOW64 系统目录。这种自动重定向可能会带来很多问题,在实际应用中一定要小心。

  网上有一位作者也注意到了这个问题,有兴趣的读者可以看一下他写的博文:http://wwwblogs/hbccdf/p/dllchecktoolandsyswow64.html

    在 64 位的 Windows 7 下,通常将 32 位的应用程序安装在 C:\Program Files (x86) 目录下,将 64 位的应用程序安装在 C:\Program Files 目录下。使用 32 位的应用程序访问 C:\Program Files 目录下的文件,操作系统不会自动重定向到 C:\Program Files (x86) 目录下。因为这些目录是应用程序的存放目录,不是 Windows 系统文件的存放目录。使用 32 位的工具软件 Exe64bitDetector 分别检测 C:\Program Files (x86)\Internet Explorer\iexplore.exe 与 C:\Program Files\Internet Explorer\iexplore.exe 文件,发现能够正确识别文件位数,这说明操作系统此时并没有进行自动重定向处理。如下图:



    有一个工具软件  CFF Explorer,其官网是:http://www.ntcore/exsuite.php 。该软件可以被用来查看Windows PE文件内部的信息。这个软件的开发者功力深厚,意识到了 64 位 Windows 操作系统存在的系统目录重定向问题,进行过有针对性的处理。现在从其官网上下载安装的是 64 位 exe,但是还可以在网上找到早期的 32 位版本的 CFF Explorer。即使用户使用 32 位的 CFF Explorer,如下图:


    32 位的 CFF Explorer能够不受 64 位 Windows 操作系统自动重定向系统目录的影响。比如使用 32 位的 CFF Explorer 查看 C:\Windows\SysWOW64\aaclient.dll 文件,显示如下:



    使用 32 位的 CFF Explorer 查看 C:\Windows\System32\aaclient.dll 文件,显示如下:



   可以看出 32 位的 CFF Explorer 可以不受 64 位 Windows 操作系统自动重定向系统目录的影响,能够访问到 64 位系统文件存放目录 \Windows\System32\ 下面的文件。32 位的 CFF Explorer 是一个例外,而 32 位的 Exe64bitDetector、32 位的 Dependency Walker 都会受到 64 位 Windows 操作系统自动重定向系统目录的影响,所以在 64 位 Windows 操作系统中,应当使用这些软件的 64 位版本。在写本文时,Dependency Walker已发布了 64 位版本的程序,而 Exe64bitDetector 只有 32 位版本,尚未发布 64 位版。

本文标签: 目录 时将 重定向 操作系统 文件