32位程序訪問64位Windows操作系統存放64位系統文件的 \Windows\System32 目錄時將遇到重定向目錄問題

    爲了檢測 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 位版。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章