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
(2) 添加用户组clamav和组成员clamav:
# groupadd clamav
# useradd –g clamav clamav
(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文件,得到结果如下:
更多详情后续更新