ClamAV是一款由Sourcefire组织开发的开源杀毒引擎,Sourcefire同时也是Snort入侵检测引擎的全部者。ClamAV提供了一种更为快速灵活的框架用以检测恶意代码和软件产品。能够做为现有的台式机、文件服务器、邮件服务器以及其余须要杀毒扫描软件场景中杀毒扫描软件的补充工具或者替代产品。另外ClamAV程序包中还包含了libclamav库以及命令行可执行文件接口。同时也提供了freshclam命令行工具用以保证特征库的更新。服务器
ClamAV的最新版本能够在http://www.clamav.net/download/sources/得到。也能够经过程序管理器自动安装。在Ubuntu系统中,输入一下命令便可自动安装:框架
$ apt-get install clamav clamav-freshclam函数
下面说一说ClamAV的安装过程(使用clamav-0.98.6版本):工具
(1) 下载并解压clamav-0.98.6.tar.gz:编码
# tar vxf clamav-0.98.6.tar.gz.net
(2) 添加用户组clamav和组成员clamav:命令行
# groupadd clamav指针
# useradd –g clamav clamavcode
(3) 进入解压后的目录(源文件放在/usr/local/src中),并以下配置软件:接口
# ./configure --prefix=/usr/local/clamav
出现一个错误:OpenSSL not found
openssl的开发包没有安装,安装便可:
apt-get install libssl-dev
(4) 编译,安装:
make
make install
此时,还不能使用./clamscan去扫描能够文件,由于尚未特征库可加载到系统中,程序默认在share目录下的clamav文件夹中加载特征库,须要手动在上述路径下添加一个clamav文件夹,而且保证clamav用户可以对文件夹进行读写。
(5) 在/var/log/目录下添加两个log文件:clam.log和clam-update.log,全部者为clamav用户,并保证可读写权限。
(6) 修改/usr/local/clamav /etc/clam.conf将开始的有"Example"的那行用#注释掉。
(7) 修改/usr/local/clamav /etc/freshclam.conf将开始的有"Example"的那行用#注释掉。修改UpdateLogFile /var/log/freshclam.log 为UpdateLogFile /var/log/clam-update.log
(8) 用freshclam升级病毒库:
$ freshclam
freshclam运行之后,share目录下的clamav文件夹中已经存在了最新的特征库文件,下面就能够用clamscan命令进行文件的扫描了
Libclamav库API
libclamav库API提供了病毒扫描的各类函数接口。libclamav库使用的是病毒扫描法(Virus Scanner)。从病毒中提取的特征字符串被用必定的格式组织在一块儿并加上签名保护就造成了病毒库,clamav使用的病毒库通常后缀为.cvd文件。
在使用libclamav以前,必须调用cl_init()函数来初始化,初始化成功之后,能够调用cl_engine_new()函数来建立一个新的扫描引擎。扫描结束之后,须要调用cl_engine_free()这个函数来释放这个引擎结构。这三个函数的原型以下:
int cl_init(unsigned int options);
struct cl_engine *cl_engine_new(void);
int cl_engine_free(struct cl_engine *engine);
cl_init()和cl_engine_free()两个函数若是调用成功,将返回CL_SUCCESS,若是返回其余code,说明函数调用失败。
cl_init函数的实参传入CL_INIT_DEFAULT便可。
Cl_engine_new()若是调用成功将返回一个指向struct cl_engine结构体的指针,若是失败将返回NULL。
获得新的扫描引擎之后,须要进行特征库的加载,clamav提供了两个函数:
const char *cl_retdbdir(void);
int cl_load(const char *path, struct cl_engine *engine,
unsigned int *signo, unsigned int options);
cl_retdbdir返回ClamAV特征库的默认路径。
cl_load函数根据给出的具体特征库路径,加载单个特征文件,或者几个特征文件(给出的实参是文件夹)。第二个参数传入cl_engine_new获得的engine,第三个参数传出加载的特征码的条数,最后一个参数为加载的选项,通常传入CL_DB_STDOPT便可。
以上的步骤完成之后,须要调用cl_engine_compile()函数作最后的文件扫描前的准备,给函数原型为:
int cl_engine_compile(struct cl_engine *engine);
如今,能够进行文件的扫描了,文件扫描的函数为cl_scanfile,函数原型为:
int cl_scanfile(const char *filename, const char **virname,
unsigned long int *scanned, const struct cl_engine *engine,
unsigned int options);
该函数须要注意的一点是,virname在函数中指向了engine结构的表示目标扫描文件名称的内存,不能被直接释放。最后一个参数传入CL_SCAN_STDOPT,默认配置便可。
还有一个函数没有介绍:
cl_strerror(),能够将相关函数返回的不为CL_SUCCESS值的错误代码转换为说明错误相关的字符串。
如下是利用libclamav的API函数扫描文件的一个示例程序,只是展现了如何利用API进行文件扫描的最简单的流程,路径之类的采用的都是硬编码,实际使用时能够进行相应的修改。
利用一个样本文件进行试验,编译时加上参数-lclamav,并保证能够找到须要的.so文件和clamav.h文件,获得结果以下:
更多详情后续更新