防病毒Clamav使用及API调用测试

Posted fzsecurity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防病毒Clamav使用及API调用测试相关的知识,希望对你有一定的参考价值。

1、Clamav介绍

(1)clamav是什么? ClamAV 是一个C语言开发的开源 (GPLv2) 反病毒工具包,专为邮件网关上的电子邮件扫描而设计。它提供了许多实用程序,包括灵活且可扩展的多线程守护程序、命令行扫描程序和用于自动数据库更新的高级工具。该软件包的核心是一个以共享库形式提供的反病毒引擎。

(2)clamav有哪些特性? a)、ClamAV 可检测数百万种病毒、蠕虫、特洛伊木马和其他恶意软件,包括宏病毒、移动恶意软件。 b)、内置支持流行的文档格式,包括MS Office和MacOffice文件,html, Flash, RTF和PDF c)、内置支持各种档案格式,包括Zip, RAR, Dmg, Tar, Gzip, Bzip2, OLE2, Cabinet, CHM, BinHex, SIS等 d)、内置支持所有标准邮件文件格式 e)、内置支持ELF可执行文件和便携式可执行文件,包含UPX, FSG, Petite, NsPack, wwpack32, MEW, Upack和SUE, Y0da Cryptor等 f)、高级数据库更新程序,支持脚本化更新、数字签名,病毒数据库每天更新多次

(3)支持哪些平台 GNU/Linux:Alpine、Ubuntu、Debian、CentOS、Fedora UNIX:FreeBSD、macOS Windows:win7/win10

(4)、系统要求 ClamAV 的最低推荐 RAM: Linux/Unix => 2 GiB+ win7/10/mac => 3Gib+ ClamAV 的最低推荐 CPU: 1 个 2.0 Ghz+ 的 CPU

2、Clamav的安装

(1) 源码获取: https://www.clamav.net/downloads

(2) 安装 ClamAV 依赖项 1、安装开发者工具 yum groupinstall "Development Tools" 2、安装库依赖 yum install openssl openssl-devel libcurl-devel zlib-devel libpng-devel libxml2-devel json-c-devel bzip2-devel pcre2-devel ncurses-devel

(3) 配置构建:  a)验证您安装的软件包是否确实被检测到  ./configure --enable-check

检测情况:

 b)编译配置 ./configure --prefix=$HOME/clamav  --sysconfdir=$HOME/clamav/etc  --with-systemdsystemunitdir=no --prefix :指定ClamAV 安装到$HOME/clamav --sysconfdir= 指定ClamAV的配置文件安装到$HOME/clamav/etc --with-systemdsystemunitdir: 是否安装systemd套接字文件

其它配置选项安装参考:./configure --help

c) 编译安装 ClamAV 编译:make -j2 安装:make install 

clamav常见的工具: freshclam:下载与更新病毒特征码的程序。 clamscan:独立的扫描工具,可以单独运行而不需要clamd的支持。 sigtool:clamav管理工具,可以查看病毒特征码库文件(.cvd)的信息、解压病毒特征码库文件、制作病毒特征代码库文件等。 clamd:基于多线程开发的查杀引擎守护进程,通过socket、streams、file descriptor进行扫描操作。 clamdscan:调用clamd进行病毒扫描的客户端程序。它是通过将请求socket发送给clamd,让clamd做 实际的扫描工具,再从clamd取回结果。

3、工具使用

病毒库下载与更新:freshclam       freshclam 配置:cp freshclam.conf.sample freshclam.conf

注释掉Example,freshclam配置才会生效

配置病毒库的路径

main.cvd =>主要病毒库

daily.cvd     =>最新的病毒签名每日更新

bytecode.cvd =>字节码病毒库

扫描工具:clamscan [options] [file/directory/-]

clamscan --help            =>命令帮助    

clamscan --log=vir.log        =>指定扫描日志文件

clamscan --file-list=file.list        =>扫描file.list中的文件

clamscan --database=FILE/DIR    =>从 FILE 加载病毒库或从 DIR 加载所有支持的 db 文件

clamscan file            =>扫描file文件

Clamav管理工具:sigtool

sigtool --help    =>命令使用帮助 

sigtool --version    =>查看Clamav版本

sigtool --info    =>查看病毒库信息

sigtool --unpack    =>解压cvd文件

sigtool --list-sigs    =>输出cvd中签名信息

sigtool --build    =>构建病毒库文件

4、Clamav 病毒库制作

1、使用sigtool工具制作病毒库

a)       生成md5哈希库 ./sigtool --md5 testfile/PresentationHost.exe > presen.hdb

利用test.hdb来查杀 clamscan -d test.hdb update.exe

1、使用sigtool工具制作病毒库        

b)       生成sha256 hash的签名 ./sigtool --sha256 dssec.dat > dssec.hsb

利用test.hdb来查杀 clamscan -d test.hdb update.exe

 

5、Clamav Api接口使用范例

接口说明:

在使用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进行文件扫描的最简单的流程,路径之类的采用的都是硬编码,实际使用时可以进行相应的修改。

//1)cl_init初始化

clamav_init()

    if ((ret = cl_init(CL_INIT_DEFAULT)) != CL_SUCCESS)

        return -1;

   

//2)创建检测引擎struct cl_engine* g_clamav_engine

    if (!(g_clamav_engine = cl_engine_new()))

        snprintf(logStr, sizeof(logLocalStr), "Can't create new engine instance.");

        return -1;

   

    /*  load all available databases from default directory */

