前言
在現代 Windows 安全架構中,Antimalware Scan Interface(AMSI)扮演著至關重要的角色。作為 Microsoft 在 Windows 10 中引入的安全機制,AMSI 提供了一個標準化的介面,讓防毒軟體能夠在腳本執行前進行掃描,有效防止惡意腳本的執行。
本文將從資安防禦研究的角度,深入分析 AMSI 的運作原理與潛在的繞過技術。了解這些技術的目的是為了協助資安人員建立更完善的防禦機制,識別並阻止潛在的攻擊行為。
免責聲明:本文內容僅供教育與研究目的。未經授權對系統進行攻擊或繞過安全機制屬於違法行為。請僅在授權的測試環境中進行研究。
什麼是 AMSI?
AMSI 概述
AMSI(Antimalware Scan Interface)是 Microsoft 於 Windows 10(Build 1607)開始引入的安全機制,主要目的是提供一個統一的介面,讓應用程式能夠將內容傳送給系統中安裝的防惡意軟體產品進行掃描。
AMSI 特別針對以下情境設計:
- 腳本引擎整合:PowerShell、JavaScript、VBScript 等腳本引擎在執行程式碼前會先透過 AMSI 進行掃描
- 無檔案攻擊防護:即使惡意程式碼僅存在於記憶體中,AMSI 仍能進行掃描
- 混淆程式碼偵測:AMSI 能夠掃描最終解碼/解混淆後的程式碼內容
AMSI 支援的應用程式
目前整合 AMSI 的 Windows 元件包括:
| 元件 | 說明 |
|---|---|
| PowerShell | 版本 3.0 以上的所有腳本執行 |
| Windows Script Host | wscript.exe 和 cscript.exe |
| JavaScript/VBScript | 透過 Scripting Host 執行的腳本 |
| Office VBA Macros | Office 巨集程式碼 |
| .NET Framework | 版本 4.8 以上的動態程式碼載入 |
| Windows Management Instrumentation (WMI) | WMI Script 執行 |
AMSI 架構與運作原理
整體架構
AMSI 的架構可分為三個主要層級:
| |
核心 API 函數
AMSI 提供以下核心 API 函數:
1. AmsiInitialize
| |
初始化 AMSI API,建立應用程式與 AMSI 之間的連接。
2. AmsiOpenSession
| |
開啟一個新的 AMSI Session,用於後續的掃描操作。此函數是本文分析的重點。
3. AmsiScanBuffer / AmsiScanString
| |
將緩衝區內容送交防毒引擎進行掃描。
4. AmsiCloseSession / AmsiUninitialize
用於關閉 Session 和釋放 AMSI 資源。
AMSI 掃描流程
當 PowerShell 執行腳本時,AMSI 的運作流程如下:
- 初始化階段:PowerShell 啟動時呼叫
AmsiInitialize()建立 AMSI Context - Session 建立:執行腳本前呼叫
AmsiOpenSession()建立掃描 Session - 內容掃描:透過
AmsiScanBuffer()或AmsiScanString()將腳本內容送交掃描 - 結果判定:根據
AMSI_RESULT決定是否允許執行 - Session 關閉:掃描完成後關閉 Session
AMSI_RESULT 回傳值
| |
為什麼研究 AMSI 繞過對資安防禦很重要?
攻防對抗的本質
資訊安全是一場持續的攻防對抗。了解攻擊者可能使用的技術,是建立有效防禦機制的基礎。研究 AMSI 繞過技術的重要性在於:
- 威脅情報蒐集:了解最新的繞過技術,才能及時更新防禦策略
- 防禦機制強化:透過分析繞過原理,找出防禦機制的盲點並加以改善
- 入侵偵測改進:開發針對繞過行為的偵測規則
- 紅隊演練準備:在授權的滲透測試中模擬真實攻擊場景
常見的 AMSI 繞過類別
目前已知的 AMSI 繞過技術可分為以下幾類:
| 類別 | 方法 | 說明 |
|---|---|---|
| 記憶體修補 | Patching amsi.dll | 直接修改記憶體中的 AMSI 函數 |
| 強制錯誤 | AmsiInitFailed | 使 AMSI 初始化失敗 |
| COM Hijacking | Registry Modification | 劫持 AMSI COM 物件 |
| 反射載入 | Reflection | 透過反射修改 AMSI 相關欄位 |
| CLR Hooking | Hooking ScanContent | Hook CLR 中的掃描函數 |
AmsiOpenSession 技術分析
說明
AmsiOpenSession 是 amsi.dll 檔案中的一個功能,作為 Windows 中反惡意軟體掃描介面(AMSI)的一部分提供。AmsiOpenSession 功能用於為呼叫應用程式創建新的 AMSI Session。
AmsiOpenSession 功能可用於通過設置 Session 的內容和行為來配置 AMSI Session。例如,應用程式可以設定 Session 的內容,以指定正在掃描的資料的內容類型,例如 Script 或 Binary 資料。
反組譯分析
以下是 amsi.dll 中反組譯 AmsiOpenSession 功能的分析:

組合語言層級分析
在 AmsiOpenSession 函數的開頭,有一段關鍵的驗證邏輯:
| |
指令說明
TEST 指令:
test rcx, rcx執行位元 AND 運算(rcx AND rcx),結果不儲存,僅更新旗標暫存器- 如果 RCX = 0,則 ZF(Zero Flag)= 1
- 如果 RCX ≠ 0,則 ZF = 0
JE 指令:Jump if Equal(當 ZF = 1 時跳轉)
- 跳轉目標
0x180008244是錯誤處理分支 - 該分支會回傳錯誤碼
0x80070057(E_INVALIDARG)
- 跳轉目標
記憶體結構說明
amsiContext 結構
AMSI Context 在記憶體中的大致結構:
| |
amsiSession 結構
| |
繞過原理
如果將 JE(Jump if Equal)指令修改為 JNE(Jump if Not Equal),則邏輯將被反轉:
- 原始邏輯:參數為 NULL 時跳轉至錯誤處理
- 修改後邏輯:參數為 NULL 時繼續執行,有效參數時反而進入錯誤處理
由於大多數情況下參數不為 NULL,這將導致 AMSI Session 無法正常建立,進而使後續的掃描操作失敗。
指令修改對照
| 指令 | OpCode | 行為 |
|---|---|---|
| JE (Jump if Equal) | 0x74 | ZF=1 時跳轉 |
| JNE (Jump if Not Equal) | 0x75 | ZF=0 時跳轉 |
修改只需將單一位元組從 0x74 改為 0x75。
防禦建議
如何偵測 AMSI 繞過嘗試
1. 事件日誌監控
監控 Windows 事件日誌中的可疑活動:
| |
建議啟用 PowerShell 腳本區塊記錄:
| |
2. 記憶體完整性監控
使用 Endpoint Detection and Response(EDR)解決方案監控:
- amsi.dll 的記憶體完整性
- 可疑的記憶體寫入操作
- 程序對 amsi.dll 的非預期存取
3. ETW(Event Tracing for Windows)監控
監控 AMSI 相關的 ETW Provider:
| |
4. 行為分析指標
可疑的行為模式包括:
- 程序嘗試取得 amsi.dll 的記憶體位址
- 使用 VirtualProtect 修改 amsi.dll 的記憶體保護屬性
- 對 amsi.dll 函數進行 inline hooking
YARA 規則範例
| |
相關防護措施建議
組織層級
強化 PowerShell 安全設定
- 啟用 Constrained Language Mode
- 實施 AppLocker 或 WDAC 原則
- 限制 PowerShell 執行原則
實施最小權限原則
- 限制本機管理員權限
- 使用 JIT(Just-In-Time)管理存取
部署進階威脅防護
- 使用支援 AMSI 的防毒解決方案
- 部署 EDR 解決方案
- 啟用 Microsoft Defender Credential Guard
技術控制
啟用 Windows Defender Exploit Guard
1 2# 啟用記憶體完整性保護 Set-ProcessMitigation -System -Enable DEP,SEHOP設定 PowerShell 記錄
1 2 3 4 5 6# 啟用模組記錄 $basePath = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell' Set-ItemProperty -Path "$basePath\ModuleLogging" -Name EnableModuleLogging -Value 1 # 啟用腳本區塊記錄 Set-ItemProperty -Path "$basePath\ScriptBlockLogging" -Name EnableScriptBlockLogging -Value 1監控可疑的 DLL 載入
- 使用 Sysmon 監控 ImageLoad 事件
- 特別關注對 amsi.dll 的操作
Sysmon 設定範例
| |
結論
AMSI 作為 Windows 的重要防禦機制,在阻止腳本類型的惡意程式方面發揮著關鍵作用。然而,如同所有的安全機制,AMSI 並非無懈可擊。透過深入了解其運作原理和潛在的繞過技術,資安防禦人員能夠:
- 更好地理解攻擊者的技術手段
- 建立更全面的防禦策略
- 開發更有效的偵測機制
- 及時應對新型態的威脅
防禦不僅僅是部署工具,更重要的是理解威脅本質並建立縱深防禦體系。
參考資料
官方文件
研究文章
- AMSI Bypass - New Way 2023
- AmsiBypass-OpenSession GitHub Repository
- Microsoft AMSI - How Windows Protects Against Malicious Scripts
防禦資源
- MITRE ATT&CK - Impair Defenses: Disable or Modify Tools (T1562.001)
- SANS - Detecting AMSI Bypass Techniques
- Microsoft Defender for Endpoint - Advanced Hunting
工具
本文最後更新:2023-06-14
本文僅供教育與研究目的,請遵守相關法律法規。