《开源杀毒引擎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,备注加群)。喜欢文章内容的朋友,记得加个关注哦~~