开源杀毒引擎库libclamav的使用方法

news2024/11/27 12:50:14

《开源杀毒引擎ClamAV的源码编译安装》中我们讲了ClamAV的安装和使用方法,可以很方便的使用ClamAV提供的工具进行病毒扫描,当然我们也可以在我们的程序中集成它提供的libclamav开发库来实现病毒扫描,libclamav是一个功能强大的病毒扫描库,提供了许多API函数来帮助开发者编写自己的病毒扫描程序。

下面我们一起来看一下libclamav病毒库的API函数以及使用方法。

1、libclamav说明

libclamav的头文件是clamav.h,使用libclamav需要包含clamav.h头文件,开发库可以使用动态库libclamav.so或者静态库libclamav_static.a。libclamav提供的主要API函数如下:

  • cl_init()

在使用libclamav之前,您应该调用cl_init()来初始化它。CL_INIT_DEFAULT是一个宏,可以传递给代表默认初始化设置的cl_init()。函数原型:

int cl_init(unsigned int options);

cl_init()成功时返回CL_SUCCESS,错误时返回另一个代码。

  • cl_engine_new()

cl_init()完成后,就可以通过调用cl_engine_new()来创建新的扫描引擎了。函数原型:

struct cl_engine *cl_engine_new(void);

cl_engine_new返回指针,如果没有足够的内存来分配新的引擎结构,则返回NULL。

  • cl_engine_free()

要释放由引擎分配的资源,使用cl_engine_free()。函数原型:

int cl_engine_free(struct cl_engine *engine);

cl_engine_free()成功时返回CL_SUCCESS,错误时返回另一个代码

  • cl_retdbdir()

返回病毒库所在的默认路径。函数原型:

const char *cl_retdbdir(void);

  • cl_load()

cl_load()从给定目录(当path指向某个目录时)加载单个数据库文件或所有数据库。第二个参数用于传递指向引擎的指针,该指针应该先前使用cl_engine_new()分配。许多加载的签名将被添加到签名中。最后一个参数可以传递以下标志:

  • CL_DB_STDOPT这是一组推荐的扫描选项的别名。

  • CL_DB_PHISHING加载网络钓鱼签名。

  • CL_DB_PHISHING_URLS初始化钓鱼检测模块并加载.wdb和.pdb文件。

  • CL_DB_PUA为可能不需要的应用程序加载签名。

  • CL_DB_OFFICIAL_ONLY只从数字签名数据库加载官方签名。

  • CL_DB_BYTECODE加载字节码。

函数原型:

int cl_load(const char *path, struct cl_engine *engine,        unsigned int *signo, unsigned int options);

  • cl_cvdverify()

通过加载和卸载病毒CVD文件来验证CVD文件。函数原型:

extern cl_error_t cl_cvdverify(const char *file);

  • cl_strerror()

将错误代码转换为可读的消息。函数返回一个静态分配的字符串。函数原型:

extern const char *cl_strerror(cl_error_t clerror);

  • cl_engine_compile()

当加载了病毒数据库后,通过调用cl_engine_compile()来准备检测引擎。失败的情况下,应该使用cl_engine_free()释放分配给引擎的内存。函数原型:

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,        struct cl_scan_options *options);

  • cl_scandesc

通过指定文件描述符进行病毒扫描,函数原型:​​​​​​​

int cl_scandesc(        int desc,        const char *filename,        const char **virname,        unsigned long int *scanned,        const struct cl_engine *engine,        struct cl_scan_options *options);

2、libclamav的使用

《开源杀毒引擎ClamAV的源码编译安装》中安装clamav后,在clamav-1.1.0/build/install/目录下可以看到libclamav的头文件、开发库和CVD病毒文件:

在该目录下新建一个libclamav_test.c :​​​​​​​

