个人总结系列开源杀毒软件ClamWin及其引擎ClamAV学习总结Word下载.docx
《个人总结系列开源杀毒软件ClamWin及其引擎ClamAV学习总结Word下载.docx》由会员分享,可在线阅读,更多相关《个人总结系列开源杀毒软件ClamWin及其引擎ClamAV学习总结Word下载.docx(6页珍藏版)》请在冰点文库上搜索。
structcl_node
{
unsignedintmaxpatlen;
/*maximallengthofpatternindb*/
/*扩展的BM算法*/
int*bm_shift;
structcli_bm_patt**bm_suffix;
/*扩展的AC算法*/
structcli_ac_node*ac_root,**ac_nodetable;
unsignedintac_partsigs,ac_nodes;
/*MD5*/
structcli_md5_node**md5_hlist;
};
//BM结构
structcli_bm_patt{
char*pattern,*virname,*offset;
//特征、病毒名、偏移
constchar*viralias;
//别名
unsignedintlength;
//长度
unsignedshorttarget;
//该特征属于的类型
structcli_bm_patt*next;
BM最小特征长度是10个字节。
//AC结构
structcli_ac_patt{
shortint*pattern;
unsignedintlength,mindist,maxdist;
char*virname,*offset;
unsignedshortintsigid,parts,partno,alt,*altn;
unsignedshorttype,target;
char**altc;
structcli_ac_patt*next;
AC算法结构有了一些修改,不过相对检测方面改动不大。
structcli_md5_node{
char*virname,*viralias;
//病毒名/别名
unsignedchar*md5;
unsignedintsize;
//文本长度
structcli_md5_node*next;
2.4.2ClamAV引擎中的主要扫描功能函数
cli_scanpe:
先是进行PE合法性校验,若遇到入口在不在节内,或小于各个节所在的大小,及一系列非法PE格式文件情况,就都报“Broken.Executable“,然后检测退出。
而后进行壳情况的检测,后面有这块的具体分析说明,在调用相应壳版本验证后,调用脱壳函数,而后进行特征匹配。
cli_scanmschm:
该函数用来对微软的CHM格式文件进行解码处理。
cli_scanscrenc:
针对微软的ScriptEncoder脚本加密的解密处理流程,解码后按目录文件方式扫描。
cli_scan_mydoom_log:
该函数用来处理Worm.Mydoom.M.log,走入该检测流程分支依赖格式识别,返回CL_TYPE_UNKNOWN_DATA类型,显然这样的处理方式并不合理。
Scanmanager
所有检测入口函数
cl_loaddbdir
加载本地所有格式病毒库到内存
cl_build
构建扫描引擎
cl_scandesc
扫描分析
cli_loaddb
加载*.db,*.db2,*.db3,*.Mdb等格式的病毒库
cli_parse_add
添加病毒库特征到结构
cli_ac_addsig
添加特征到AC算法结构
cli_bm_addpatt
添加特征到BM算法结构
2.4.3ClamAV引擎宏观结构说明
从v0.15–v.093,ClamAV引擎的整体上一直都保持统一的风格,不断增加的仅是内部功能更加细致的分类,与一些重要数据结构的增加和修改或相应算法的修正。
当然就引擎调用来看ClamAV较为简单,这方面没有什么变化,引擎所处的环境也始终是以文件或目录为单位输入的情况,不涉及网络部分。
对ClamAV引擎归纳来说有2个特点:
一、通过配置信息指明检测目标;
二、靠流程来驱动检测。
Clamav专门为配置信息的处理写了一个管理结构,通过链表把它们存储起来。
当引擎检测处于众多分支当中时,利用检测配置可选择其中一个多或做个进行检测,这些配置有些是为了调试,有些是为了设置检测粒度,如解压缩层数,扫描文件大小限定等。
对于第2个特点,ClamAV并没有一个十分清晰的检测调度函数。
更多是靠很多小的检测流程聚合而成,依靠顺序调度来完成检测。
而很多新加入的函数为了能顺利加入的检测行列中来,而带了很多个参数(为了兼容该函数所在上下文的调度环境)最多的达到了11个参数,这样当外部大量调用该流程函数时,多参数的循环入栈,特别是涉及目录、解压等需要递归操作时,该方式对效率影响估计会比明显。
从整体上看,ClamAV引擎工作流程是:
图2-1ClamAV引擎工作流程图
先获取检测配置
进行病毒库加载,因为库是压缩的,所以先创建一个临时目录用释放解压后的库文件,MD5和BM的库记录会在测试加载完毕,AC算法的库在此时仅是添加到结构当中,因为该算法还要涉及调整内部记录的病毒特征的指针,同时也初始化了一个动态配置结构。
构建引擎,至少从函数名字上看是这样,但实际上该步骤仅是调整AC算法的内部记录的特征的指针,保留该步骤应该是历史版本遗留下来的问题。
再次进行配置信息的获得,包括扫描文件的最大值,解压缩的比率,是否检测PE,是否开启算法扫描等等。
之所以分两次获取,可能是配置本身过于复杂耗时,如果步骤3失败,则直接退出,没必要开始时初始所以配置信息。
对扫描对象的按目录和文件进行分类处理,当处理的对象是目录时,遍历后仍然按单个文件方式处理。
对单独的文件,ClamAV会检测一些是否有和配置信息不符的情况,如解包的递归层数,在超出了给条件的情况下,会报告“Archive.ExceededRecursionLimit”病毒,而后进行格式识别,依据格式识别的返回结果调用不同的处理函数进行库匹配。
最为关键的是第6步,前几个步骤都是为最后一步扫描构建基础环境,在检测中最为关键的是cli_scanpe函数,该函数长达2000多行代码。
从v0.93版中看更加细致的验证PE文件的合法性的操作,在验证通过后才会进入算法扫描(主要用于检测多态病毒)、壳识别、脱壳、普通文件扫描的流程。
但该处理过程没有太清晰的处理逻辑,效率控制也不是太好,从v0.80到v0.93这些处理方式上看,作者并没有试图改变这样处理方案,可以预测以后的版本如果要加入新的病毒检测方案,仍然会强行加入到该函数中。
从可借鉴的角度看,该引擎的部分库格式,与有针对性的文件格式解析都是可以考虑利用的,配置信息的管理,丰富的引擎调试的信息等方式也都很有意义。