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

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

     編輯:關於.NET

實驗目標

  • 識別原生 C++ 應用程式中的 UIPI 通訊阻斷
  • 使用 ChangeWindowMessageFilter (原生 API) 讓自訂訊息穿透權限邊界
  • 驗證修復前後行為差異

系統需求

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

練習一:識別 UIPI 問題

任務 1:確認 UAC 已啟用

同管理代碼版:控制台 → 使用者帳戶控制設定 → 確認非「從不通知」。

UAC 設定

任務 2:重現原生版 Ping Pong 失效

  1. 執行 BrokenNativePingPong.exe 兩次 → 兩視窗正常交換「Ping Pong」訊息(皆為 Medium IL)
  2. Process Explorer 加入 Integrity Level 欄位確認
選擇 Integrity Level
Process Explorer 欄位設定
Medium IL 進程
  1. 關閉視窗,重啟第一個執行個體(標準權限)
  2. 第二個執行個體:右鍵 → 以系統管理員身分執行(High IL)
  3. 觀察:訊息傳遞失效
  4. Process Explorer 確認:第二個進程現為 High 完整性層級
High IL 進程

練習二:修復 UIPI 問題 (C++ 實作)

任務 1:瀏覽原生代碼結構

  • PingPong.cpp 核心邏輯在 PingPongDlgProc 對話框程序
  • RegisterWindowMessage 取得全域訊息 ID (uMsgBall)
  • WinMain 用 FindWindow 尋找另一執行個體視窗
  • Timer 每 500ms 發送訊息

任務 2:在 WM_INITDIALOG 加入訊息過濾器

uMsgBall = RegisterWindowMessage(sMessageBall);
if (!uMsgBall) return FALSE;

// 允許我們的訊息即使由低權限進程發送也能通過
ChangeWindowMessageFilter(uMsgBall, MSGFLT_ADD);

關鍵點:MSGFLT_ADD 將訊息加入允許清單,MSGFLT_REMOVE 移除。Windows 7 另提供 ChangeWindowMessageFilterEx 可針對特定 HWND 設定。

任務 3:編譯並用 NativePingPongLoader.exe 測試

修復後,Medium 進程發送的 uMsgBall 成功送達 High 進程,通訊恢復正常。完整解決方案在 PingPongFixed。

UIPI 限制速查表

被阻擋的操作 (低 IL → 高 IL)永遠允許的訊息 (部分)
  • 驗證/傳送訊息到高 IL 視窗 (SendMessage/PostMessage)
  • 執行緒鉤子附加高 IL 進程
  • 日誌鉤子監視高 IL 進程 (SetWindowsHookEx)
  • DLL 注入高 IL 進程
  • WM_NULL (0x000)
  • WM_MOVE (0x003)
  • WM_SIZE (0x005)
  • WM_GETTEXT (0x00D)
  • WM_GETTEXTLENGTH (0x00E)
  • WM_GETHOTKEY (0x033)
  • WM_GETICON (0x07F)
  • WM_RENDERFORMAT (0x305)
  • WM_DRAWCLIPBOARD (0x308)
  • WM_CHANGECBCHAIN (0x30D)
  • WM_THEMECHANGED (0x31A)

總結

原生與受控代碼面對 UIPI 的核心挑戰相同:跨完整性層級的視窗訊息預設被阻擋。解決之道統一為「註冊自訂訊息 → 加入訊息過濾器允許清單」。原生版直接呼叫 ChangeWindowMessageFilter,受控版需 P/Invoke 包裝。掌握 Process Explorer 觀察 IL 欄位,是快速定位此類問題的關鍵技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved