黑客攻防技术宝典-反病毒篇笔记(二)

插件系统

反病毒插件是组成核心反病毒软件的若干小部件,插件不是核心库的重要组成部分,旨在强化由反病毒软件内核实现的若干功能特性。

 

插件加载原理

每家反病毒公司设计和执行的插件加载方式各不相同。下面介绍三种插件加载方式。

一. R/W/X内存页加载插件

系统分配一个读/写/执行内存页,将插件文件内容解密并解压到内存页当中,最后移出内存页的相关写入权限

二.利用动态链接库加载插件

依托操作系统的动态链接库加载机制,通常为了保护插件代码及其内部逻辑,通常会对DLL文件的代码和数据进行混淆。

三.利用COFF文件加载插件

COFF文件(通用对象文件格式),该文件是用来存放编译好的代码和数据的,COFF文件链接起来形成一个可执行模块。该技术内存消耗少且启动速度快。

理解动态加载

动态加载是最典型的反病毒插件加载方式。这些插件文件不仅存在于容器文件中,也有可能分布在碎片文件当中,这类文件通常会借助zlib进行加密和压缩。在必要的时候,插件文件首次被解密后,会被载入内存当中。

启发式检测

启发式检测引擎位于核心反病毒引擎结构的顶端,用来与其他插件模块通信或综合其他插件提供的病毒检测信息。启发式引擎会根据设置的启发式检测敏感级别,综合前期收集的信息,最终判定文件是否为安全,是否需要向用户发出警告提示。

启发式引擎很容易产生误报,因为其原理是根据已有证据来判断文件是否为恶意文件。

存在两种启发式引擎:静态和动态。

静态启发式引擎不需要执行程序就可以进行判断,依据的是已有的特征证据来判断是否为恶意程序。

动态启发式引擎则是通过直接执行程序或从模拟环境执行程序,通过检测程序的各种行为来进行判断是否为恶意程序。

基于贝叶斯网络检测

贝叶斯网络是反病毒产品采用的使用统计模型代表一组变量的方式。这些变量通常是条件依赖关系,PE文件头以及其他一些启发式检测标志,如文件是否加壳或被压缩,部分文件墒值是否过高。贝叶斯网络可以用来揭示不同恶意软件之间的概率关系。

尽管使用贝叶斯网络是一种强有力的启发式检测手段,但误报率非常高,所以反病毒工程师会使用恶意文件和正常软件对贝叶斯网络进行训练,以降低启发式检测的误报率。

和反病毒引擎实现的任何一种启发式引擎一样,绕过基于贝叶斯网络十分容易。用一句话来总结就是:让编写的程序尽可能的与正常程序类似。

基于Bloom过滤器检测

Bloom过滤器是反病毒软件用来判断文件是否已知恶意软件的数据结构。

简而言之,Bloom过滤器中存放着已知恶意软件的特征码以及其他已知证据,当一个软件的特征码不属于Bloom过滤器当中的特征库的时候,将会被放行,反病毒软件会将其认定为一个正常程序,但是如果特征存在于Bloom特种库当中,则说明该程序存在恶意文件的嫌疑,于是会将该文件交给深层次的启发式检测引擎进行进一步检测,来判断是否是恶意文件。

基于权重的启发式检测

在许多反病毒引擎当中都可以发现基于权重的启发式引擎,在插件收集完关于样本文件或待扫描缓冲区的信息后,启发式检测标志会被计算机收集起来,然后基于这些标志,反病毒引擎会对其分配权重。根据权重值,反病毒软件将会判断是否为恶意软件。

利用非本机语言编写插件模块

利用本机语言编写反病毒引擎内核是为了在不影响系统性能的前提下,以最快速度运行反病毒内核,但用本机语言再去编写插件模块,产生的BUG可能更加的多,于是我们可以用非本机语言来编写插件模块。

例如一些反病毒产品使用.NET或其他需要使用虚拟机解释执行的特定的编程语言来编写插件。反病毒厂商采用该项措施有以下几个方面的考虑:

1. 复杂性    使用高级语言编写的扫描程序,感染修复程序,启发式检测引擎会更容易。

2. 安全性    如果编写插件使用的语言在虚拟机当中运行,即使插件在运行过程中出现了某些BUG,也不会影响到整个产品,只会对虚拟机中的内容产生影响。

3.调试能力 利用特定的语言进行编写插件的话,反病毒软件提供封装完的API,当调试者需要进行调试的时候,只需要用所需编程语言的调试器进行调试就好。

posted @ 2019-09-16 13:25  ReVe1Se  阅读(562)  评论(0编辑  收藏  举报