• 基于Python的病毒扫描机制


    构建集中式病毒扫描机制(ClamAV)

      Clam AntiVirus(ClamAV)是一款免费而且开源的防毒软件,软件与病毒库的更新皆有社区免费发布,官网地址:http://www.clamav.net/lang/en/。目前ClamAV主要为Linux、Unix系统提供病毒扫描、查杀服务等。pyClamad((http://xael.org/norman/python/pyclamd/)是一个Python第三方模块,可让Python直接使用ClamAV病毒扫描守护进程clamd,来实现一个搞笑的病毒检测功能,另外,pyClamad模块也非常容易整合到我们已有的平台中,下面详细进行说明。

    pyClamad模块安装方法:

      1.客户端(病毒扫描源)安装步骤

    # yum install -y clamav clamd clamav-update #安装clamavp相关程序包
    # chkconfig --levels 235 clamd on # 添加扫描守护进程clamd系统服务
    # /usr/bin/freshclam	# 更新病毒库,建议配置到crontab中定期更新
    # setenforce 0 #关闭 SELinux,避免远程扫描时提示无权限问题
    

      2. 主控端部署 pyClamad环境步骤

    # wget http://xael.org/norman/python/pyclamd/pyClamd-0.3.4.tar.gz
    # tar -zxvf pyClamd-0.3.4.tar.gz
    # cd pyClamd-0.3.4
    # python setup.py install
    

      

    块常用方法说明:

      pyClamad提供了两个关键类,一个为 ClamdNetworkSocket()类,实现使用网络套接字操作clamd; 另一个为 ClamdUnixSocket()类,实现使用Unix套接字类操作clamd,两个类定义的方法完全一样,本节以 ClamdNetworkSocket()类说明

    __init__(self,host='127.0.0.1',port=3310,timeout=None)方法,是 clamdNetworkSocket()类的初始化方法,参数host为连接主机IP,参数port为连接端口,默认为3310,与/etc/clamd.conf配置文件中的TCPSocket参数要保持一致;timeout为连接的超时时间。

    contscan_file(self,file)方法,实现扫描指定的文件或目录,在扫描时发生错误或发行病毒将不终止,参数 file(string类型)为指定的文或目录的绝对路径

    multiscan_file(self,file)方法,实现多线程扫描指定的文件或目录,多核环境速度更快,在扫描发生错误或发现将不终止,参数 file(string类型)为指定的文件或目录的绝对路径。

    scan_file(self,file)方法,实现扫描指定文件或目录,在扫描时发生错误或发现病毒将终止,参数 file(string类型)为指定的文件或目录的绝对路径

    shutdown(self)方法,实现强制关闭clamd进程并退出。 

    stats(self)方法,获取Clamscan的当前状态。

    reload(self)方法,强制重载clamd病毒特征库,扫描前建议做reload操作

    ELCAR(self)方法,返回ELCAR测试字符串,即生成有病毒特征的字符串,便于测试

    实践:实现集中式的病毒扫描

      本次实践通过ClamdNetworkSocket()方法实现与业务服务器建立扫描socket连接,再通过启动不同扫描方式实施病毒扫描并返回结果。实现代码如下:

      

    #!/usr/bin/python
    # -*- coding: utf-8 -*- 
    import time
    import pyclamd
    from threading import Thread
    class Scan(Thread)
    	def __init__(self,IP,scan_type,file):
    		"""构造方法,参数初始化"""
    		Thread.__init__(self)
    		self.IP = IP
    		self.scan_type = scan_fype
    		self.file = file
    		self.connstr = ""
    		self.scanresult = ""
    	def run(self):
    		"""多线程 run 方法 """
    		try:
    			cd = pyClamad.ClamdNetworkSocket(self.ip,3310)		#创建忘了套接字连接对
    			if cd.ping():	#探测连通性
    				self.connstr=self.IP+" connection [OK]"
    				cd.reload()			#重载clamd病毒特征库,建议更新病毒库后做reload()
    				if self.scan_type == "contscan_file":		#选择不用扫描模式
    					self.scanresult="{0}
    ".format(cd.contscan_file(self.file))
    				elif self.scan_type=="multiscan_file":
    					self.scanresult="{0}
    ".format(cd.multiscan_file(self.file))
    				elif self.scan_type=="scan_file":
    					self.scanresult="{0}
    ".format(cd.scan_file(self.file))
    				time.sleep(1)	#线程挂起1秒
    			else:
    				seif.connstr=self.IP+ "ping error,exit"
    				return
    		except Exception,e:
    			self.connstr=self.IP+" "+str(e)
    Ips=['192.168.1.21,192.168.1.22']		# 扫描主机列表
    scantype="multiscan_file"		#指定扫描模式,支持multiscan_file、contscan_file、sca
    scanfile="/date/www"		#指定扫描路径
    i=1
    threadnum=2 	#指定启动线路数
    scanlist = []	# 存储扫描 Scan 类线程对象列表
    for ip in Ips:
    	currp = Scan(ip,scantype,scanfile)		#创建扫描Scan类对象,参数(ip,扫描模式,
    	scanlist.append(currp)
    	if i&threadnum==0 or i==len(Ips):		# 当达到指定的线程数或IP列表数后启动、退
    		for take in scanlist:
    			take.start()		# 启动线程
    		for take in scanlist:
    			take.join()			#等待所有子线程退出,并输出扫描结果
    			print take.connstr 		#打印服务器连接信息
    			print take.scanresult 		#打印扫描结果
    		scanlist = []
    	i+=1
    	#通过EICAR()方法生成一个带有病毒特征的文件/tmp/EICAR,代码如下:
    	
    	void = open('/tmp/EICAR','W').write(cd.EICAR()) 
    

      

      最后,启动扫描程序,在本次实践过程中启用两个线程,可以根据目标主机随意修改,代码运行结果如下,其中192.168.1.21主机没有发现病毒,192.168.1.22主机中发现了病毒测试文件EICAR。

      

    # python simple1.py
    192.168.1.21 connection [OK]
    None
    
    192.168.1.22 connection [OK]
    {u'/data/www/Lwebadmin/EICAR': ('FOUND', 'Eicar-Test-signature')}
    

      

      

  • 相关阅读:
    BZOJ1969: [Ahoi2005]LANE 航线规划
    BZOJ1800: [Ahoi2009]fly 飞行棋
    BZOJ2661: [BeiJing wc2012]连连看
    BZOJ2464: 中山市选[2009]小明的游戏
    BZOJ2440: [中山市选2011]完全平方数
    BZOJ2226: [Spoj 5971] LCMSum
    Codeforces 610B
    Codeforces 757B
    Codeforces B
    HDU 6090 Rikka with Graph
  • 原文地址:https://www.cnblogs.com/Gnnnny/p/9082045.html
Copyright © 2020-2023  润新知