python3调用clamav杀毒

2023-07-11 12:21:30 浏览数 (1)

介绍

ClamAV(简称 ClamAV)是一款开源的病毒扫描器,可以用来检测和清除电脑中的病毒、蠕虫、恶意软件等威胁。ClamAV 支持多种文件格式,包括 Windows 下的可执行文件、动态链接库、Office 文档、图像文件、电子邮件等,并且具有高度可扩展性和可配置性,能够满足不同用户的需求。

ClamAV 不仅可以作为本地扫描工具使用,还可以集成到网络中,提供网络级别的病毒防护功能。ClamAV 支持多种系统,包括 Windows、Linux、Mac OS、FreeBSD 等,并且能够在服务器端和客户端使用。

ClamAV 还提供了许多工具和库,可以帮助开发者在自己的应用中集成病毒扫描功能。例如,ClamAV 提供了命令行工具 clamscanclamdscan,可以在 shell 中执行扫描任务;ClamAV 还提供了编程库 libclamav,可以帮助开发者在自己的程序中集成病毒扫描功能

其实也没有夸它的意思,Linux上能用的杀软也挺多的,而且因为它是开源的,所以在病毒库的更新上也会比那些商用的杀软晚一些,主要是项目遇到了,我拿来水一篇用python调用后杀毒然后查询md5的文章

软件安装

  • Centos

Centos上安装的步骤可能多一丢丢,首先需要配置个网络源,然后执行这两条安装

代码语言:javascript复制
yum install epel-release -y
yum install clamav clamav-update clamav-server clamav-server-systemd clamav-data clamav-filesystem clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd clamav-update clamav-scanner-systemd -y

接着开启服务,以及开机自启动

代码语言:javascript复制
systemctl start clamav-freshclam
systemctl enable clamav-freshclam

systemctl start clamav-daemon
systemctl enable clamav-daemon

(ps: start clamav-daemon的时候可能会报错,但是我环境中没有影响我的使用)

  • Ubuntu

ubuntu就简单的多

代码语言:javascript复制
apt install clamav

安装完成后,可以通过以下命令实现病毒库的更新

代码语言:javascript复制
freshclam

ClamAV 还有许多其他的用法,例如在后台运行定期扫描、扫描特定的文件夹或文件等。可以使用 man clamscan 命令查看详细的用法。

代码实现

代码其实可以完全不需要安装第三方库来实现,主要是靠

代码语言:javascript复制
import subprocess
import re
import hashlib

当然,subprocess这个库在Python 3.5 及以上版本中才可以使用,如果是以下的版本,则需要用os.system来实现执行命令的操作了

为了美化操作,我使用的是这个库

代码语言:javascript复制
...
from tabulate import tabulate

我们先写一个计算md5值的方法

代码语言:javascript复制
...
def calculate_md5(filename):
    hash_md5 = hashlib.md5()
    with open(filename, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

上面的代码是逐块读取文件的,这样可以避免一次性将整个文件读入内存,对于较大的文件来说可以节省内存

接着,开始写执行命令、获取结果的部分

代码语言:javascript复制
...
output = subprocess.run(["clamscan", "-r", "/root/test/"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
os_result=str(output.stdout)

我的测试环境中,我将php这类木马文件放置在了/root/test/下,所以在-r后看到的目录就是需要扫描的目录

接着,使用re匹配输出的结果中是否发现了病毒文件

代码语言:javascript复制
...
check_av=re.findall("(.*): .* FOUND",os_result)

做完这些操作后,就写一个输出的

代码语言:javascript复制
...
if check_av:
    av_list=[]
    for i in check_av:
        print("[ ] 检测到病毒文件:" i)
        one_file=[]
        filename=str(i)
        file_md5=calculate_md5(i)
        one_file.append(filename)
        one_file.append(file_md5)
        av_list.append(one_file)
    headers=["文件名","MD5"]
    print(tabulate(av_list, headers))
else:
    print("[-] 未发现病毒文件")

最终效果是这样的

如果嫌每次都需要手动改太麻烦,那么可以加个选项,或者像下面这样简单点

代码语言:javascript复制
file_path=str(input("请输入需要扫描的目录:"))

output = subprocess.run(["clamscan", "-r", file_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

完整代码放在了github上

https://github.com/Ernket/python3_clamav_scan

0 人点赞