首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 7 開發實戰:UIPI (使用者介面特權隔離) 診斷與修復 — 管理代碼篇

     編輯:關於.NET

實驗目標

  • 識別 UIPI (User Interface Privilege Isolation) 導致的跨完整性層級通訊失敗
  • 掌握 ChangeWindowMessageFilter 讓指定訊息穿透權限邊界
  • 實作 Ping-Pong 範例驗證修復成效

系統需求

  • Microsoft Visual Studio 2008 SP1
  • Microsoft Windows 7
  • Process Explorer (Sysinternals)

練習一:識別 UIPI 問題

任務 1:確認 UAC 已啟用

  1. 開始 → 控制台 → 使用者帳戶與家庭安全 → 使用者帳戶 → 變更使用者帳戶控制設定
  2. 確認滑桿設為 預設 或任一非 從不通知 的等級(從不通知 會停用 UAC)
  3. 點擊 確定
UAC 設定對話框

任務 2:重現跨完整性層級通訊失敗

  1. 進入 PingPongBroken\Debug 資料夾
  2. 雙擊 BrokenManagedPingPong.exe 啟動第一個視窗
  3. 再次雙擊啟動第二個視窗 → 觀察「Ping Pong」訊息正常在兩視窗間跳動(同完整性層級)
正常 Ping Pong 通訊
雙視窗互動
  1. 開啟 Process Explorer → View → Select Columns → 勾選 Integrity Level
選擇 Integrity Level 欄位
Process Explorer 顯示完整性層級
  1. 關閉視窗,重新啟動第一個執行個體(標準權限,Medium)
  2. 第二個執行個體:右鍵 → 以系統管理員身分執行(High 完整性層級)
  3. 觀察:「Ping Pong」訊息完全停止運作
  4. Process Explorer 確認:第一個進程 Medium,第二個進程 High
High 完整性層級進程

核心原因:UIPI 禁止低完整性層級進程向高完整性層級進程發送視窗訊息(PostMessage/SendMessage)。

練習二:修復 UIPI 問題

任務 1:瀏覽 PingPongBroken 方案結構

  • 方案包含 4 專案:2 個原生 (Native)、2 個受控
  • 每對 Ping Pong 應用程式 + 1 個 Loader(啟動一標準、一管理員權限進程)
  • 關鍵程式碼在 PingPongForm.cs:NativeWrappers 類別封裝 RegisterWindowMessage、PostMessage
  • WindowProc 多載處理訊息,Timer 每 500ms 發送
  • Main 透過 FindWindow (P/Invoke) 尋找同名視窗

任務 2:實作訊息過濾器修復

步驟 1:加入 P/Invoke 包裝器

public enum ChangeWindowMessageFilterFlags : uint {
    Add = 1, Remove = 2
};

[DllImport("user32")]
public static extern bool ChangeWindowMessageFilter(uint msg,
    ChangeWindowMessageFilterFlags flags);

步驟 2:在訊息註冊成功後呼叫過濾器

_message = NativeWrappers.RegisterWindowMessage("BALL");
if (_message == 0) Close();
else {
    NativeWrappers.ChangeWindowMessageFilter(_message,
        NativeWrappers.ChangeWindowMessageFilterFlags.Add);
    NativeWrappers.PostMessage(Program.hOtherForm, _message, Handle, IntPtr.Zero);
}

步驟 3:編譯並用 ManagedPingPongLoader.exe 測試

修復後,Medium 進程發送的自訂訊息即可穿透至 High 進程,Ping Pong 通訊恢復正常。完整解決方案位於 PingPongFixed 資料夾。

關鍵概念總結

概念說明
UIPI使用者介面特權隔離,阻擋低 IL 進程向高 IL 進程傳送視窗訊息
Integrity LevelLow / Medium / High / System,標準使用者預設 Medium,管理員啟動為 High
ChangeWindowMessageFilterVista 引入 API,允許特定訊息 ID 穿越 IL 邊界(進程級)
ChangeWindowMessageFilterExWindows 7 新增,可針對特定視窗控制(更精細)
永遠允許的訊息WM_NULL, WM_MOVE, WM_SIZE, WM_GETTEXT, WM_GETTEXTLENGTH, WM_GETHOTKEY, WM_GETICON, WM_RENDERFORMAT, WM_DRAWCLIPBOARD, WM_CHANGECBCHAIN, WM_THEMECHANGED 等

工具與資源

  • Process Explorer:下載
  • 完整修復範例:PingPongFixed 資料夾
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved