微軟安全技術Shim


Shim是微軟系統中一個小型函數庫,用於透明地攔截API調用,修改傳遞的參數、自身處理操作、或把操作重定向到其他地方。Shim主要用於解決遺留應用程序在新版Windows系統上的兼容性問題,但Shim也可用於其他方面。例如上周微軟緊急推出針對微軟Office Powerpoint 0day漏洞(CVE-2014-6352)”的Fix It,其中就采用了Shim技術,用於修復存在安全缺陷的函數。

一、什么是Shim

Shim是微軟極少使用的四字母單詞之一,也不是某種形式的縮寫。它是英語單詞Shim的引申含義。Shim是一個工程術語,描述為了讓兩個物體更好地組裝在一起而插入的一塊木頭或金屬。在計算機編程中,shim是一個小型的函數庫,用於透明地攔截API調用,修改傳遞的參數、自身處理操作、或把操作重定向到其他地方。Shim也可以用來在不同的軟件平台上運行程序。

二、shim如何工作

 

Shim架構實現了一種API鈎子,而Windows API是通過一組DLL來實現的。Windows系統上的每個應用程序導入這些DLL,並在內存中維護一個存儲調用函數地址的表(導入表)。由於Windows函數的地址位於一個表中,Shim直接把導入表中的地址替換為shim DLL中的地址。通常,應用程序沒有意識到請求被重定向到一個Shim DLL而不是Windows系統,而Windows系統也沒意識到請求並非來自應用程序(因為Shim DLL剛好也位於應用程序的進程中)。

在這個例子中,兩個主體分別是應用程序和Windows系統,而shim是能夠兩者更好協作的附加代碼,如下所示

shim代碼被注入,並能夠修改發向Widows系統的請求、從Windows系統返回的響應或全部,

尤其是,shim利用鏈接的特性將API調用重定向至替換的代碼-Shim。通過導入表(IAT)實現調用外部的二進制文件。因此,調用Windows的函數類似於:

 

 

 你可以修改IAT表中已解析的Windows函數地址,然后替換為指向shim中替代函數的指針,如圖4所示。

 

 

靜態鏈接的DLL重定向發生在應用程序啟動的時候。你也可以通過攔截GetProcAddressAPI調用來重定向動態鏈接的DLL文件。

三、為什么使用Shim

 

你無需訪問源代碼就可以修復應用程序,或甚至不需要修改應用程序。你只需承擔極少的管理開銷(針對Shim數據庫),然而你通過這種方式可以修復數量相當可觀的應用程序。缺點是支撐不足,因為大部分供應商不支持經Shim修復的應用程序。你不能夠應用Shim來修復所有的應用程序。在軟件供應商已經倒閉關門、軟件已被淘汰而不予支持、或只購買一段時間的授權的情況下,人們可能考慮對應用程序進行Shim修復。

例如,最經常使用的Shim是version-lie(版本欺騙)Shim。為了實現這個Shim,我們攔截應用程序用於判斷Windows版本的幾個API。正常情況下,請求能夠直接發送到Windows系統,並能夠給予真實的回復。使用了Shim之后,向應用程序回復一個偽造的Windows版本(例如,Windows XP 而不是 Windows 7)。如果應用程序只能運行在Windows XP上,通過這種方式就能夠讓應用程序誤以為自己運行在正確的操作系統上。(通常用來解決兼容性問題)。

你可以利用shim玩很多花樣,例如:

1.ForceAdminAccess shim試圖欺騙應用程序相信當前用戶是本地管理員用戶組,即使實際情況並不是如此。(如果你不是一個本地管理員用戶,盡管你可能使用了其他的技巧來解決這個問題,如UAC文件和注冊表虛擬化,許多應用程序還是啟動失敗)。Shim如何實現版本檢查是相當簡單明了。例如shim攔截shell32.dll中IsUserAnAdminAPI調用。shimmed修復后的函數(相對於實際的API,修復后的函數具有極佳的性能)只是簡單返回True。

2.WrpMitigation shim欺騙應用程序的安裝程序相信可以寫入被WRP保護的文件。如果你試圖一個被WRP保護的文件,shim首先創建一個新的臨時文件,標記為文件句柄關閉后立即刪除,然后返回臨時文件的句柄冒充為實際被保護的文件。

