_ _ (_) | | __ ____ __ _ _ _ _ __ ___ _ __ _ __ ___ | |_ \ \ / /\ \/ /| || | | || '_ ` _ \ | '_ \ | '_ \ / _ \| __| \ V / > < | || |_| || | | | | || |_) |_ | | | || __/| |_ \_/ /_/\_\| | \__,_||_| |_| |_|| .__/(_)|_| |_| \___| \__| _/ | | | |__/ |_| /---------------------------------------------------------------------------------------\ |>...................[ Clam AV引擎分析v0.54版 ]...................<| |>......................[ by nEINEI/vxjump.net ]......................<| |>......................[ 2008-02-15 ]......................<| \>...................... [ neineit@gmail.com ] ...................... | root | <------------------. / .-------> .-------. <-------. |fail | | /|\ | | | | | | | ----- ----- ----- ----- ----- fail | next|... | next| ... | next| ... | next| | next| ...256 \ ------- ------- ------- ------- ------- \ | | | | | \ ----- ----- ----- ----- ----- fail \| next|--> | next| --> | next| --> | next| --> |next| \ ------ ------- ------- ------- ------ \ | \ | \ ----- ----- ----- ----- ----- \ | next|--> | next| --> | next| --> | next| --> |next| ------- ------- ------- ------- ------ 优点: 改进了匹配算法,利用AC有限自动机的方式,时间复杂的< O(n2)。 缺点: 生成匹配算法结构时,十分繁琐,内存空间占用较大,可能会造成加载库速度慢。 该版在检测流程上增加了分支处理,用于区分前一版的检测方法与多段特征匹配方法。 [0x03] 加载库形式 文本文件DecodeDB,格式如下: Virusname = signature Virusname = signature Virusname = signature Virusname = signature 增加了*.db2格式的库(用于多段特征处理) W32/Magistr.B (Clam)=4d5a90000300000004000000ffff0000b80000000000000040*0004000000000000000400000000000000ed*e804720000 星号为特征的多段数据的分隔。 通配符匹配 W32/Hybris.C (Clam)=4000??????????????????????????83??????75f2e9????ffff00000000 … [0x04] 检测流程特点 和上一版基本一直。 [0x05] 内存管理方面 与上一版一致。 [0x06] 邮件检测 针对邮件用数据结构, static struct tableinit { const char *key; int value; }mimeSubtypes[] = { /* subtypes of Text */ { "plain", PLAIN }, { "enriched", ENRICHED }, { "html", HTML }, { "richtext", RICHTEXT }, /* subtypes of Multipart */ { "mixed", MIXED }, { "alternative", ALTERNATIVE }, { "digest", DIGEST }, { "signed", SIGNED }, { "parallel", PARALLEL }, { "related", RELATED }, { NULL, 0 } }; typedef struct message { mime_type mimeType; encoding_type encodingType; char *mimeSubtype; char *mimeArguments[MAXARGS]; char *mimeDispositionType; /* probably attachment */ text *body_first, *body_last; } message; Tableinit 本身会用链表链接起来来,用来在解析页面中查询。 邮件本身会按message 格式解析成若干个部分,再通过NOMIME, APPLICATION, AUDIO, IMAGE, MESSAGE, MULTIPART, TEXT, VIDEO, MEXTENSION 这些类型分解成不同的文本,而后调用扫描模块,扫描过程中库 本身并不区分邮件特征与病毒特征。 [0x07].引擎结构 在对压缩文件的处理过程中采用了递归处理方式,且递归方式作为可配置的结构,出现扫描文件目录函数的 控制中(可能是出于扫描方式考虑的,只扫描一层目录下的文件),下面是clamav v0.51的引擎检测流程。 .--------------. | 检测cpu个数 | .--------------. | \|/ .--------------------. | 支持的压缩类型分析 | .--------------------. | \|/ .--------------------. | 加载病毒库 | .--------------------. / \ / \ / \ /-------\ /-------\ | 按目录| | 按文件| \-------/ \-------/ \ / \ / \ / .----------------------------. | 由AC算法生成内存中的库结构 | .----------------------------. | \|/ .--------------------. | 检测引擎配置设置 | .--------------------. | | | --------------------. | .-------------------- \|/ \|/ \|/ 支持最大文件数量 最大扫描文件大小 支持最大递归层 | | | |------------------| | |------------------| .----------------------------. | 引擎支持的文件格式类型解析| .----------------------------. / \ / \ / \ /-------\ /-------\ | 邮件 | | 文件 | \-------/ \-------/ | | -------------------------- | .-------------. | 扫描方式 | .-------------. / \ / \ /-------\ /-------\ | 目录 | | 文件 | \-------/ \-------/ | | ----------------------- .------|------. | 卸载病毒库 | .-------------. 在文件检测方面,针对二进制文件先进行特征匹配,而后进行格式识别(基于后缀的),然后再检测,对于压缩文件, 先做基于二进制的文件检测,然后解压,而后调用检测函数scanfile,而scanfile仍然会调用格式识别,依次递归下去。 [0x08].总结 多线程扫描的意义? 这块是针对linux环境下多cup情况的处理里方式,目前看对windows下的意义不是太大。这或许针对多核的情况会加快检测 速度及安全的角度考虑,在检测过程中先将目录文件转换成树型结构存储,每一个工作线程,取分配给该线程的文件进行扫描。 如何检测变形病毒? 此版在此方面暂无的具体检测方案。 提取邮件扫描的方法? 可以参照v0.54这版的思路提取分析代码,但最好还是自己分析一下邮件格式,结合这版的检测思路。因为感觉v0.54这版 的邮件检测代码比较乱,检测的流程结构设计的也不是太合理。 线程安全的方法?(libclamav with RAR, Zip and Gzip support built-in. The library is thread safe and should be very secure) 针对解压所时,加入锁的控制,保证了多核处理的线程安全,主要是考虑递归解压缩文件时不会陷入死锁。 如果病毒名不限制长度了,怎么表示? 表示病毒名的字符串由动态内存空间分配,不限制长度 如何更好的检测新病毒? 此版本仍然是依照库匹配方式,未发现有启发式的检测方案,对于检测方面的变化,主要是加入了多段特征,和通配符匹配, 更好的发现新病毒将主要依靠通配符匹配发现,同一家族病毒变种。 如何限制内存使用? 此版cl_node(AC 生成的状态节点)结构中去掉*next[256]字段,用**nodetable来代替该功能,对于新加入的模式中的节点,采用动态内存分配方式, 而不是上一版本中固定的256 * 4 个字节的指针来表示,以此来节省内存空间的利用。 目前clamav有大约7300条病毒记录,粗略估算,去掉了针对每条特征所需的256 *4 字节,最大程度的节省内存情况为: (256 – 1)* 4* 7300/(1024*1024) ~= 7MB。 但因每个节点并非只有1个子节点,所以应为256 – X, ( 256 – X )* 4* 7300/(1024*1024) 从说明上来看大约节省了5MB,反过来推算,大约每个节点挂接子节点个数为65个左右,比以前大约节省191 *4个字节。 当然改进这样方法后,加载库的速度会更慢一些。 参考文献: [1] clam av 0.54 src. thanks killer,一起讨论研究引擎设计及提出若干问题。