clamav Java_ClamAV安装使用及API例子

ClamAV是一款由Sourcefire组织开发的开源杀毒引擎,Sourcefire同时也是Snort入侵检测引擎的所有者。ClamAV提供了一种更为快速灵活的框架用以检测恶意代码和软件产品。可以作为现有的台式机、文件服务器、邮件服务器以及其他需要杀毒扫描软件场景中杀毒扫描软件的补充工具或者替代产品。另外ClamAV程序包中还包含了libclamav库以及命令行可执行文件接口。同时也提供了freshclam命令行工具用以保证特征库的更新。

ClamAV的最新版本可以在http://www.clamav.net/download/sources/获得。也可以通过程序管理器自动安装。在Ubuntu系统中,输入一下命令即可自动安装:

$ apt-get install clamav clamav-freshclam

下面说一说ClamAV的安装过程(使用clamav-0.98.6版本):

(1) 下载并解压clamav-0.98.6.tar.gz:

# tar vxf clamav-0.98.6.tar.gz

(2) 添加用户组clamav和组成员clamav:

# groupadd clamav

# useradd –g clamav clamav

(3) 进入解压后的目录(源文件放在/usr/local/src中),并如下配置软件:

# ./configure --prefix=/usr/local/clamav

出现一个错误:OpenSSL not found

openssl的开发包没有安装,安装即可:

apt-get install libssl-dev

(4) 编译,安装:

make

make install

此时,还不能使用./clamscan去扫描可以文件,因为还没有特征库可加载到系统中,程序默认在share目录下的clamav文件夹中加载特征库,需要手动在上述路径下添加一个clamav文件夹,并且保证clamav用户能够对文件夹进行读写。

(5) 在/var/log/目录下添加两个log文件:clam.log和clam-update.log,所有者为clamav用户,并保证可读写权限。

(6) 修改/usr/local/clamav /etc/clam.conf将开始的有"Example"的那行用#注释掉。

(7) 修改/usr/local/clamav /etc/freshclam.conf将开始的有"Example"的那行用#注释掉。修改UpdateLogFile /var/log/freshclam.log 为UpdateLogFile /var/log/clam-update.log

(8) 用freshclam升级病毒库:

$ freshclam

freshclam运行以后,share目录下的clamav文件夹中已经存在了最新的特征库文件,下面就可以用clamscan命令进行文件的扫描了

Libclamav库API

libclamav库API提供了病毒扫描的各种函数接口。libclamav库使用的是病毒扫描法(Virus Scanner)。从病毒中提取的特征字符串被用一定的格式组织在一起并加上签名保护就形成了病毒库,clamav使用的病毒库一般后缀为.cvd文件。

在使用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进行文件扫描的最简单的流程,路径之类的采用的都是硬编码,实际使用时可以进行相应的修改。

利用一个样本文件进行试验,编译时加上参数-lclamav,并保证可以找到需要的.so文件和clamav.h文件,得到结果如下:

更多详情后续更新

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

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

相关文章

PHP json_encode后的数据有的大括号于中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。转载于:https://www.cnblogs.com/xxllzizi/p/9836469.ht…

第一次使用 Blog

不喜欢BBS上不负责任的灌水,希望有一个记载自己日常心态和工作中所用到的有用技术的平台,作为自己以后的一个回顾,也与大家一同分享。很久就想拥有自己的Blog了,但这第一次使用 Blog ,还是有点兴奋,Blog这个…

中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux

去年 6 月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能 RISC-V 处理器核心 —— 香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后进行了串口调通,1 月 24 日成功运行了 Linu…

java并发编程实战阅读总结(b)

5、Executor框架 Executor框架是并发集合java.util.concurrent中的一个成员。 Executor为灵活且强大的异步任务执行框架提供了基础,还提供了对生命周期的支持,以及统计信息、应用管理机制和性能监视等机制。Executor 最早是为了解决生产者-消费者模式而…

公司那些事-关于领导

首先,请允许我将范围限定一下,本文中的领导,并不是指那些了不起的大人物,而是说IT企业中的,我们身边的组长,经理,部长等等,之所以这么限定,原因非常简单,本人只接触过这个层面的领导. 领导也是普通人在我们中间,经常有意无意的对领导提出一些比较高的要求,比如领导应该是技术专…

java io流操作_十个Demo进行讲解Java中IO流的常用操作~

好久不见的IO流对IO流的学习,我记得还是初学Java基础的时候,后来找工作过程中经常看到有些招聘信息中写到熟悉IO流,现在想想IO流,真的是一脸懵逼,不说这么多废话了,IO流这次好好整理一下。说说IO流的类别在…

