久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

<轉(zhuǎn)>VC++實現(xiàn)Vista和Win7系統(tǒng)低權(quán)限程序向高權(quán)限程序發(fā)消息

 JP_Morgen 2014-05-18

Windows 7已經(jīng)隆重發(fā)布,,但是很多程序員已經(jīng)通過RTM等版本嘗到了Windows 7的甜處,。那么在Windows 7下用戶界面特權(quán)隔離,將是本文我們介紹的重點,。

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

用戶界面特權(quán)隔離

在早期的Windows操作系統(tǒng)中,,在同一用戶下運行的所有進程有著相同的安全等級,,擁有相同的權(quán)限。例如,,一個進程可以自由地發(fā)送一個Windows消息到另外一個進程的窗口,。從Windows Vista開始,當然也包括Windows 7,,對于某些Windows消息,,這一方式再也行不通了。進程(或者其他的對象)開始擁有一個新的屬性——特權(quán)等級(Privilege Level),。一個特權(quán)等級較低的進程不再可以向一個特權(quán)等級較高的進程發(fā)送消息,,雖然他們在相同的用戶權(quán)限下運行。這就是所謂的用戶界面特權(quán)隔離(User Interface Privilege Isolation ,,UIPI),。

UIPI的引入,最大的目的是防止惡意代碼發(fā)送消息給那些擁有較高權(quán)限的窗口以對其進行攻擊,,從而獲取較高的權(quán)限等等,。這就像一個國家,原本人人平等,,大家之間可以互相交流問候,,但是后來壞人多了,為了防止壞人以下犯上,,獲得不該有的權(quán)利,,就人為地給每個人劃分等級,等級低的不可以跟等級高的說話交流,。在人類社會,,這是一種令人討厭的等級制度,,但是在計算機系統(tǒng)中,,這卻是一種維護系統(tǒng)安全的合適方式,。

UIPI的運行機制

在Windows 7中,當UAC(User Account Control)啟用的時候,,UIPI的運行可以得到最明顯的體現(xiàn),。在UAC中,當一個管理員用戶登錄系統(tǒng)后,,操作系統(tǒng)會創(chuàng)建兩個令牌對象(Token Object):第一個是管理員令牌,,擁有大多數(shù)特權(quán)(類似于Windows Vista之前的System中的用戶),而第二個是一個經(jīng)過過濾后的簡化版本,,只擁有普通用戶的權(quán)限,。

默認情況下,以普通用戶權(quán)限啟動的進程擁有普通特權(quán)等級(UIPI的等級劃分為低等級(low),,普通(normal),,高等級(high),系統(tǒng)(system)),。相同的,,以管理員權(quán)限運行的進程,例如,,用戶右鍵單擊選擇“以管理員身份運行”或者是通過添加“runas”參數(shù)調(diào)用ShellExecute運行的進程,,這樣的進程就相應地擁有一個較高(high)的特權(quán)等級。

