標籤:blog http io ar os 使用 for sp 檔案
[轉]Win7 UAC的安全、相容及許可權
http://www.cnblogs.com/mydomain/archive/2010/11/24/1887132.html
網上關於這個問題討論較多,但也不外乎幾種方法。總結一下,如附中。順便瞭解一個UAC。
UAC,全稱User Account Control(使用者帳戶控制)
System Safe Monitor(主機入侵防禦系統)
UAC是如何工作的[3]
我 們可以簡單的把UAC當作許可權臨時重分配的工具。在預設情況下,所有的非系統核心進程都只擁有標準許可權,這一許可權不能對系統關鍵地區進行修改。對於一個程 序,如果它當中含有提權申請,則在運行時會彈出UAC視窗要求提權。如果使用者允許,則程式暫時性的獲得了最高許可權,可以對系統關鍵地區變更;如果使用者 拒絕,則程式被拒絕執行。而如果程式中沒有提權申請,則系統會讓程式運行於標準許可權下。同時,對於所有程式,都可以用“以管理員身份運行”的方式手動提 權。而即便病毒感染了系統,它也處於UAC的監視之下,這使得病毒的反清除行為會受到很大阻礙。正是憑藉這一機制,UAC成為了一道重要的系統防火牆。
在 Windows7(NT6.x系統)中,系統取消了對行動裝置Autorun.inf的支援。
使用者介面權限隔離[5]
在 早期的Windows作業系統中,在同一使用者下啟動並執行所有進程有著相同的安全等級,擁有相同的許可權。例如,一個進程可以自由地發送一個Windows訊息 到另外一個進程的視窗。從Windows Vista開始,當然也包括Windows 7,對於某些Windows訊息,這一方式再也行不通了。進程(或者其他的對象)開始擁有一個新的屬性——特權等級(Privilege Level)。一個特權等級較低的進程不再可以向一個特權等級較高的進程發送訊息,雖然他們在相同的使用者權限下運行。這就是所謂的使用者介面權限隔離 (User Interface Privilege Isolation,UIPI)。
UIPI的引入,最大的目的是防止惡意代碼發送訊息給那些擁有較高許可權的視窗以對其進行攻擊,從而擷取較高的許可權等等。
UIPI的運行機制
在Windows 7中,當UAC(User Account Control)啟用的時候,UIPI的運行可以得到最明顯的體現。在UAC中,當一個管理使用者登入系統後,作業系統會建立兩個令牌對象(Token Object):第一個是管理員令牌,擁有大多數特權(類似於Windows Vista之前的System中的使用者),而第二個是一個經過過濾後的簡化版本,只擁有普通使用者的許可權。
默 認情況下,以普通使用者權限啟動的進程擁有普通特權等級(UIPI的等級劃分為低等級(low),普通(normal),高等級(high),系統 (system))。同樣的,以管理員權限啟動並執行進程,例如,使用者按右鍵選擇“以管理員身份運行”或者是通過添加“runas”參數調用 ShellExecute啟動並執行進程,這樣的進程就相應地擁有一個較高(high)的特權等級。
這將導致系統會運行兩種不同類型,不同特權等級的進程(當然,從技術上講這兩個進程都是在同一使用者下)。我們可以使用Windows Sysinternals工具集中的進程瀏覽器(Process Explorer)查看各個進程的特權等級。[6]
所以,當你發現你的進程之間Windows訊息通訊發生問題時,不妨使用進程瀏覽器查看一下兩個進程之間是否有合適的特權等級。
UIPI所帶來的限制
正如我們前文所說,等級的劃分,是為了防止以下犯上。所以,有了使用者介面權限隔離,一個運行在較低特權等級的應用程式的行為就受到了諸多限制,它不可以:
?驗證由較高特權等級進程建立的視窗控制代碼
?通過調用SendMessage和PostMessage向由較高特權等級進程建立的視窗?發送Windows訊息
?使用線程鉤子處理較高特權等級進程
?使用普通鉤子(SetWindowsHookEx)監視較高特權等級進程
?向一個較高特權等級進程執行DLL注入
但是,一些特殊Windows訊息是容許的。因為這些訊息對進程的安全性沒有太大影響。這些Windows訊息包括:
0x000 - WM_NULL
0x003 - WM_MOVE
0x005 - WM_SIZE
0x00D - WM_GETTEXT
0x00E - WM_GETTEXTLENGTH
0x033 - WM_GETHOTKEY
0x07F - WM_GETICON
0x305 - WM_RENDERFORMAT
0x308 - WM_DRAWCLIPBOARD
0x30D - WM_CHANGECBCHAIN
0x31A - WM_THEMECHANGED
0x313, 0x31B (WM_???)
修複UIPI問題
基 於Windows Vista之前的作業系統行為所設計的應用程式,可能希望Windows訊息能夠在進程之間自由的傳遞,以完成一些特殊的工作。當這些應用程式在 Windows 7上運行時,因為UIPI機制,這種訊息傳遞被阻斷了,應用程式就會遇到相容性問題。為瞭解決這個問題,Windows Vista引入了一個新的API函數ChangeWindowMessageFilter[7]。利用這個函數,我們可以添加或者刪除能夠通過特權等級隔 離的 Windows訊息。這就像擁有較高特權等級的進程,設定了一個過濾器,允許通過的Windows訊息都被添加到這個過濾器的白名單,只有在這個白名單上 的訊息才允許傳遞進來。
如 果我們想容許一個訊息可以發送給較高特權等級的進程,我們可以在較高特權等級的進程中調用ChangeWindowMessageFilter函數,以 MSGFLT_ADD作為參數將訊息添加進訊息過濾器的白名單。同樣的,我們也可以以MSGFLT_REMOVE作為參數將這個訊息從白名單中刪除。
一個樣本
對於系統訊息的處理,接受訊息的進程需要將該訊息加入到白名單中,可以通過下面的代碼實現:
需要在高許可權程式開始的地方加入以下代碼,指定什麼訊息可以接受
代碼對於自訂訊息,通常是指大於WM_USER的訊息,我們首先必須在系統中註冊該訊息,然後在調用上面的代碼:
+ View Code註冊訊息通過RegisterWindowMessage實現,函數的參數就是你需要註冊的訊息值。
此時,低等級的進程就可以像高等級的進程發送訊息了。
附 Win7下如何讓應用程式以管理員身份進行安裝執行
1、法一:
runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
我感覺這種方法不靠譜。
2、法二:
通過manifest檔案使VC應用程式獲得管理員權限
這種方法還不錯[1]。
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
3、法三:
起 名為setup,win7會自己提升許可權,增加manifest檔案。還有一種方法是改註冊表。HKEY_CURRENT_USER\Software \Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
添加一個字串值 名稱就是你的程式的路徑和名字,值為RUNASADMIN。
也可以做成服務。
4、其它方法:
還有的網友說:有個開源的項目叫做RunAs,就是用來以指定使用者來運行程式的項目,可以參考
參考網址和更多閱讀
[1] http://hi.baidu.com/crowreturns/blog/item/f5e7cefd7546a284b801a07e.html
[2] http://www.cnblogs.com/sun8134/archive/2009/10/30/1593025.html
[3] 360 論壇
[4] http://topic.csdn.net/u/20100203/14/d98d8310-4971-47d1-94b1-9cdfbf159b4f.html
[5] http://blog.csdn.net/jinhill/archive/2010/07/21/5752870.aspx
[6] Sysinternals Utilities Index
http://technet.microsoft.com/en-us/sysinternals/bb545027.aspx
[7] ChangeWindowMessageFilter
http://msdn.microsoft.com/en-us/library/ms632675%28VS.85%29.aspx
[ Using the ChangeWindowMessageFilter function is not recommended, as it has process-wide scope. Instead, use the ChangeWindowMessageFilterEx function to control access to specific windows as needed. ChangeWindowMessageFilter may not be supported in future versions of Windows.]
[8]http://it.chinawin.net/softwaredev/article-b6f9.html
[轉]Win7 UAC的安全、相容及許可權