驱动对抗(一):ELAM驱动加载与驱动过滤

驱动对抗现状:

问题:

由于3环权限低,越来越多的病毒不屑于在3环搞事。在处理用户的一些病毒问题时,除了流氓软件,最多的还是rootkit这一类病毒(关于rootkit病毒的介绍,常见操作和危害不在此处讨论,以后笔者可以单独开一篇博文聊聊)。有些用户遇到3环问题还能自己想办法解决一下,通过修改劫持首页的注册表、快捷方式或者卸载恶意流氓软件等等就可以解决问题。但是,面对rootkit类病毒问题时,绝大多数的用户还是不知道或者不敢轻易去自己解决,一方面由于相关处理经验不足,另一个是怕出什么问题导致蓝屏或者系统崩溃就不好办了。用户束手无策时,通常会求助与杀软的专杀工具,或者系统急救箱这一类的内核对抗产品。杀软一般为了保证在用户电脑的稳定运行不会参与内核对抗,只处理3环场景遇到的病毒问题,一般将内核对抗产品做出小工具形式供用户主动下载。

解决办法:

解决rootkit问题的最终目的就是让恶意驱动重启后加载不起来。而驱动加载信息一般在3环以服务形式存在注册表中(计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services),所以删除驱动服务对应的注册表项或者设置其Start键值为4即可。恶意驱动为了自保,会采用五花八门的手段来阻止你删除其注册表或者文件,常见内核的操作点一般有:注册表过滤、关机回调、线程保护、定时器、文件过滤、HIVE文件劫持、3环服务自启、双重随机服务等等,花样很多。这也就给杀软驱动对抗带来了很多问题,因为它不需要考虑windows全版本的兼容性,大胆操作,用户蓝屏无所谓,但是作为杀软产品,用户体验也是必须要考虑进去的,所以驱动对抗过程中小心翼翼,摘回调,patch代码等操作会写的比较死,怕给用户带来蓝屏问题。因为我们最终是给用户解决问题而不是带来新的问题。当恶意驱动作者发现自身保护被过时,通常稍微改改那几个点,就会很容易免杀。

新发现:

有一次在远程同事那处理问题,他提及管家的系统修复工具挺好的,随即测试后发现很有意思,扫描过程中并没有报毒记录,但是会给你立即重启,重启之后就好了,驱动加载不起来。当时并未想明白它是怎么做到的,直到我在网上发现了elam驱动,或许管家就是这么玩的,笔者未深入验证。微软已经帮杀软搞好了驱动对抗的玩法。

ELAM驱动:

简要介绍:

ELAM全称为:Early-Lunch Anti-Malware,是微软在win8之后为反病毒厂商新加的驱动类型。这个类型的驱动可以早于其他boot型驱动启动并且可以通过回调获取将要加载的驱动信息来决定是否加载。这样的在驱动对抗中的好处就是可以通过判断你的驱动签名来决定是否加载。对一些恶意驱动来说无疑是巨大打击,毕竟签名还是有些贵的而且拉黑一条签名要比与你内核层代码对抗简单的多。ELAM驱动必须要有WHQL签名,这也就要求你必须是Microsoft Virus Initiative (MVI) 或者是Virus Information Alliance (VIA)项目的成员才能拥有相关资格。

更多关于ELAM驱动的介绍请自行查阅相关微软相关文档:

ELAM驱动官方文档介绍:https://docs.microsoft.com/en-us/windows-hardware/drivers/install/early-launch-antimalware

ELAM驱动官方安装需知:https://docs.microsoft.com/en-us/windows-hardware/drivers/install/inf-signatureattributes-section

ELAM驱动官网例子:https://github.com/Microsoft/Windows-driver-samples/tree/master/security/elam

笔者下文所提及的ELAM驱动测试项目链接:https://github.com/YanStar/elam_test

驱动编译及加载:

笔者尝试编译、加载ELAM驱动过程中,发现国内外相关资料比较少,且遇到一些坑,在此记录下,帮助大家更快,更高效的开发ELAM驱动,不当,不妥之处多多指点。

环境:

物理机:win10_x64_1909 + vs2019 + wdk10 + windbg

虚拟机:vm15.5 + win10_x64_1909

双击调试:vm串行端口配置或VirtualKD大家自行选择即可

编译:

下载ELAM驱动官网例子,用vs2019打开,编译成功即可

自签测试签名:

这一步很关键,不打自签名加不起来。自签名步骤如下:

