介绍
ClamAV(简称 ClamAV)是一款开源的病毒扫描器,可以用来检测和清除电脑中的病毒、蠕虫、恶意软件等威胁。ClamAV 支持多种文件格式,包括 Windows 下的可执行文件、动态链接库、Office 文档、图像文件、电子邮件等,并且具有高度可扩展性和可配置性,能够满足不同用户的需求。
ClamAV 不仅可以作为本地扫描工具使用,还可以集成到网络中,提供网络级别的病毒防护功能。ClamAV 支持多种系统,包括 Windows、Linux、Mac OS、FreeBSD 等,并且能够在服务器端和客户端使用。
ClamAV 还提供了许多工具和库,可以帮助开发者在自己的应用中集成病毒扫描功能。例如,ClamAV 提供了命令行工具 clamscan
和 clamdscan
,可以在 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
匹配输出的结果中是否发现了病毒文件
...
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