SecTor 2025 | How Adversaries Beat User-Mode Protection Engines for Over a Decade
三句話摘要
攻擊者如何透過三大戰術繞過端點安全產品的 User Mode Hook 監控機制。 --- User Mode Hook 是目前最主流的端點監控機制,但它與攻擊者同處一個權限層的先天缺陷,使得任何純 User Mode 的防護策略都必然存在可被繞過的系統性弱點,Call Stack 異常分析是目前防守方最可行的偵測支點。 1. User Mode Hook 的根本缺陷在於自我保護能力
重點整理
重點- 1
1. User Mode Hook 的根本缺陷在於自我保護能力
- 2
安全產品選擇 User Mode 是因為開發穩定、無 Patch Guard 限制、且可取得完整應用層明文(如 TLS 解密後的流量)。但這同時意味著攻擊者只要有相同權限,就能對抗這套機制——這是架構層面無法迴避的矛盾。
- 3
2. Hook 規避技術的核心邏輯是「取得未被污染的原始指令」
- 4
無論是二次載入乾淨 DLL、從其他未被監控的程序記憶體竊取原始碼,還是直接呼叫 Syscall Index 跳過 NTDLL,攻擊者的目標都是繞過安全廠商在記憶體中植入的跳轉指令,本質手法高度重疊。
- 5
3. Direct Syscall 是最難偵測的繞過手法
- 6
攻擊者可透過解析 NTDLL、計算導出函式排列順序、解析 Kernel 二進位或硬編碼 Index 等方式取得 Syscall 號碼後直接觸發核心轉換,完全跳過所有 Hook。若系統啟用 VBS,預設使用 `INT2E` 而非 `SYSCALL` 指令,這也是一個可額外利用的差異點。
- 7
4. Call Stack 是目前最有效的行為偵測信號
- 8
幾乎所有 Hook 規避手法都會在 Call Stack 上留下異常特徵——浮動的匿名記憶體區段、不符合預期的模組路徑、過短的呼叫鏈。防守方應以 Call Stack 分析作為主要運行時偵測基礎,並可搭配 CET Shadow Stack 對抗偽造。
- 9
--
實用技巧與重點
乾貨- 數字與時間線
- 2018 年起出現系統性繞過 User Mode Hook 的技術爆發趨勢
- Hook 規避技術粗分 4 大類,約 20 種具體變體
- 繞過 User Mode Hook 的技術數量甚至多於代碼注入技術數量
- 工具與框架
- Frida Toolkit(Hook 框架,防守方與惡意軟體分析師通用)
- Cape / Cuckoo(沙箱分析工具,使用 Inline Hook)
- Volatility Plugin(記憶體取證,可偵測 Unhooking,去年發布)
- MITRE ATT&CK(目前僅在一個段落覆蓋 Binary Restoration 與 Engine Disarming,覆蓋不完整)
- 技術名稱與分類
- | 類別 | 具體方法 |
- |------|----------|
- | Secondary DLL Mapping | Reflective Loading、Clone & Load、Section Remapping |
- | Binary Restoration / Unhooking | 從其他程序記憶體複製、Suspended Child Process、Section Refresh、Short Circuiting |
- | Direct Syscall Invocation | 解析 NTDLL、計數排序法、Heaven's Gate(32→64位元)、解析 Kernel ntoskrnl.exe、Bring Your Own Index、動態解析(硬體中斷點 + Exception Handler) |
- | Code Splicing / Byte Stealing | 載入原始 Stub 至浮動記憶體、Stub Reuse |
- | 參數置換(TOCTOU) | Hardware Breakpoint + Exception Handler 置換參數 |
- | 引擎除役 | FreeLibrary 卸載、Unmap DLL、Process Mitigation 限制載入、Preload 控制生命週期 |
- Syscall 技術細節
- Windows 使用 `EAX` 暫存器傳遞 Syscall Index
- 轉換指令:`SYSCALL`(現代)、`INT2E`(舊版,VBS 啟用時回歸為預設)
- NTDLL 導出函式在記憶體中依 Index 升序排列(Microsoft 長期編譯慣例)
- ZW 前綴函式持有 Syscall Index,可用於解析 Kernel 轉換表
- 偵測機會
- 運行時:Call Stack 中出現匿名浮動記憶體、Syscall 指令出現在非系統二進位、硬體中斷點或 Trap Flag 存在但無 Debugger attached
- 取證:DLL 路徑異常但 Header 與大小相同、同一 DLL 出現於兩個不同基底位址、記憶體快照中 Hook 已被移除
- --
結論
結論“User Mode Hook 是目前最主流的端點監控機制,但它與攻擊者同處一個權限層的先天缺陷,使得任何純 User Mode 的防護策略都必然存在可被繞過的系統性弱點,Call Stack 異常分析是目前防守方最可行的偵測支點。”
完整解析
詳細端點安全產品的 User Mode 監控引擎,本質上是一個被注入至受保護程序的 DLL。它透過 Inline Hook——也就是在運行時直接修改記憶體中的函式指令——攔截關鍵 API 呼叫,並在允許繼續執行前進行惡意行為判斷。這套機制之所以被廣泛採用,是因為 User Mode 開發難度低、不受 Windows Kernel Patch Guard 限制,而且能在應用層取得完整的未加密內容(例如 TLS 流量在解密後的明文)。然而,這套機制從誕生之初就帶著一個根本性的矛盾:它與它想要監控的攻擊者處於同一個權限空間。
攻擊者的第一個主要戰術是「Hook 規避」,目標是讓惡意程式碼完全繞過攔截點執行。最直覺的方式是「二次載入乾淨 DLL」——透過 Reflective Loading、磁碟複製、或低階 NT API 的 Section Remapping,在程序記憶體中建立一份沒有 Hook 的 DLL 副本,之後所有 API 呼叫皆透過這個副本發出。更進一步的「Unhooking」技術則直接將已被 Hook 的原始函式還原:攻擊者可從其他未被監控程序的記憶體竊取乾淨程式碼、透過 Section Refresh 將同一模組重新映射至相同基底位址後還原,或是「Short Circuiting」——定位安全廠商自己存放的原始指令 Stub,將 Hook 跳轉目標改寫為那個位址,讓 Hook 自行失效。在這些方法都涉及 System Call 的前提下,攻擊者又衍生出「Direct Syscall Invocation」——直接提取 Syscall Index 並透過 `SYSCALL` 或 `INT2E` 指令轉換至 Kernel 特權模式,完整跳過 NTDLL 中所有的 Hook 層。取得 Index 的方式包含:解析 NTDLL 導出函式的排列順序(Microsoft 長期依 Index 值升序編譯)、利用 Heaven's Gate 讓 32 位元程序直接呼叫 64 位元原生 DLL、解析 Kernel 二進位 `ntoskrnl.exe` 中的 ZW 函式,乃至硬編碼各 OS 版本對應的 Index 值(Bring Your Own Index)。
第二個戰術「參數置換」則採取完全不同的思路:攻擊者不試圖繞過 Hook,而是讓 Hook 正常執行,但在安全引擎完成檢查、將控制權交回目標函式的那一瞬間,偷換成惡意參數。這是一種典型的 TOCTOU(Time-of-Check to Time-of-Use)漏洞利用模式。攻擊者透過硬體中斷點或單步執行(無需修改任何記憶體)找到安全引擎回傳的指令位址,先以良性參數呼叫函式通過檢查,在斷點觸發後由 Exception Handler 將參數替換為惡意版本再繼續執行。防守方的反制手段是在 Hook 內主動偵測硬體中斷點的存在或 Trap Flag 的啟用——在沒有 Debugger 連接的情況下,這些特徵高度可疑。
第三個戰術「引擎除役」目標更直接:讓安全 DLL 根本無法正常運作。方法包含呼叫 `FreeLibrary` 強制卸載、透過 Process Mitigation 限制子程序只能載入 Microsoft 簽章程式碼(安全廠商的 DLL 自然無法通過),或在子程序啟動早期透過 API 控制載入順序,主動攔截並阻止安全 DLL 被初始化。針對這類攻擊,防守方若在自身引擎中加入狀態監控(偵測自己是否突然消失或停留在未初始化狀態),可在運行時有效識別,但事後取證則相當困難。
整體而言,講者的研究揭示了一個系統性問題:User Mode 保護引擎因為與攻擊者共享執行環境,無法在架構上提供充分的自我保護。目前最有效的防線是對 Call Stack 的即時分析——幾乎所有繞過手法都會在呼叫鏈上留下可識別的異常特徵。更長遠的方向則是搭配硬體層支援(如 Intel CET Shadow Stack)或 Kernel 層的監控能力,才能從根本上縮小這個攻擊面。
---
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

