_ _ (_) | | __ ____ __ _ _ _ _ __ ___ _ __ _ __ ___ | |_ \ \ / /\ \/ /| || | | || '_ ` _ \ | '_ \ | '_ \ / _ \| __| \ V / > < | || |_| || | | | | || |_) |_ | | | || __/| |_ \_/ /_/\_\| | \__,_||_| |_| |_|| .__/(_)|_| |_| \___| \__| _/ | | | |__/ |_| /---------------------------------------------------------------------------------------\ |>...................[ Clam AV引擎分析v0.15版 ]...................<| |>......................[ by nEINEI/vxjump.net ]......................<| |>......................[ 2008-03-03 ]......................<| \>...................... [ neineit@gmail.com ] ......................next -> next - >next -> next - >next -> null _______ |0x01 | next - >next -> next - >next -> next - >next -> null _______ |0x02 | next - >next -> next - >next -> next - >next -> null _______ |0x03 | next - >next -> next - >next -> next - >next -> null _______ |0x04 | next - >next -> next - >next -> next - >next -> null _______ ... _______ |0xFF | next - >next -> next - >next -> next - >next -> null _______ 匹配算法时间复杂的(n)2或(n)3 (依据配置情况而定) ,主要是单模式匹配思路,对待检测数据单字节匹配,无跳转表。 [0x03] 加载库形式 文本文件DecodeDB,格式如下: Virusname = signature Virusname = signature Virusname = signature Virusname = signature … [0x04] 检测流程特点 利用操作optionlist结构来驱动处理流程。 struct optnode { char optchar; char *optarg; char *optname; struct optnode *next; }; struct optstruct { struct optnode *optlist; char *filename; }; 由 scanmanager 函数负责对待扫描数据的分析处理。 检测分文件,目录两种方式,如果是目录则则现将目录构建成列表,然后再检测。 如果是文件,则分成快速扫描和全文扫描。 #define BUFFSIZE 131072 预读取数据长度 #define SCANSIZE 20480 快速扫描数据长度的基本单位 1 快速扫描文件是在文件的开头和文件结尾个取SCANSIZE * 2范围内的数据进行扫描,此情况下匹配算法的时间复杂的是(n)2。 2 全文扫描是以病毒库中最大模式串(MAX_PATTLEN)与BUFFSIZE 之差,做分块扫描,匹配算法的时间复杂度为(n)3。 Patt:B B B Text:x x x x x x x x x x B B B B B B B B B B B B B B B 对于目录扫描这块分成启动多线程扫描和一般扫描两种情况。 [0x05] 内存管理方面 所有和库相关数据均动态分配空间,在扫描结束后释放内存,这种方式可能与这版仅是个命令行工具有关。 [0x06] 总结 Clam av v0.15 能对.zip, rar , ace , arj , zoo ,jar ,lzh ,tar ,tar.gz 等文件格式进行解压处理,但文件格式识别部分还十分简易,仅是对扩展名进行识别。病毒库中最大 特长度为4080,加上病毒名恰好为4096,也就是说在v0.15这版引擎中,calm av 所用匹配算法最大的可能跳转是BUFFSIZE – 4096 (124k)个字节。 从Clam AV v0.15 和我们关心的几个地方来看: 1本版如何进行特征匹配,采用何种匹配算法: 单字节方式匹配。采用单字节hash 加链表方式组织数据。 2如何提取特征: 样本文件的开头(0,4k]和结尾(0,4k] 字节数据,及样本中间位置的(0,4k]数据。 3如何生成病毒库 库采用病毒描述加特征方式具体为 virusname = signature ,例如 VBS.PicaWorm.C4=4672656564726976655c6d61696c6564 Worm/Apost.A=557267656e74000d010700 参考文献: [1] clam av 0.15 src. thanks killer,一起讨论研究引擎设计及提出若干问题。