核心編程隨筆4
Note 1:
在Windows Vista中,係統DLLs是在進程地址空間的隨機地址加載的.所以,不要像在Windows XP中那樣將PEB的地址硬編碼為0x7ffdf000.相反,你需要調用NtQueryInformationProcess,並傳遞ProcessBasicInformation作為參數.別忘了,在一個版本的Windows中發現的未文檔化的細節可能在下一個版本中發生改變.
Note 2:
audiodg.exe(Windows Audio Device Graph Isolation)是一個受保護的進程.這種新的進程類型是從Windows Vista開始引入的.
例如,可以用它為DRM(數字權限保護)應用程序提供更大程度的隔離.另外,理所當然地,遠程進程訪問受保護進程的虛擬內存的權限也被取消了.由於這個權限是列出已加載的DLL所必須的,所以ToolHelp API自然無法返回這些細節了.可從以下網址下載受保護進程的白皮書:https://www.microsoft.com/whdc/system/vista/process_Vista.mspx
Note 3:
Windows Vista還實現了另一個安全機製,即“Windows完整性機製"(Windows Integrity Mechanism),以前稱為“強製完整性控製"(Mandatory Integrity Control).
除了眾所周知的安全描述符(SID)和訪問控製列表(ACL),現在還為一個受保護的資源分配了一個所謂的完整性級別(integrity level),這是通過係統訪問控製列表(SACL)中的一個新增的ACE(訪問控製項)來實現的.凡是沒有這個ACE的安全對象,將被操作係統默認為擁有“中"(Medium)完整性級別.另外,每個進程都有一個基於其安全令牌的完整性級別,它與係統授予的一個信任級別是對應的.
信任級別
級別 應用程序示例
低 保護模式中的Internet Explorer是以“低"信任級別來運行的,它將拒絕從網上下載的代碼修改其他應用程序和Windows環境.
中 默認情況下,所有應用程序都以“中"信任級別來啟動,並使用一個篩選過的令牌來運行.
高 如果以提升後的權限來啟動,會以“高"信任級別來運行.
係統 隻有以Local System或Local Service的身份運行的進程,才能獲得這個信任級別.
代碼試圖訪問一個內核對象時,係統會將主調進程的完整性級別與內核對象的完整性級別進行比較.如果後者高於前者,就拒絕修改和刪除操作.注意,這個比較是在檢查ACL之前就完成的.所以,即便進程擁有訪問資源的權限,但由於它運行時使用的完整性級別低於資源所要求的完整性級別,所以仍會被拒絕訪問.假如一個應用程序要運行從網上下載的代碼或腳本,這個設計就尤其重要.在Windows Vista上運行的Internet
Explorer 7正是利用了這個機製,以“低"完整性級別來運行.這樣一來,下載的代碼就不能更改其他任何應用程序的狀態,因為那些應用程序的進程默認是以“中"完整性級別來運行的.
Note 4:
對於一個高完整性級別的進程內核對象,即使已經設置了"No-Read-Up",另一個完整性級別較低的進程也能在較高完整性地址空間中讀取——隻要向這個進程授予了Debug權限.
Note 5:
除了在進程之間提供內核對象的訪問保護,窗口係統還利用完整性級別來拒絕低完整性級別的進程訪問/更新高完整性級別的進程的用戶界麵.這個機製稱為用戶界麵權限隔離(User Interface Privilege Isolation,UIPI).操作係統將封鎖從完整性級別較低的進程post的(通過PostMessage)、發送的(通過SendMessage)或者攔截的(通過Windows
hook)Windows消息,阻止完整性級別較高的進程擁有的一個窗口獲取信息或者被注入虛假的信息.你可以使用WindowDump這個實用程序來做實驗(https://download.microsoft.com/download/8/3/f/83f69587-47f1-48e2-86a6-aab14f01f1fe/EscapeFromDLLHell.exe)
Note 6:
為了獲得一個列表框的每一項所顯示的文本,WindowDump調用SendMessage函數,並將LB_GETCOUNT作為參數來傳遞,這樣可以獲得要讀取文本內容的元素的數量.隨後,我們調用SendMessage,並將LB_GETTEXT作為參數來獲取文本內容.然而,假如WindowDump進程運行時使用的完整性級別低於擁有列表框的那個進程,那麼第一個SendMessage調用雖然能成功,但會返回0作為元素數量.如果以"中"完整性級別來啟動Spy++,那麼用它獲取一個窗口的消息時,如果那個窗口是由一個較高完整性級別的進程創建的,就會觀察到相同的行為(對結果進行篩選).
最後更新:2017-04-03 15:21:56