0


防病毒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;

}


本文转载自: https://blog.csdn.net/windStudyer/article/details/124429485
版权归原作者 fzsecurity 所有, 如有侵权,请联系我们删除。

“防病毒Clamav使用及API调用测试”的评论:

还没有评论