目標
本實驗中將學習:
• 識別用戶界面權限隔離(UIPI)問題
• 修復UIPI問題
系統要求
完成本實驗需要如下軟件
• Microsoft Visual Studio 2008 SP1
• Microsoft Windows 7
• Process Explorer from Windows Sysinternals (www.microsoft.com/technet/sysinternals)
練習 #1 :識別 UIPI
在本練習中將研究兩個通過windows消息進行通信的進程,但由於不同的完整性 級別它們之間的通信會失敗(至少有一個方向)
任務 1 – 確認UAC 激活
在這個任務中要確用戶權限控制(UAC)是激活狀態 。這將允許顯示問題。
1.點擊 Start:
a.點擊Control Panel,
b.點擊 User Accounts and Family Safety.
c.占擊 User Accounts.
d.點擊 Change User Account Control Settings,此時顯示一個類似於下圖的對話框:
幫助
你也可以通執行:點擊 Start,點擊Run,輸入UAC。點擊Change User Account Control Settings。
2.確認滑動條如圖所示設置為default級別(也可以設置一個別的非Never notify的級別 ,因為這會禁用UAC)
3.點擊 OK。
任務 2 —識別問題
1.轉到PingPongBroken\Debug文件夾。
2.雙擊BrokenNativePingPong.exe文件。顯示一個空白窗口。
3.再次雙擊BrokenNativePingPong.exe文件。如下圖所示,可以看到信息“Ping Pong,” 在兩個窗口之間跳動:
幫助
這是一個正確的行為。兩個進程都使用同一個完整性級別的標准用戶權限。在下一步操作 中可以確認這個。
4.打開來自Windows Sysinternals的Process Explore。(可以從 www.microsoft.com/technet/sysinternals安裝Process Explorer).
5.右擊進程查看頭
6.如下圖所示選擇Select Columns 。
7.確認Integrity Level復選框被選中,否則將難以完成本實驗。
8.點擊 OK確認 你的選擇。
9.轉到 BrokenNativePingPong.Exe 進程查看其完整性級別
幫助
值應為medium。這是標准用戶啟動的進程的默認完整性級別。
10.關 閉Ping Pong窗口。
11.雙擊 BrokenNativePingPong.Exe象之前一樣運行第一個進程 。
12.對於第二個進程右擊它
13.點擊Run as administrator
14.同意 UAC的提示信息。(或者也可以雙擊ManagedPingPongLoader.exe ,則這樣兩個步驟都已完成 )
注意
此時 “Ping Pong,”消息已經無法工作了。
15.象之前那樣打開Process Explorer查看它們的完整性級別:
幫助
由於是作為管理員運行,其進程現在以high而非normal的完整性級別在運行。導致問題出 現。進程不能將windows 消息發送到另一個具有更高完整性級別的進程
16.關閉兩個 Ping Pong窗口。
練習 #2: 解決UIPI 問題
任務 1 –浏覽Ping Pong 示例
本任務通過研究Visual Studio解決方案來理解代碼所做的工作。
1.雙擊PingPongBroken解決方案
幫助
Visual Studio 2008啟動並裝載解決方案。解決方案包含四個工程:兩個本地的兩個托管 。每一對Ping Pong應用程序和一個便捷裝載器使用標准用戶權限啟用一個進程,使用管理員 權限啟用另一個進程。
2.右擊PingPong.cpp文件
PingPongDlgProc函數就是模態對話框過程處理大量的工作。為了正確地合作, RegisterWindowsMessage函數獲取全局(從技術上講,是進程的windows工作站全局)消息id 用於進行內部進程間的通信。結果消息uMsgBall 則是兩個進程間的窗口發關的消息。
3.WinMain函數通過搜索同名窗查找同一可執行程序的另一個實例(使用FindWindow 函數 )
4.計時器用於在消息發送之間等待500毫秒
任務2 —修復代碼
PostMessage函數用於在當它的目標消息是通向一個具有更高權限級別的進程中時傳遞失 敗信息。無論如何,我們可以使用消息過濾器使某些消息得以穿過。
1.當消息注冊到WM_INITDIALOG處理器,使用 ChangeWindowFilter函數使注冊成功的消息 通過而不用理會權限級別。
2.添加一個帶MSGFLT_ADD參數的對此方法的調用,以將消息添加到過濾器。代碼看起來是 如下這個樣子:
C++
uMsgBall = RegisterWindowMessage(sMessageBall);
if(!uMsgBall) return FALSE;
// allow our message to come in even if sent by lower privilege
// process
ChangeWindowMessageFilter(uMsgBall, MSGFLT_ADD);
3.編譯工程並用NativePingPongLoader.Exe對其進行測試。
如果一切順利程序此時應該可以正確工作了。完整的解決方案在文件夾PingPongFixed中 。
總結
本實驗中學習了如何使用Process Explorer診斷UIPI問題,並使得應用程序中的消息穿過 限制到達更高級別的權限。