#include <stdlib.h>#include <string.h>#include <math.h>#include <clamav.h>
int main(int argc, char *argv[]){    int ret = cl_init(CL_INIT_DEFAULT);    if (ret != CL_SUCCESS)    {        printf("cl_init() error: %s\n", cl_strerror(ret));        return 1;    }
    struct cl_engine *engine = cl_engine_new();    if (engine == NULL)    {        printf("Can't create new engine\n");        return 1;    }
    unsigned int sigs = 0;    ret = cl_load("./share/clamav/", engine, &sigs, CL_DB_STDOPT);    if(ret != CL_SUCCESS)    {        printf("cl_load() error: %s\n", cl_strerror(ret));        cl_engine_free(engine);        return 1;    }
    if((ret = cl_engine_compile(engine)) != CL_SUCCESS)    {        printf("cl_engine_compile() error: %s\n", cl_strerror(ret));        cl_engine_free(engine);        return 1;    }
    const char *virname = NULL;    struct cl_scan_options options;    memset(&options, 0, sizeof(struct cl_scan_options));    options.parse |= ~0;    ret = cl_scanfile(argv[1], &virname, NULL, engine, &options);    if(ret == CL_VIRUS)    {        printf("Virus detected: %s\n\n", virname);    }    else    {        printf("No virus detected.\n\n");        if(ret != CL_CLEAN)        {            printf("Error: %s\n", cl_strerror(ret));        }    }
    cl_engine_free(engine);
    return 0;}

编译libclamav_test.c :

gcc -g libclamav_test.c -o libclamav_test -I include/ -lz -lm -lxml2 -ljson-c -lbz2 -ljansson -lpcre2-8 -lmilter -L ./lib -lclamav

在/tmp目录放入一个病毒样本文件,运行libclamav_test.c,参数指定为样本文件,查看结果,可以成功识别出病毒:

好了,libclamav库的使用就讲到这里了,使用起来还是很简单的。

有问题的朋友,可以进网络技术开发交流群提问(先加我wx,备注加群)。喜欢文章内容的朋友,记得加个关注哦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录刷题第46天|LeetCode139单词拆分、多重背包

1、LeetCode139单词拆分 题目链接&#xff1a;139单词拆分 1、dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词。 2、递推公式&#xff1a;如果确定dp[j] 是true&#xff0c;且 [j, i] 这个区间的子串出现在字典里…

Using index Using where和 Using where Using index有何区别

先把结论呈现出来&#xff1a; 1、Using index : 查询的列被索引覆盖&#xff0c;并且where筛选条件是索引的是前导列&#xff0c;Extra中为Using index 2、 Using index &#xff0c;Using where&#xff1a;查询的列被索引覆盖&#xff0c;数据都是先通过索引查询出来的…

语法篇JS基础

一、初识JavaScript 1.1前景 CSS 预处理器 CSS 预处理器定义了一种新的语言&#xff0c;其基本思想是&#xff0c;用一种专门的编程语言&#xff0c;为 CSS 增加了一些 编程的特性&#xff0c;将 CSS 作为目标生成文件&#xff0c;然后开发者就只要使用这种语言进行 CSS 的编码…

cookies介绍

cookies介绍 Cookies概述 Cookies是网络浏览器中用于存储用户信息的小文本文件。Cookie的大小通常限制在4KB以内&#xff08;不同浏览器内核可能有细微差异或有单域名更高的限制&#xff09;。当你访问某个网站时&#xff0c;该网站可能会在你的计算机上创建一个cookie&#…

PDB Database - ESM Atlas PDB 数据集的多维度分析与整理 (3)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131095395 PDB 三大数据集的多维度分析与整理&#xff1a; 人工提交 - RCSB PDB&#xff1a;PDB Database - RCSB PDB 数据集的多维度分…

YUV4:2:0是什么意思

我们经常看到YUV中4&#xff1a;2&#xff1a;0&#xff0c;看着好像懂&#xff0c;仔细看又不懂。 比例&#xff0c;N1:N2:N3里面的数字指水平方向上的相对采样率&#xff0c;N1表示在奇数行和偶数行里Y样本的个数&#xff0c;N2表示奇数行里Cb和Cr样本的个数&#xff0c;N3…

ciscn_2019_s_4-栈迁移

1&#xff0c;三连 程序功能&#xff1a;两次输入 题目类型猜测&#xff1a;栈溢出&#xff0c;栈迁移 2&#xff0c;ida分析 溢出点&#xff1a; system_plt地址: 思路&#xff1a;由于无直接getshell的利用函数&#xff0c;溢出空间只有8字节&#xff08;ebpret占用无法继续…

数据结构与算法脑图

数据结构 非受限线性表 顺序结构 数组 支持 O(1) 的随机访问平均为 O(n) 的插入和删除警惕越界错误,导致 Stack Over Flow链式结构 单链表 不支持随机访问,需要遍历去访问结点插入和删除只需要移动指针,时间复杂度为 O(1)每个结点需要额外的空间存储指针,需要的内存比数组…

控制视图内容的位置