这些应用仍未兼容安卓新版本,系统升级后将无法使用

8月7日,谷歌正式发布Android 9 Pie,至今已两月有余。近日,华为终端开放实验室对国内主流应用在Android 9 Pie的兼容性进行测试,结果显示:目前TOP3000应用兼容率已经超过95%,但仍有少量应用存在启动失败、闪…

非常郁闷,WinForm中正常显示的自定义控件无法在WebForm中正常显示!

我写了一个自定义控件(Win Control),此控件在WinForm中运行正常,但在WebForm中无法显示(在WebForm中此控件并不显示为红叉,但是一个对象图标)。由于没有出现权限或安全方面的提示,因此我从头开始一行一行进行比对,最终…

在家过年这两天|多图

这两天收到了很多朋友的新年祝福,在这里回应下,希望看到这篇文章的朋友们新的一年快乐开心,在求学的人学有所成,在工作的朋友们功成名就,家人健康,吃喝不愁……祝你们㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱…

两路归并排序

两路归并排序(升序排列) (平均/最差)时间复杂度O(NlogN) 将两个有序的单链表合并为一个有序的单链表,默认是按升序排列的。 合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。 尽管如此&…

Eclipse下的项目管理插件介绍

前言 最近,一直学习开源项目的代码,难免会碰到各种版本管理器,作为一名在校大学生,学校的课程完全没提及到,靠着自己的摸索,走了不少弯路,写个列表,望对大家有所帮助.顺便提一下,这里只说客户端,至于服务端,自行根据提供的资料学习 CVS 这里eclipse自带就有,也有一段历史,现在的…

算命

今天大年初三,出了太阳变暖很多,我们带着家里的小朋友一起上街吃早餐。因为明天要去阳西,决定去外婆家看看,在超时买了点东西,走回车上刚好看到路边有算命先生,我就想着来计算一下。我先是问了记算一次多少…

back log

1*你应该备份日志 BACKUP LOG 数据库名 TO DISKc:\aalogbak WITH INIT,NO_TRUNCATE 这样你的日志清空也备份了,日志也清空了,你可以压缩了 在维护日志备份序列时,调度 BACKUP LOG 语句按间隔发生,以使事务日志不致增长到超过预期的…

java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...

我有通过JNI使用cpp共享库libclient.so的java程序Client.class.libclient.so构建为共享并使用cpp共享库libhttp.so.libclient.so和libhttp.so放在文件夹/ home / client / lib64中Client.class放在/ home / client / bin中客户端可以加载库> System.load和环境变量LD_LIBRAR…

tcp的滑动窗口

今天阅读了TCP中滑动窗口部分的内容,总结如下: 滑动窗口:又叫缓冲区,是两台主机间传送数据时的缓冲区。每台TCP/IP主机支持两个滑动窗口:一个用于接收数据,另一个用于发送数据。 窗口尺寸表示计算机可能缓…

嵌入式行业那些坑与出路

嵌入式的坑烧钱嵌入式的学习十分烧钱,这就让人有点望而却步。我是做DSP起步的,更是能体会到嵌入式绝对是一个拿钱搭梯子的学习行业。在我的学习过程中身边有不少的人投向了CS行业,也就是纯软件开发,比如网页、手机应用、数据库等。…

入行后第二份工作的一些感悟

这是我毕业后进入的第二家公司。也是我工作的第二个年头。转眼之间在新公司已经度过半年的时间了。内心还是有些许的感慨。 工作的内容和上家公司是差不多的,主要是做windows方面的基础架构和应用的维护,例如AD、exchange、lync、ISA、虚拟化等等&a…

poj2631

求一棵树的直径,所谓直径就是树上距离最远的两个点! 树形动归,每个点的为根的子树的最长向下链和次长链的和! 当然也可以二次深搜! ————————————————————————————————————————…

原来做的一个语义搜索软件的界面

今天得知NGW(New Generation Web,关于语义网络方面的)课程及实验作业成绩已公布,急去查看,但与想象中相去甚远。 罢了,凡事但求尽力而为,末了问心无愧即可,其它种种皆是虚幻。 附&am…

tcp为什么需要3次握手和3次握手的过程

网络上关于tcp连接时的3次握手相关的文章很多,在此不再重复,个人总结如下,如有不正确之处请给予指正。 tcp“三次握手”的目的是: 为了防止已经失效的请求报文段突然又传送到了服务器端,因而产生错误。 tcp的3次握手过程: (1)、…