在虛擬環(huán)境中使應用程序與Windows 7兼容(3) |
發(fā)布時間: 2012/6/30 11:39:53 |
應用程序與 Microsoft App-V 一起打包時,如何解決運行時兼容性問題?
還記得支持聲明中誘人的說法嗎?“App-V 將支持應用程序使用填充程序(這些填充程序是作為 Microsoft 的應用程序兼容性工具的組成部分提供的)....”實際上如何去實現(xiàn)這一點?這兩種程序是否基本上兼容? 令人高興的是,答案是肯定的。事實上,可以通過幾種不同的方式做到這一點。 填充程序簡要介紹 對于不熟悉填充程序的人來說,填充程序是 Microsoft 很少使用的四字母單詞之一,它不是某種縮寫詞。它以英語單詞“shim”(墊片)進行比喻,這是一個工程術語,用于描述插在兩個物體之間,使它們更好地配合在一起的木片或金屬片。在我們的特定環(huán)境下,兩個物體就是應用程序和 Windows,而墊片材料是使兩者更好地一起發(fā)揮作用的附加代碼,如圖 1 和 2 所示。 圖 1 應用填充程序之前,應用程序與 Windows 直接交互。 圖 2 應用填充程序之后,應用程序與 Windows 間接交互;填充程序代碼注入后,它可以修改向 Windows 發(fā)出的請求和/或來自 Windows 的響應。 填充程序的作用是通過 API 偵聽實現(xiàn)的。Windows API 是使用 DLL 集合實現(xiàn)的。每個針對 Windows 構(gòu)建的應用程序都導入這些 DLL,并在內(nèi)存中維護一個由所有這些功能的地址構(gòu)成的表。因為 Windows 功能的地址位于一個表中,所以,填充程序引擎直接用填充程序 DLL 的地址替換該地址。應用程序通常不知道要將請求發(fā)送到填充程序 DLL 而不是發(fā)送到 Windows 本身,Windows 也不知道請求是來自應用程序以外的源(因為填充程序 DLL 只不過是應用程序進程內(nèi)的另一個 DLL)。 例如,一個十分常用的填充程序是版本欺騙填充程序。為了實現(xiàn)此填充程序,將偵聽幾個用于確定運行應用程序的 Windows 版本的 API。通常,這種信息將傳遞給 Windows 本身,后者會如實應答。但在應用填充程序之后,這些 API 將被偵聽。這樣,將返回一個不同的 Windows 版本(例如,Windows XP 而不是 Windows 7),而不是將請求傳遞給 Windows。如果應用程序編寫為只在 Windows XP 上運行,這樣可以騙過應用程序,使它認為自己正在正確的操作系統(tǒng)上運行。(通常,這樣就可以解決應用程序兼容性問題。 使用填充程序,可以采用很多技巧。例如, ◇ ForceAdminAccess 填充程序嘗試使應用程序確信當前用戶是本地管理員組的成員,即使他并不是該組成員。(如果您不是本地管理員,很多應用程序會徹底失敗,不過,您可以使用其他一些技巧(如 UAC 文件和注冊表虛擬化)來解決初始檢查所引起的問題。)實現(xiàn)這種檢查的方法可以非常簡單。例如,此填充程序從 shell32.dll 偵聽 API IsUserAnAdmin。所填充的功能的完整源代碼(與實際 API 相比,具有極好的性能特性)只返回 TRUE。 ◇ WrpMitigation 填充程序使應用程序安裝程序相信,它們可以寫入受 Windows 資源保護 (WRP) 功能保護的文件。如果嘗試寫入受保護的文件,該填充程序首先創(chuàng)建一個新的臨時文件,一旦句柄關閉就將其標記為已刪除,然后將句柄返回到該臨時文件,就好像它是實際受保護的文件。應用程序?qū)⑴f版本 kernel32.dll 或 shell32.dll(或者在將其打包時它所選擇的任何其他文件)安裝到臨時文件中,但隨后該臨時文件消失,受保護文件的經(jīng)過修補的最新匹配版本保留在文件系統(tǒng)中。這樣,WRP 仍可確保您不會在自己的計算機上最終得到來自 Windows 95 的舊版本 shell32.dll,但在使用此填充程序時,安裝程序不會因 ACCESS_DENIED 而失敗。 ◇ CorrectFilePaths 填充程序可將文件從一個位置重定向到另一個位置。因此,如果應用程序嘗試寫入 c:\myprogramdir(不會使用 UAC 文件和注冊表虛擬化對它進行自動修復),則可以將在運行時修改的文件重定向到基于每個用戶的位置。這樣,您可以以標準用戶的身份運行而不必放寬訪問控制列表 (ACL) 限制,因為您知道,安全人員不愿意放寬 ACL。 ◇ 有數(shù)百個通用填充程序可用來解決應用程序兼容性問題,利用這些修補程序可節(jié)省大量的成本。例如,客戶常常在以下情況下使用填充程序: ◇ 供應商已停止經(jīng)營,因此無法獲得更新版本。如果您無法承擔從新供應商處獲得另外的應用程序或自己構(gòu)建新版本的費用,這樣可以為您爭取一些時間。 ◇ 應用程序不是十分重要,不值得投資于更新版本(伴隨著支持聲明),但您的用戶樂于使用它,所以您不介意他們是否運行不受支持的版本。 ◇ 應用程序是內(nèi)部開發(fā)的,但您不想非要等到團隊發(fā)布完全更新的版本。相反,您愿意采用臨時性修補程序,允許開發(fā)團隊在應用程序的下一次計劃發(fā)布時發(fā)布永久性修補程序。通過這種方法,就不再需要停止所有應用程序開發(fā)活動,可以投入時間和資源來修復兼容性 Bug。您可以使用臨時性修補程序,并允許團隊發(fā)布包含開發(fā)過程中已實現(xiàn)的新功能的修補程序。 利用填充程序解決應用程序兼容性問題,可以顯著節(jié)省成本,大大加速 Windows 7 的部署。 本文出自:億恩科技【www.cmtents.com】 |