3.CorrectFilePaths shim可以把文件從一個位置重定向到另一個位置。因此,你如果有一個程序試圖寫入c:\myprogramdir(不能利用UAC文件和注冊表虛擬化來自動解決),你可以把運行時修改的文件重定向到每個用戶的位置。這樣就允許你作為標准用戶運行,同時又不放松ACL。

Freebuf科普

WRP(Windows資源保護)對系統穩定性有重要影響的文件進行隱秘拷貝,但是存儲的位置變成了%Windir%\WinSxS\Backup,依靠Access Control List(訪問控制列表,ACL)為系統提供實時保護,在
WRP的管理下允許對被保護的資源進行寫入只授權給了TrustedInstaller,即使是系統管理員也沒有權限。

注意:因為Shim代碼運行在用戶模式的程序進程中,所以你不能使用shim來修復內核模式的代碼。例如,你不能利用shim來解決設備驅動或其他內核模式代碼的兼容性問題。(例如,一些反病毒軟件、防火牆以及反間諜軟件代碼運行內核模式下)

四、何時使用Shim

1.從已破產的供應商獲得的應用程序:既然供應商已經倒閉,技術支持自然無從說起。然而,因為源碼不能獲得,shim是解決兼容性問題的唯一選擇。

2.內部開發的應用程序:雖然大部分用戶更傾向於讓自己開發的應用程序本身可以解決兼容性問題,但有些場景中時間上並不允許這么做。團隊也許不能在新版Windows部署計划之前解決所有的兼容性問題,因此他們可能選擇利用shim修復應用程序,同時shim不能修復的部分就需要修改應用程序的源代碼。

3.供應商將要發布一個兼容性的版本,但當前的技術支持不夠:當現有的應用程序既不是關鍵業務也不是很重要,一些用戶使用Shim作為臨時解決方案。理論上講,用戶可以等到兼容性的版本發布,但會阻礙整個部署計划。在兼容版本可用之前,先為用戶提供一個Shim修復過的且能正常運轉的應用程序不失為兩全之計。

五、創建一個應用程序兼容性的Shim

如果你試圖在Windows 7運行專為2000或XP創建的應用程序,並出現了問題,你可能總是需要在你的機器上開啟兼容模式。然而,如果創建了Shim,你也可在其他機器上運行這個程序,而不需要每次手動開啟兼容模式。Shim是體積小且只需運行一次,常常和機器上的特定應用程序聯系在一起。

ACT是應用程序兼容性工具包(Application Compatibility Toolkit),可以從這里下載:

一旦我們從“開始”菜單->”微軟應用程序兼容性工具包”->”兼容性管理工具”( Compatibility AdministratorTool)啟動。

 

在“New Database”點擊右鍵:

 

 選擇“Application Fix”,然后從下面的對話框中選擇需要修復的應用程序:

①輸入需要修復的程序
②輸入供應商名稱
③瀏覽可執行程序的位置

 

當你按下“Next”按鈕,你接下來將看到默認的兼容模式列表。如果僅存在版本兼容性問題,你可以選擇應用程序原先運行的操作系統版本。

此處我也已經判斷出Windows 2000兼容模式適用於這個程序,然后在列表中上下滾動找到“Windows 2000”

 

 接下來的窗口(當需要選擇多個Shim進行組合時)。如下圖所示,你有許多Shim可供選擇。選擇修復應用程序所需的全部shim。

 

 

 

單擊“Finish”,會顯示應用程序和所選修復的全面概要。

現在你只需保存這個shim數據庫文件(包含了創建的shim信息的一個小型數據庫),然后安裝這個shim數據庫文件。你可以通過右鍵單擊來安裝或通過命令行dbinst.exe <database.sdb>

 

 注意:sdbinst.exe已經默認位於“c:\windows\system32”

一旦應用程序兼容性數據庫被安裝,我們就可以從預先指定的位置運行程序。現在這個程序運行在你所指定的兼容模式。

轉自https://www.freebuf.com/news/48878.html?replytocom=54537

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM