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

《开源杀毒引擎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的使用方法_第1张图片

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

#include #include #include #include 
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,备注加群)。喜欢文章内容的朋友,记得加个关注哦~~

你可能感兴趣的:(ClamAV,clamav,libclamav,杀毒引擎,杀毒)