本文转载自【微信公众号:MicroPest,ID:gh_696c36c5382b】,经微信公众号授权转载,如需转载与原文作者联系
ELAM:提前启动反恶意软件
题外话:这是一段非常艰难的历程:一是这是一个非常好的、非常值得关注的创新技术;二是由于我对驱动开发知识的欠缺以及ELAM资料的缺少让我的浅显学习进行得很艰辛;三是因为难,到文章最后我都没成功实现作者的东西,连带着你读来可能也是不知所云;所以当你看此文时请多多见谅,请原谅我能力上的不足。
这项创新技术的精髓:“驱动级木马病毒的运行,关键是与杀软的驱动程序比启动速度。在Window 7 及以前的系统版本中,对系统中驱动的启动并没有指定优先级顺序,到底哪一个最早加载是不确定的。
在Windows 8以及更高系统的Windows 10中,引入了针对此问题的新保护机制ELAM。该机制会优先加载有信任证书的杀毒软件的驱动程序,防止恶意驱动过早启动。”
现在的病毒木马技术越来越高级,各种驱动使得杀毒软件越来越难以查杀这类恶性Rootkit 病毒,从windows8开始,微软加入了ELAM技术,这项技术可以在恶意驱动启动前就被干掉。
从Windows8起,微软为反病毒软件增加的新的驱动类型:ELAM驱动。这种驱动启动的比其他boot类型的驱动更加早并且提供了回调向ELAM驱动通知正在被加载的普通boot型驱动,以让反病毒软件有机会在boot型驱动加载前检测并决定是否加载这些驱动。
ELAM可以在所有非Microsoft启动驱动程序和应用程序运行之前加载Microsoft或非 Microsoft反恶意软件驱动程序,从而保持由安全启动和受信任的启动建立的信任链。当操作系统尚未启动,而Windows又需要尽快启动时,ELAM会有一个简单的任务:检查每个启动驱动程序,并确定它是否在受信任的驱动程序列表中。如果该驱动程序不受信任,Windows将不会加载它。
在系统启动时,反病毒软件的驱动程序第一个加载,这个驱动会扫描接下来要加载的驱动的数字签名,返回“是、否、未知”。如果有恶意驱动就会在启动的时候处理掉,由于驱动是第一个加载的,这个技术可以有效的防止一些恶性Rootkit木马反复在系统中无法清除的情况发生,将病毒扼杀在萌芽阶段。
反恶意软件Windows Defender默认包含在Windows10中)支持ELAM;它可以替换为第三方反恶意软件兼容的解决方案。Windows Defender ELAM驱动程序的名称为WdBoot.sys。Windows10中的Windows Defender会使用其ELAM驱动程序,以便可以在下次重启时回退对Windows Defender驱动程序所做的任何恶意更改。这将阻止内核模式恶意软件在Windows Defender的微筛选器驱动程序关闭或重启前对其进行永久性更改。
一、前提条件
ELAM驱动需要具有WHQL签名。微软要求ELAM厂商是Microsoft Virus Initiative (MVI) 或者是Virus Information Alliance (VIA)项目的成员。ELAM驱动需要有微软针对ELAM的特殊签名并且不能导入任何Dll。
关于签名,真是很受伤;网上售卖的签名一是太贵,二是使用次数太少、购买就显得不划算;三是windows现在对驱动的数字签名真是要求越来越严格,越来越变态,虽然强制关闭了签名的认证,但仍然挡不住windows的审查。我来简单介绍下签名的过程:
1、签名:makecert /sv "1.PVK" /n "CN=Windows,E=microsoft,O=微软" -$ "individual" -r 1.cer
注:加上-$ "individual" -r,进行signcode时选择md5,而不是sha1

形成驱动文件的数字签名:

但在安装驱动时,弹出:

签名没有被win7认可通过,

强制关闭对签名的认证,但也不行,最后还是采用了vs2019自已的debug模式的数字签名:

二、驱动类型讲解及ELAM
ELAM驱动的启动类型为SERVICE_BOOT_START,表示驱动由winload加载并随内核的初始化启动。启动组(LoadOrderGroup)则需要设置为Early-Launch表示这是个早期启动驱动。
1、驱动程序启动类型
内核模式驱动程序的启动类型指定是在系统启动期间还是之后加载驱动程序。 有五种可能的启动类型:
1)SERVICE_BOOT_START (0x0)
指示由操作系统(OS)加载程序启动的驱动程序。 文件系统筛选器驱动程序通常使用此开始类型或SERVICE_DEMAND_START。 在WinXP和更高版本的系统上,筛选器必须使用此启动类型才能利用新的文件系统筛选器加载顺序组。
2)SERVICE_SYSTEM_START (0x1)
指示在OS 初始化期间启动了驱动程序。 此启动类型由文件系统识别器使用。 除了下面列出的 "SERVICE_DISABLED" 文件系统(包括网络文件系统组件)以外的文件系统,通常使用此开始类型或SERVICE_DEMAND_START。 此启动类型还由设备驱动程序使用,用于在系统初始化期间枚举的 PnP 设备,但不需要加载系统。
3)SERVICE_AUTO_START (0x2)
指示在系统启动期间由服务控制管理器启动的驱动程序。 很少使用。
4)SERVICE_DEMAND_START (0x3)
指示由PnP 管理器(对于设备驱动程序)或服务控制管理器(对于文件系统和文件系统筛选器驱动程序),按需启动驱动程序。
5)SERVICE_DISABLED (0x4)
指示OS 加载程序、服务控制管理器或 PnP 管理器未启动的驱动程序。 由文件系统识别器(它们是启动文件系统时除外)或其他文件系统(EFS)加载的文件系统使用。 此类文件系统包括 CDFS、EFS、FastFat、NTFS 和 UDF。 还用于在调试过程中临时禁用驱动程序。
2、驱动程序加载顺序组
在SERVICE_BOOT_START 和 SERVICE_SYSTEM_START 启动类型中,每个驱动程序的加载顺序组都指定了加载驱动程序的相对顺序。
启动类型为SERVICE_BOOT_START 的驱动程序称为启动(或启动)驱动程序。 在Windows 2000及更早版本的系统上,许多启动驱动程序的筛选器属于"筛选器" 组。 在WindowsXP和更高版本的系统上,作为启动驱动程序的筛选器通常属于一个新的FSFilter加载顺序组。 文件系统筛选器驱动程序的加载顺序组中详细介绍了这些加载顺序组。
其启动类型为SERVICE_SYSTEM_START 的驱动程序也按其所属的加载顺序组的顺序进行加载。 但是,在加载所有启动驱动程序之前,不会加载任何系统启动驱动程序。
对于其启动类型为 SERVICE_AUTO_START、SERVICE_DEMAND_START 或 SERVICE_DISABLED 的驱动程序,将忽略加载顺序组。
可在HKEY_LOCAL_MACHINE systemcurrentcontrolsetcontrol注册表项的ServiceGroupOrder子项下找到完整的、有序的加载顺序组列表。
相同的负载组排序用于SERVICE_BOOT_START 和 SERVICE_SYSTEM_START驱动程序。 但是,在加载任何SERVICE_SYSTEM_START 驱动程序之前,将加载并启动所有SERVICE_BOOT_START 驱动程序。
三、ElamSample驱动示例
本文中所用到的例子在这里:https://github.com/Microsoft/Windows-driver-samples/tree/master/security/elam,以下是我的实验环境及过程:
1、编译环境:Visual Studio 2019 + WinSDK10.0.18362.0 + WDK10.0.18362.0;编译成x64的debug模式的ElamSample.sys驱动文件;
2、试验环境:虚拟机Win7 x64、Win10 x64;将ElamSample.sys复制于c:windowssystem32drivers目录下;
3、注册:sc create ElamSample binpath= %windir%\system32\drivers\elamsample.sys type= kernel start= boot error= critical group= Early-Launch


4、打开测试模式:bcdedit /set testsigning on

这是win10的提示,没有签名很难通过;
5、架设WinDBG+Win7、Win10的双机调试模式,这个请自行在网上教程,以及在win7、win10中设置好;
重启虚拟机win7;这时出现:

Win7

win10的;

Win7、Win10的两个系统的修复模式太强了,我实验时只要重启后就会处于修复状态,在WinDBG中并没有取得实验中的回显示;

6、在原文中有个测试成功的驱动回显,但我没有成功获得,还是看看作者的(截图):

最近的事情太多了,实在没有太多的精力和时间,也不知道是我的调试不对还是作者的代码问题,想来应该是我的功力不够吧,这里也请看到此文的高手们有空时看看作者的代码,帮我解惑,不胜感激!
本文转载自【微信公众号:MicroPest,ID:gh_696c36c5382b】,经微信公众号授权转载,如需转载与原文作者联系

微信扫一扫打赏
支付宝扫一扫打赏