ELAM驅動程式(優先啟動反病毒驅動程式)
WDK中ELAM驅動示例
從MSDN中摘抄的關於這種驅動的簡介。連結
簡介
從Windows8起,微軟為反病毒軟體增加的新的驅動型別:Early-Lunch Anti-Malware驅動(ELAM驅動)。這種驅動啟動的比其他boot型別的驅動更加早並且提供了回撥向ELAM驅動通知正在被載入的普通boot型驅動,以讓反病毒軟體有機會在boot型驅動載入前檢測並決定是否載入這些驅動。
前提條件
ELAM驅動的安裝
ELAM驅動的啟動型別為SERVICE_BOOT_START,表示驅動由winload載入並隨核心的初始化啟動。啟動組(LoadOrderGroup )則需要設定為Early-Launch表示這是個早期啟動驅動。
因為ELAM驅動不能擁有任何裝置物件,所以它不能作為PNP驅動安裝,否則PNP管理器傳遞的PDO將導致未知的行為。
驅動初始化
Winload會在將執行權交給核心前載入所有的啟動型驅動和依賴的DLL。啟動型驅動表示需要在磁碟裝置棧初始化前載入的驅動,包括磁碟驅動,卷管理驅動,檔案系統驅動和匯流排驅動。
ELAM驅動可用回撥
登錄檔回撥
優先啟動驅動可以用登錄檔回撥來監控和驗證每個啟動型驅動的配置資訊。這些回撥包括CmRegisterCallbackEx, CmRegisterCallback和 CmUnRegisterCallback。
啟動型驅動通知回撥
PNP管理器提供了一個新的回撥供ELAM驅動使用。這個回撥允許反病毒驅動校驗每一個啟動型驅動和其依賴的DLL。PNP管理器用對應的策略來決定每一個驅動是否需要初始化。預設情況下,非法驅動不會被載入,但策略可以被配置成載入非法驅動或者阻止未知驅動。這個回撥也用來向反病毒驅動提供Windows到ELAM驅動的狀態變化,包括所有啟動型驅動均被載入和這個回撥不再起作用的狀態。
ELAM驅動可以使用
狀態變化型別的回撥返回錯誤碼時,將導致系統錯誤並觸發bug check。這可以讓ELAM驅動向使用者表明當前啟動行為不符合反病毒策略,比如,如果反病毒軟體的其他型別驅動未能載入,則其ELAM驅動可以Windows啟動失敗以阻止系統進入沒有反病毒保護的狀態。
映像載入型別的回撥
兩種型別的回撥在回撥函式中提供了同樣型別的系統上下文結構。狀態變化型別回撥只是簡單的提供了狀態列舉值,而映像載入回撥則包含了關於映像的hash資訊和certificate資訊。同時這個上下文結構也提供了一個欄位來作為輸出引數。
Malware Signatures??
ELAM驅動的解除安裝
當狀態變化回撥傳遞的回撥值是BdCbStatusPrepareForUnload時,表示所有啟動型驅動均已載入,ELAM驅動將不再起效,可以被解除安裝。這是可以解除安裝所有已經註冊的回撥,但不能在這個回撥中完成,而要在DriverUnload中完成。
初始化驅動
一旦啟動型驅動被ELAM檢測到,核心會根據回撥的返回值來決定是否載入驅動,這個返回值被儲存在登錄檔的HKLM\System\CurrentControlSet\Control\EarlyLaunch\DriverLoadPolicy下。
這個可以在域控客戶端中被組策略修改。如下值定義了DriverLoadPolicy
- PNP_INITIALIZE_DRIVERS_DEFAULT 0x0 (initializes known Good drivers only)
- PNP_INITIALIZE_UNKNOWN_DRIVERS 0x1
- PNP_INITIALIZE_BAD_CRITICAL_DRIVERS 0x3 (this is the default setting)
- PNP_INITIALIZE_BAD_DRIVERS 0x7
啟動失敗
如果一個啟動型驅動被載入策略阻止,核心會繼續載入其他的啟動型驅動,直到所有驅動均被載入,或者因為被阻止載入驅動是關鍵驅動而導致啟動失敗。如果在磁碟裝置棧建立後傳送崩潰,會生成崩潰dump檔案,其中包含了崩潰的原因和導致崩潰的驅動。
啟動檢測
如果ELAM驅動發現了非法事件(rootkit),他可以通過Tbsi_Revoke_Attestation來禁用PCR結構中表示系統狀態良好的欄位。