WFP网络过滤驱动分析报告
基本信息
样本名称 | qsafd_vw_1_10_0_20.sys |
---|---|
样本类型 | Rootkit |
样本大小 | 56.38 KB (57728 bytes) |
MD5 | D615E94389B927888FDCDE7D2F36BF4C |
简介
该Rootkit样本是一个基于WFP框架的网络过滤驱动,在特定的网络分层中设置过滤器,对特定网络数据进行过滤。
样本详细分析
初始化
初始化派遣函数
通过memcpy
设置驱动的派遣函数,将所有的派遣函数都设置为subMajorFunction_140004748
,如图:
函数subMajorFunction_140004748
根据接受到IRP请求,进行相应的操作,由于缺少R3程序,这里便没有详细分析具体的派遣函数操作。
初始化设备对象和设备符号链接
创建名为\Device\CtrlSM的设备对象,创建名为\DosDevicse\CtrlSM的设备符号链接,如图:
初始化卸载函数
卸载函数释放自旋锁,设备对象和符号链接,释放分配的内存池等,如图:
检测过滤器状态
调用函数FwpmBfeStateGet0
检测过滤器的运行状态:
当过滤器处于正在运行,便执行主要过滤函数
submain_1400026A0
;当过滤器没有正在运行,便执行函数
FwpmBfeStateSubscribeChanges0
,当过滤器引擎状态发生改变便调用subCallbackmain_1400077A8
函数(与submain_1400026A0
相同)
主要过滤行为
开启过滤引擎
先通过函数ExUuidCreate
初始化25个UUID(UUID用来唯一标识提供者、子层、Callout),然后在调用函数FwpmEngineOpen0
开启过滤引擎,如图:
添加名为NFSDK Provider
的Provider,然后再通过submainFwpsCalloutRegister2_1400028E8
函数注册Callout,以及submainFwpmFilterAdd0_140001008
函数添加Filter,如图:
注册Callout
先调用FwpmTransactionBegin0
开启过滤设置,然后再调用subFwpsCalloutRegister2_14000284C
函数来注册Callout,一共注册了22个callout,如图:
注册完后,当过滤器命中设置好的规则后(后面会添加过滤规则),便会执行上图中classifyFn1
函数,对相应网络数据进行过滤。由于一共注册了22个callout,其中大多需要实际网络环境才能触发,调试起来比较麻烦;静态也有很多结构体指针的使用,因此短时间内无法将每个callout所执行的行为完全分析清楚。
检测杀软
通过查看驱动注册表项,来检测杀软的网络过滤驱动是否存在,如图:
添加子层
通过调用函数FwpmSubLayerAdd0
分别添加NFSDK Sublayer子层和NFSDK Recv Sublayer子层,并根据检测杀软的结果来修改子层的权重(权重值决定过滤的优先级),如图:
添加Callout和Filter
通过调用函数subFwpmFilterAdd0_140001420
将之前注册的22个Callout添加到WFP过滤引擎中,并在成功添加Callout后再添加包含相应规则的Filter。
函数subFwpmFilterAdd0_140001420
,先通过函数FwpmCalloutAdd0
添加Callout,当添加Callout成功后便在通过函数FwpmFilterAdd0
向系统添加一个新的过滤器对象,如图:
其中上图中的FWPM_FILTER_CONDITION0_
结构定义了需要满足什么条件时过滤条件成立。具体结构如下:
1 | typedef struct FWPM_FILTER_CONDITION0_ { |
总结
该样本是一个典型的基于WFP框架开发的恶意Rootkit,对受害主机的特定网络数据包进行过滤,来实施恶意操作。该样本包含正常的文件签名,并且会检测系统中的安全软件进行对抗,一般难以发现。因此在日常使用中用户应注意辨别恶意软件。