1. 程式人生 > >ELAM驅動程式(優先啟動反病毒驅動程式)

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驅動可以使用

IoRegisterBootDriverCallbackIoUnRegisterBootDriverCallback來註冊啟動型驅動通知回撥。   這個回撥函式的格式和通用的EX_CALLBACK_FUNCTION一樣,第一個引數是指向使用者提供的上下文的指標,第二個引數和第三個引數分別接受回撥型別和系統提供的上下文。
  狀態變化型別的回撥返回錯誤碼時,將導致系統錯誤並觸發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結構中表示系統狀態良好的欄位。