应用场景:
由C++提供核心接口,利用python定制前端或者用户配置
from ctypes import *
# duba scan and kill virus result structure define
class KAE_SCAN_RESULT(Structure):
_fields_ = [('nVirusNameSize', c_int),
('szVirusName', c_char*256),
('ScanStatus', c_uint32),
('ScanVirusType', c_uint32),
('ScanProcessResult', c_uint32),
('AVEngine', c_uint32),
('nVirusID', c_int),
('CleanVirusID', c_uint32),
('pvScanSign', c_uint32),
('Reserve', c_ubyte*16)]
class ENGBASE_SCAN_RESULT_EX(Structure):
_fields_ = [('dwSize', c_uint32),
('kaeScanResult', KAE_SCAN_RESULT),
('lScanTime', c_longlong),
('dwVirusID', c_uint32),
('dwCleanVirusID', c_uint32)]
# path visit callback function
from os.path import walk, join, normpath
import sys
import os.path
from os import getcwd
def visit(arg, dirname, names):
#print "\n".join(dirname)
files=[normpath(join(dirname, file)) for file in names]
#count = 0
print "in visit ..."
for i in files:
if os.path.isfile(i):
#count += 1
print "File:", i
nRetVal = EngBase.EngBaseScanFileExA(i, pointer(info))
print "scan result : ", nRetVal
# scan directory
def ScanPath(despath):
global info
info = ENGBASE_SCAN_RESULT_EX()
info.dwSize = sizeof(ENGBASE_SCAN_RESULT_EX)
print info.kaeScanResult.nVirusNameSize
fileName = "EngBase.dll"
global EngBase
EngBase = windll.LoadLibrary(fileName)
print EngBase
nRetVal = EngBase.EngBaseInitA()
print "init : ", nRetVal
# scanFile="c:\\boot.ini"
# nRetVal = EngBase.EngBaseScanFileExA(scanFile, pointer(info))
# print "scan : ", nRetVal
# print "virus name : ", info.kaeScanResult.szVirusName
try:
print "to scan : ", despath
walk(despath, visit, 0)
except BaseException:
print "walk error."
nRetVal = EngBase.EngBaseUnInitA()
print "uninit : ", nRetVal
# parse cmd line
def usage():
print "Usage : Python XXX.py "
import getopt, sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "p:v", ["help", "output="])
except getopt.GetoptError:
# print help information and exit:
usage()
sys.exit(2)
verbose = False
print "in ..."
for o, a in opts:
verbose = True
if o == "-p":
ScanPath(a)
elif o in ("-h", "--help"):
usage()
sys.exit()
else:
usage()
if verbose == False :
usage()
# program run start by this
if __name__ == "__main__":
main()