這將導致系統(tǒng)會運行兩種不同類型,,不同特權(quán)等級的進程(當然,,從技術(shù)上講這兩個進程都是在同一用戶下)。我們可以使用Windows Sysinternals工具集中的進程瀏覽器(Process Explorer)查看各個進程的特權(quán)等級,。 (http://www.microsoft.com/technet/sysinternals)

進程瀏覽器

圖1 進程瀏覽器

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

不同特權(quán)等級的同一應用程序

圖2  不同特權(quán)等級的同一應用程序

所以,當你發(fā)現(xiàn)你的進程之間Windows消息通信發(fā)生問題時,,不妨使用進程瀏覽器查看一下兩個進程之間是否有合適的特權(quán)等級,。

UIPI所帶來的限制

正如我們前文所說,等級的劃分,,是為了防止以下犯上,。所以,有了用戶界面特權(quán)隔離,,一個運行在較低特權(quán)等級的應用程序的行為就受到了諸多限制,,它不可以:

驗證由較高特權(quán)等級進程創(chuàng)建的窗口句柄

通過調(diào)用SendMessage和PostMessage向由較高特權(quán)等級進程創(chuàng)建的窗口發(fā)送Windows消息

使用線程鉤子處理較高特權(quán)等級進程

使用普通鉤子(SetWindowsHookEx)監(jiān)視較高特權(quán)等級進程

向一個較高特權(quán)等級進程執(zhí)行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之前的操作系統(tǒng)行為所設計的應用程序,,可能希望Windows消息能夠在進程之間自由的傳遞,以完成一些特殊的工作,。當這些應用程序在Windows 7上運行時,,因為UIPI機制,這種消息傳遞被阻斷了,,應用程序就會遇到兼容性問題,。為了解決這個問題,Windows Vista引入了一個新的API函數(shù)ChangeWindowMessageFilter,。利用這個函數(shù),,我們可以添加或者刪除能夠通過特權(quán)等級隔離的Windows消息。這就像擁有較高特權(quán)等級的進程,,設置了一個過濾器,,允許通過的Windows消息都被添加到這個過濾器的白名單,只有在這個白名單上的消息才允許傳遞進來,。

如果我們想容許一個消息可以發(fā)送給較高特權(quán)等級的進程,,我們可以在較高特權(quán)等級的進程中調(diào)用ChangeWindowMessageFilter函數(shù),以MSGFLT_ADD作為參數(shù)將消息添加進消息過濾器的白名單,。同樣的,,我們也可以以MSGFLT_REMOVE作為參數(shù)將這個消息從白名單中刪除。

消息包括2中,,系統(tǒng)消息的發(fā)送和用戶自定義消息的發(fā)送,。

對于系統(tǒng)消息的處理,非常簡單,,接受消息的進程需要將該消息加入到白名單中,,可以通過下面的代碼實現(xiàn):

需要在高權(quán)限程序開始的地方加入以下代碼,指定什么消息可以接受

  1. typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD);  
  2.   
  3. BOOL CVistaMsgRecvApp::AllowMeesageForVista(UINT uMessageID, BOOL bAllow)//注冊Vista全局消息  
  4.   
  5. {  
  6.   
  7.      BOOL bResult = FALSE;  
  8.   
  9.      HMODULE hUserMod = NULL;  
  10.   
  11.      //vista and later  
  12.   
  13.      hUserMod = LoadLibrary( L"user32.dll" );  
  14.   
  15.      if( NULL == hUserMod )  
  16.   
  17.      {  
  18.   
  19.          return FALSE;  
  20.   
  21.      }  
  22.   
  23.      _ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );  
  24.   
  25.      if( NULL == pChangeWindowMessageFilter )  
  26.   
  27.      {  
  28.   
  29.          AfxMessageBox(_T("create windowmessage filter failed"));  
  30.   
  31.          return FALSE;  
  32.   
  33.      }  
  34.   
  35.      bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2  
  36.   
  37.      if( NULL != hUserMod )  
  38.   
  39.      {  
  40.   
  41.          FreeLibrary( hUserMod );  
  42.   
  43.      }  
  44.   
  45.      return bResult;  
  46.   
  47. }  



對于自定義消息,通常是指大于WM_USER的消息,,我們首先必須在系統(tǒng)中注冊該消息,,然后在調(diào)用上面的代碼:

#define WM_MYNEWMESSAGE (WM_USER + 999)
UINT uMsgBall=::RegisterWindowMessage (WM_MYNEWMESSAGE )

if(!uMsgBall) 

    return FALSE;

注冊消息通過RegisterWindowMessage實現(xiàn),函數(shù)的參數(shù)就是你需要注冊的消息值,。

 

此時,,低等級的進程就可以像高等級的進程發(fā)送消息了。


Miibotree發(fā)話了~~~~:

上面轉(zhuǎn)載的東西講的真的很清楚,。自己親手實踐了一下,。成功了。其實說白了就是一個函數(shù)的問題,。

使用這個函數(shù)我們不能忽視下面幾個關(guān)鍵:

1.這個函數(shù)必須是寫在高權(quán)限的一方,。

2.來看下這個函數(shù):

BOOL WINAPI ChangeWindowMessageFilter(
  __in  UINT message,
  __in  DWORD dwFlag
);

Parameters

message [in]

Type: UINT

The message to add to or remove from the filter.

dwFlag [in]

Type: DWORD

The action to be performed. One of the following values.

Value Meaning
MSGFLT_ADD
1

Adds the message to the filter. This has the effect of allowing the message to be received.

MSGFLT_REMOVE
2

Removes the message from the filter. This has the effect of blocking the message.

 

Return value

Type:

Type: BOOL

TRUE if successful; otherwise, FALSE. To get extended error information, call GetLastError.

非常清楚了。大家可以自己動手實踐一下了~~

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多