//3)导入clamav的库

    if ((ret = cl_load(CLAMAV_VIRUS_DB_PATH, g_clamav_engine, &sigs, CL_DB_STDOPT)) != CL_SUCCESS)

        snprintf(logStr, sizeof(logLocalStr), "cl_load: %s", cl_strerror(ret));

        cl_engine_free(g_clamav_engine);

        return -1;

   

    /*  build engine */

 //4)库导入后,进行检测规则的预编译

    if ((ret = cl_engine_compile(g_clamav_engine)) != CL_SUCCESS)

        snprintf(logStr, sizeof(logLocalStr), "Can't compile engine: %s.", cl_strerror(ret));

        cl_engine_free(g_clamav_engine);

        return -1;

   

//5)设置meta信息

    cl_engine_set_clcb_meta(g_clamav_engine, meta);

    printf("======end==========initialize libclamav==============\\n");

//meta 回调

static cl_error_t meta(const char* container_type, unsigned long fsize_container, const char* filename,

    unsigned long fsize_real, int is_encrypted, unsigned int filepos_container, void* context)

    char prev[128];

    struct metachain* c;

    struct clamscan_cb_data* d;

    const char* type;

    size_t n;

    char* chain;

    char** chains;

    int toolong;

    UNUSEDPARAM(fsize_container);

    UNUSEDPARAM(fsize_real);

    UNUSEDPARAM(is_encrypted);

    UNUSEDPARAM(filepos_container);

    if (!(context))

        return CL_CLEAN;

    d = (struct clamscan_cb_data*)context;

    c = d->chain;

    type = (strncmp(container_type, "CL_TYPE_", 8) == 0 ? container_type + 8 : container_type);

    n = strlen(type) + strlen(filename) + 2;

    if (is_encrypted)

        char logStr[LOG_STREAM_LENGTH];

        char logLocalStr[LOG_STREAM_LENGTH];

        return CL_SUCCESS;

   

    return CL_SUCCESS;

 //扫描文件的接口

int32_t FileAv::AVScanBuf(unsigned char* buf,

    int bufSize,

    unsigned char* filename,

    unsigned int uncompress_layer,

    char* malware_name,

    int* resultReturn,

    short compre_limit_count,

    struct cl_scan_options *options

)

    int ret = 0;

    const char* auchar_malware_name;

    unsigned long int size = 0;

    struct metachain chain;

    struct clamscan_cb_data data;

    int resultOrder = 0;

    memset(&chain, 0, sizeof(chain));

    data.chain = &chain;

    data.filename = (const char *)filename;

    cl_fmap_t* map = cl_fmap_open_memory(buf, bufSize);

    memset(options, 0, sizeof(struct cl_scan_options));

    options->parse |= ~0;                           /* enable all parsers */

    options->general |= CL_SCAN_GENERAL_HEURISTICS | CL_SCAN_GENERAL_HEURISTIC_PRECEDENCE; /* enable heuristic alert options */

    options->heuristic |= CL_SCAN_HEURISTIC_ENCRYPTED_ARCHIVE;

    if ((ret = cl_scanmap_callback(map, NULL, &auchar_malware_name, &size, g_clamav_engine, options, &data)) == CL_VIRUS)

   

    cl_fmap_close(map);

    return 0;

 

Clamav 开源防病毒软件

【中文标题】Clamav 开源防病毒软件【英文标题】:Clamav open source antivirus 【发布时间】:2017-03-31 09:08:13 【问题描述】:

作为我项目的一部分,我一直在尝试研究 clamav 开源防病毒软件的源代码。因此,我从网站上下载了最新的稳定版本clamav.0.99.2.tar.gz

我在 Windows 10 64 位上使用 eclipse neon.2 Release 4.6.2。

我使用提取的 clamav 文件夹创建了一个现有的 make 文件项目,然后将其转换为 C/C++ 自动工具项目。

在配置项目时,我得到一个错误“openssl not found”,虽然我已经在我的 cygwin64 终端中安装了 openssl,而且我只从这个终端运行了 ecipse。

我的方法完全错误吗?

【问题讨论】:

您是只安装了 OpenSSL 基础包还是 development 包? 在网站 [link]openssl.org/source 中,我下载了 openssl-1.0.2k.tar.gz (SHA256) (PGP sign) (SHA1),对不起..i'我是菜鸟 【参考方案1】:

从 linux VM 的终端输入:

sudo apt-get install libssl-dev 

然后从 clamav-0.99.2 目录类型安装 SSL:

./configure 

完成后输入:

make 

这需要一段时间才能完成,然后(如果您想实际安装 clamav 应用程序)键入:

make install

【讨论】:

嘿...是的,我在我的 cygwin 终端上安装了 openssl 开发包,现在错误消失了,谢谢:) 我的项目配置成功,但是当我构建它时,它显示错误 - /cygdrive/C/Users/Sona/workspace/clamavfinal/Makefile.in] 错误 127 clamavfinal line 589 C/C++ 问题和一些警告 - 无效的项目路径:找不到包含路径 (\usr\include)。 clamavfinal pathentry 路径入口问题。 有什么帮助吗? 先猜一猜,重新运行setup并启用所有头文件的安装。 我设法通过安装 automake 1.14 来消除该错误。但是我在构建过程中遇到了另一个问题。

以上是关于防病毒Clamav使用及API调用测试的主要内容,如果未能解决你的问题,请参考以下文章

linux clamav杀毒软件的安装

邮件安全防护之反垃圾邮件开源软件ASSP

Linux服务器安全指南

Clamav 开源防病毒软件

使用clamav模块对数据流进行病毒检测

如何使用ClamAV扫描病毒