ELAM驱动程序(优先启动反病毒驱动程序)

xiaoxiao2021-02-28  58

WDK中ELAM驱动示例 从MSDN中摘抄的关于这种驱动的简介。链接

简介

  从Windows8起,微软为反病毒软件增加的新的驱动类型:Early-Lunch Anti-Malware驱动(ELAM驱动)。这种驱动启动的比其他boot类型的驱动更加早并且提供了回调向ELAM驱动通知正在被加载的普通boot型驱动,以让反病毒软件有机会在boot型驱动加载前检测并决定是否加载这些驱动。

前提条件

  ELAM驱动需要具有WHQL签名。微软要求ELAM厂商是Microsoft Virus Initiative (MVI) 或者是Virus Information Alliance (VIA)项目的成员。ELAM驱动需要有微软针对ELAM的特殊签名并且不能导入任何Dll。

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驱动可以使用IoRegisterBootDriverCallback和IoUnRegisterBootDriverCallback来注册启动型驱动通知回调。   这个回调函数的格式和通用的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结构中表示系统状态良好的字段。

转载请注明原文地址: https://www.6miu.com/read-2630313.html

最新回复(0)