文本域中的提示内容在默认情况下是垂直居中的&#xff0c;要改变文本在文本域中的位置&#xff0c;可以使用android:gravity来实现。 利用android:gravity可以指定如何在视图中放置视图内容&#xff0c;例如&#xff0c;如何在文本域中放置文本。 如果希望视图文本显示在上方&a…

RocketMQ 学习社区重磅上线!AI 互动,一秒了解 RocketMQ 功能源码

作者&#xff1a;RocketMQ学习社区 RocketMQ 背景 Apache RocketMQ 诞生至今&#xff0c;一直服务于 100% 阿里集团内部业务、阿里云以及开源社区数以万计的企业客户。 历经十多年双十一严苛流量验证的 RocketMQ&#xff0c;承载了超过万亿级消息规模的洪峰压力。2021 年 Ap…

大数据权限与安全

大数据权限与安全 1、权限概述 1.1、大数据平台权限管控现状 权限的管控&#xff0c;历来是大数据平台中最让人头疼的问题之一。管得严了&#xff0c;业务不流畅&#xff0c;用户不开心&#xff0c;放得宽了&#xff0c;安全没有底。而且大数据平台组件&#xff0c;服务众多…

InnoDB - 页结构

InnoDB - 页结构 文章目录 InnoDB - 页结构1. InnoDB页简介2. InnoDB页结构2.1 User Records&#xff08;数据&#xff09;2.2 Page Directory&#xff08;页目录&#xff09;2.3 Page Header&#xff08;页头部信息&#xff09;2.4 File Header&#xff08;文件头&#xff09;…

ByteBuddy

JavaAgent是在JDK5之后提供的新特性&#xff0c;也可以叫java代理。 开发者通过这种机制(Instrumentation)可以在加载class文件之前修改方法的字节码(此时字节码尚未加入JVM)&#xff0c;动态更改类方法实现AOP&#xff0c;提供监控服务如&#xff1b;方法调用时长、可用率、内…

RocketMQ详解

介绍 ​ RocketMQ作为一款纯Java、分布式、队列模型的开源消息中间件&#xff0c;支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。 RocketMQ 特点 支持发布/订阅&#xff08;Pub/Sub&#xff09;和点对点&#xff08;P2P&#xff09;消息模型 ​ 在一个队列中可…

ASEMI代理英飞凌SPW47N60C3功率MOS管的性能与应用

编辑-Z 本文将对SPW47N60C3功率MOSFET的性能与应用进行分析。我们将介绍SPW47N60C3的基本性能参数&#xff0c;然后从四个方面对其性能进行详细阐述&#xff0c;包括电气性能、热性能、封装与可靠性以及应用领域。 1、SPW47N60C3的基本性能参数 SPW47N60C3是一款高性能的功率…

Python 和 C++ 混合编程:pybind11 使用

Python 和 C 混合编程&#xff1a;pybind11 使用 1. 目的需求2. pybind 11 简介3. 使用实践3.1 开发环境3.2 准备工作3.3 建立工程 test3.4 编译工程 test 库3.5 Python 调用 工程 test 库 4. 实线小结5. 参考资料 1. 目的需求 我们通常在 Python 上进行算法开发&#xff0c;因…

【数据结构】——树的相关习题

目录 一、选择填空判断题题1题2题3题4题5题6题7题8题9 二、应用题题10&#xff08;遍历序列&#xff09;题11&#xff08;存储结构&#xff09;题12 13&#xff08;二叉树/树、森林之间的转换&#xff09;题14&#xff08;线索二叉树&#xff09; 一、选择填空判断题 题1 1、设…

Java的包装类(装箱和拆箱面试题)

1.为什么要有包装类(或封装类&#xff09; 为了使基本数据类型的变量具有类的特征&#xff0c;引入包装类。 2.基本数据类型与对应的包装类&#xff1a; 3.装箱和拆箱 基本数据类型包装成 包装类的实例—装箱 通过包装类的构造器实现&#xff1a; int i 500; Integer t ne…

案例34:基于Springboot在线互动学习网站开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

深度学习笔记之Seq2Seq(一)基本介绍

深度学习笔记之Seq2seq——基本介绍 引言回顾&#xff1a;经典循环神经网络结构关于循环神经网络的更多引用 Seq2seq \text{Seq2seq} Seq2seq网络结构 Seq2seq \text{Seq2seq} Seq2seq结构描述 引言 从本节开始&#xff0c;将介绍 Seq2seq \text{Seq2seq} Seq2seq。 回顾&…