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;
}
版权归原作者 fzsecurity 所有, 如有侵权,请联系我们删除。