成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Visual Studio在Win7下用戶界面特權隔離

開發 后端
在這里我們將介紹Visual Studio在Windows 7下用戶界面特權隔離,希望本文能對大家有所幫助。

Windows 7即將隆重發布,但是很多程序員已經通過RTM等版本嘗到了Windows 7的甜處。那么在Windows 7下用戶界面特權隔離,將是本文我們介紹的重點。51CTO編輯推薦《Visual Studio 2010應用與開發詳解

我們介紹了操作系統服務的Session 0隔離,通過Session 0隔離,Windows 7實現了各個Session之間的獨立和更加安全的互訪,使得操作系統的安全性有了較大的提高。從操作系統服務的Session 0隔離嘗到了甜頭后,雷德蒙的程序員們仿佛愛上了隔離這一招式。現在他們又將隔離引入了同一個Session之中的各個進程之間,帶來全新的用戶界面特權隔離。

用戶界面特權隔離

在早期的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)查看各個進程的特權等級。 (http://www.microsoft.com/technet/sysinternals)

進程瀏覽器

圖1 進程瀏覽器

下圖展示了以不同特權等級運行的同一個應用程序,進程瀏覽器顯示了它們擁有不同的特權等級:

不同特權等級的同一應用程序

圖2  不同特權等級的同一應用程序

所以,當你發現你的進程之間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。利用這個函數,我們可以添加或者刪除能夠通過特權等級隔離的Windows消息。這就像擁有較高特權等級的進程,設置了一個過濾器,允許通過的Windows消息都被添加到這個過濾器的白名單,只有在這個白名單上的消息才允許傳遞進來。

如果我們想容許一個消息可以發送給較高特權等級的進程,我們可以在較高特權等級的進程中調用ChangeWindowMessageFilter函數,以MSGFLT_ADD作為參數將消息添加進消息過濾器的白名單。同樣的,我們也可以以MSGFLT_REMOVE作為參數將這個消息從白名單中刪除。例如:

  1. // 需要的頭文件  
  2.  
  3. #include   
  4. #include   
  5. #include "resource.h"  
  6.  
  7. // 全局對象  
  8. HINSTANCE g_hInstance;  
  9. HWND g_hFirstWnd;  
  10.  
  11. // 消息處理函數  
  12.  
  13. INT_PTR CALLBACK PingPongDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);  
  14.  
  15. // 主函數  
  16. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) {  
  17.     g_hInstance = hInstance;  
  18.     // 獲得窗口的句柄  
  19.        g_hFirstWnd = FindWindow(NULL, _T("用戶界面特權等級隔離"));  
  20.  
  21.     TCHAR text[256];  
  22.     LoadString(g_hInstance, g_hFirstWnd ? IDS_PING : IDS_PONG, text, 256);  
  23.     return DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_PINGPONG), NULL, PingPongDlgProc, (LPARAM)text);  
  24. }  
  25.  
  26. // 處理對話框消息  
  27. INT_PTR CALLBACK PingPongDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {  
  28.     static LPCTSTR pszPingPong;  
  29.     static HWND hWndSend;  
  30.     static UINT uMsgBall;  
  31.     TCHAR sMessageBall[256];  
  32.  
  33.     switch (message) {  
  34.         case WM_INITDIALOG:  
  35.             pszPingPong = (LPCTSTR)lParam;  
  36.             if(!LoadString(g_hInstance, IDS_MESSAGE_BALL, sMessageBall, 256))  
  37.                 return FALSE;  
  38.  
  39.                       // 注冊新的全局自定義消息,這里的全局,針對此進程而言  
  40.             uMsgBall = RegisterWindowMessage(sMessageBall);  
  41.             if(!uMsgBall) return FALSE;  
  42.  
  43.             // 調用ChangeWindowMessageFilter函數,允許此消息可以傳遞進來  
  44.             ChangeWindowMessageFilter(uMsgBall, MSGFLT_ADD);  
  45.  
  46.             // 開始發送消息給其他進程,也就是此應用程序的另一個實例  
  47.             if (g_hFirstWnd)  
  48.                 PostMessage(g_hFirstWnd, uMsgBall, (WPARAM)hwndDlg, 0);  
  49.             return TRUE;  
  50.  
  51.         case WM_TIMER:  
  52.             KillTimer(hwndDlg, 1);  
  53.             SetDlgItemText(hwndDlg, IDC_TEXT, _T(""));  
  54.             PostMessage(hWndSend, uMsgBall, (WPARAM)hwndDlg, 0); //Send the ball.  
  55.             return TRUE;  
  56.  
  57.         default:  
  58.             if(message == uMsgBall) {        // 如果是我們自定義的消息  
  59.                 SetDlgItemText(hwndDlg, IDC_TEXT, pszPingPong);  
  60.                 hWndSend = (HWND)wParam;  
  61.                 SetTimer(hwndDlg, 1, 500, 0);      
  62.                 return TRUE;  
  63.             }  
  64.     }  
  65.       
  66.     return FALSE;  

現在,我們可以調用ShellExecute,以不同的特權等級運行這個應用程序,他們雖然處于不同的特權等級,但是由于我們使用ChangeWindowMessageFilter將自定義的消息添加進了白名單,他們都可以處理這個自定義的消息了。

   

  1. // 應用程序名稱  
  2.        LPCTSTR exeName = _T("UIPIDemo.exe");  
  3.     // 以不同的特權等級運行同一個應用程序  
  4.        // 更高權限  
  5.     HINSTANCE h1 = ShellExecute(NULL, _T("runas"), exeName, NULL, NULL, SW_SHOWDEFAULT);  
  6.     // 中等權限  
  7.        HINSTANCE h2 = ShellExecute(NULL, _T("open"), exeName, NULL, NULL, SW_SHOWDEFAULT);  
  8. 在Windows 7中,為了更加靈活地控制消息的傳入,它引入了一個新的函數ChangeWindowMessageFilterEx,這個新的擴展函數可以為某個特定的窗口制定消息白名單,而不是像ChangeWindowMessageFilter一樣為整個進程制定白名單。  
  9. // Windows 7新引入的函數  
  10. BOOL ChangeWindowMessageFilterEx(  
  11.     HWND hWnd, UINT message, DWORD action,  
  12.     PCHANGEFILTERSTRUCT pChangeFilterStruct  
  13. ); 

在這個函數中,參數action表示這個函數的動作,它可以是MSGFLT_ALLOW (類似于 MSGFLT_ADD),MSGFLT_DISALLOW (類似于 MSGFLT_REMOVE), 和 MSGFLT_RESET,表示將窗口設置為它的默認過濾器。

托管代碼中繞過UIPI

以上的例子演示了在非托管代碼中調用ChangeWindowMessageFilter實現消息過濾白名單,允許消息通過用戶界面特權隔離的過程。在托管代碼中,我們還是使用這個API函數。為了便于使用,我們對這個API函數做一些包裝。在托管代碼中,我們用一個類來封裝所有我們所需要的API函數:

  1. // 用類封裝對API函數的調用  
  2. internal static class NativeWrappers {  
  3.         [DllImport("user32")]  
  4.         public static extern uint RegisterWindowMessage(string msg);  
  5.  
  6.         [DllImport("user32")]  
  7.         public static extern bool PostMessage(IntPtr hWnd,  
  8.                      uint msg, IntPtr wParam, IntPtr lParam);  
  9.  
  10.         public enum ChangeWindowMessageFilterFlags : uint {  
  11.             Add = 1, Remove = 2  
  12.         };  
  13.  
  14.         [DllImport("user32")]  
  15.         public static extern bool ChangeWindowMessageFilter(uint msg,   
  16.                      ChangeWindowMessageFilterFlags flags);  
  17.     } 

完成API的封裝后,我們就可以在主程序中直接使用這個類,完成進程消息過濾器白名單的設置。

  1. public PingPongForm() {  
  2.             InitializeComponent();  
  3.  
  4.                       // 注冊消息  
  5.             _message = NativeWrappers.RegisterWindowMessage("BALL");  
  6.             if(_message == 0)  
  7.                 Close();  
  8.             else {  
  9.                              // 添加可以通過的消息  
  10.                 NativeWrappers.ChangeWindowMessageFilter(_message,  
  11.                                      NativeWrappers.ChangeWindowMessageFilterFlags.Add);  
  12.                              // 發送消息  
  13.                 NativeWrappers.PostMessage(Program.hOtherForm,  
  14.                                      _message, Handle, IntPtr.Zero);  
  15.             }  
  16.         } 

用戶特權等級隔離,就像進程窗口的門神,把不受歡迎的Windows消息隔離在外,把列在客人名單上的Windows消息請進來。門神守候,家宅無憂!

【編輯推薦】

  1. Visual Studio 2010響應Ribbon控件消息
  2. 微軟稱C++將得到Visual Studio 2010更多支持
  3. Visual Studio 2010新特性:動態語言功能
  4. Windows 7下Visual Studio 2008安裝詳解
  5. Visual Studio 2010 Beta1試用手記
責任編輯:彭凡 來源: IT168
相關推薦

2009-08-12 09:16:04

Vista升級Windows 7升級Visual Stud

2009-04-21 09:05:36

Windows 7微軟操作系統

2011-09-14 17:24:55

Android開發環境Android SDK

2010-03-31 13:04:37

CentOS安裝

2011-07-28 16:57:27

2011-08-19 15:42:39

win7登陸界面ogo信息

2009-06-05 08:53:30

微軟Windows 7操作系統

2009-06-08 10:14:47

Visual StudWin 7

2012-06-13 09:29:44

Win7系統硬盤分區

2009-11-02 14:16:43

Visual Stud

2009-09-24 10:10:07

Visual Stud

2009-09-11 08:16:23

Windows 7系統升級XP升級

2011-08-18 18:53:30

win7

2010-09-17 10:04:23

Java jdk

2009-06-11 14:31:45

Windows 7微軟操作系統

2010-01-15 09:30:22

Visual Stud

2011-06-27 13:49:39

PLSQL DevelopOracle

2012-05-31 09:02:24

Win7Win8

2010-05-31 10:52:43

IPv6隧道

2011-02-20 18:57:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91国产在线播放 | 九色视频网站 | 国产99久久精品一区二区永久免费 | 日韩精品一区二区三区四区视频 | 中文字幕 欧美 日韩 | 亚洲精品欧美 | 亚洲一区二区在线播放 | 免费黄色a视频 | 日韩精品一区二区三区在线播放 | 蜜桃av一区二区三区 | 午夜免费在线电影 | 毛片网站在线观看 | 免费99精品国产自在在线 | 欧美中文在线 | 国产乡下妇女做爰 | 国产成人精品免高潮在线观看 | 国产精品久久久久久影院8一贰佰 | 91极品尤物在线播放国产 | 情侣黄网站免费看 | av影片在线 | 日本一区二区三区免费观看 | 91免费看片 | 亚州综合在线 | 中文字幕一区二区三区不卡 | 99久久婷婷国产综合精品电影 | 久久久亚洲综合 | 久草成人 | 中文字幕电影在线观看 | 波多野结衣av中文字幕 | 精品久久久久久久久久 | 天天综合成人网 | 国产精品一区二 | 日韩欧美中文字幕在线观看 | 毛片免费在线 | 人人爽人人爽人人片av | 一区二区三区国产视频 | 成年人的视频免费观看 | 亚洲视频二区 | 日韩免费视频一区二区 | 天天澡天天狠天天天做 | 日本精a在线观看 |