1. 使用makecert得到证书,管理员cmd运行如下命令:

"C:\Program Files (x86)\Windows Kits\10\bin\x64\makecert.exe" -a SHA256 -r -pe -ss PrivateCertStore -n "CN=MyElamCert" -eku 1.3.6.1.4.1.311.61.4.1,1.3.6.1.5.5.7.3.3 -sr localmachine MyElamCert.cer

2. 使用签名工具对编译好的驱动进行签名,管理员cmd运行如下命令:

"C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe"  sign /fd SHA256 /a /v /ph /debug /s "PrivateCertStore" /n "MyElamCert" /t http://timestamp.comodoca.com/authenticode elamsample.sys

注:笔者遇到过命令没问题,之前打签名,后来突然签名打不上去的问题,经查看是签名时间戳网站获取不到的问题,收集以下时间戳网址供大家参考使用:

http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
http://www.startssl.com/timestamp
http://timestamp.sectigo.com

加载运行:

当自签名打好了以后,就可以在虚拟机里加载运行elam驱动了。

1.  将驱动放入虚拟机C:\Windows\System32\drivers目录下

2. 创建elam服务,虚拟机管理员cmd运行如下命令:

sc create ElamSample binpath=%windir%\\system32\\drivers\\elamsample.sys type=kernel start=boot error=critical group=Early-Launch

3. 开启测试签名模式,虚拟机管理员cmd运行如下命令:

bcdedit /set testsigning on

4. 做好上述准备之后,就可以重启win10虚拟机,挂上windbg,坐等官方文档的例子中所提及的log输出。

你会发现直到你虚拟机已经完全跑起来也压根没有任何log输出,明明例子代码入口点都写了DbgPrintEx,还是没有输出。这也是笔者当时遇到的一个问题,后来仔细阅读文档后发现,原来需要修改例子中的宏代码。粗心大意,细节部分还是不能马虎!

官方描述:

所以,当你把例子中开始宏改为如下所示,你就能够得到log输出了:

#define ELAMSAMPLE_TRACE_LEVEL DPFLTR_ERROR_LEVEL

log输出:

同时,笔者在例子中加了如下的两小段代码,你就可以通过恶意驱动路径或者恶意驱动签名来禁止其启动了,相关代码可以通过笔者链接(https://github.com/YanStar/elam_test)获取:

1. 通过恶意驱动路径禁止其加载:

    //test path forbidden sys load
    UNICODE_STRING StrBadImageName = RTL_CONSTANT_STRING(L"\\SystemRoot\\system32\\DRIVERS\\khysboard.sys");

    if (RtlCompareUnicodeString(&ImageInformation->ImageName, &StrBadImageName, TRUE) == 0)
    {
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n********************************************************\r\n");
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n");
        DbgPrintEx(DPFLTR_IHVDRIVER_ID,
            ELAMSAMPLE_TRACE_LEVEL,
            "ElamSample:    [Stopped] Forbidden Image Name \"%wZ\"\r\n",
            &ImageInformation->ImageName);
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n********************************************************\r\n");
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n");

        ImageInformation->Classification = BdCbClassificationKnownBadImage;
        return;
    }

2. 通过恶意驱动签名禁止其加载:

    //test signed hash forbidden sys load
    PCUCHAR Bytes;
    Bytes = (PCUCHAR)ImageInformation->CertificateThumbprint;

    if (Bytes[0] == 0x03 && Bytes[1] == 0x08 && Bytes[2] == 0x50) {

        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n********************************************************\r\n");
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n");
        DbgPrintEx(DPFLTR_IHVDRIVER_ID,
            ELAMSAMPLE_TRACE_LEVEL,
            "ElamSample:    [Stopped] Forbidden Image Name \"%wZ\"\r\n",
            &ImageInformation->ImageName);
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n********************************************************\r\n");
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, ELAMSAMPLE_TRACE_LEVEL, "\r\n");

        ImageInformation->Classification = BdCbClassificationKnownBadImage;
        return;
    }

总结:

回过头来看关于加载ELAM驱动其实没啥,例子都是官方现成的,笔者当时加载过程中遇到的问题主要有:虚拟机环境问题,自签名问题,log输出问题。细心点就可以全部解决。后续关于如何使用ELAM来更好的管理恶意驱动黑签名在此不作讨论,可以写在注册表里,大家自由发挥吧!

若有不当之处或有问题欢迎指出,定当虚心学习纠正!

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页