为了检测 exe、dll、ocx 等类型的文件是 32 位还是 64 位,网上有文章推荐使用 EXE 64bit Detector 之类的工具软件。EXE 64bit Detector 的官网是:http://securityxploded.com/exe-64bit-detector.php ,使用 EXE 64bit Detector 查看一般普通目录中文件的位数是有效的,但是如果用它查看 64 位 Windows 的系统目录下的文件就有可能出问题。
例如,在 64 位 Windows 7 操作系统中,在 C:\Windows\SysWOW64 目录和 C:\Windows\System32 目录下,都有一个名为 aaclient.dll 的文件,这两个文件虽然同名,但是内容并不相同。使用博文: http://blog.csdn.net/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.com 上提供了 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://www.cnblogs.com/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.com/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 位版。