##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 ##<> = 交叉对比病毒热度 = ##startInc == 目标 == `需要一个通用的脚本,可以`: 1. 自动化处理 江民/瑞星 等有检测记要输出的杀软日志文本 1. 自动对比指定疫情网站公布的热点病毒,确认自己机器中哪些病毒样本是热点样本 1. 综合积累对比各个杀软检测日志和各个疫情排行,得出自己中哪些病毒样本是公认的热点样本 假设: 1. 所有杀软日志都处理成纯文本,编码是 utf-8 1. 疫情排行的热点值,根据排行简单倒序设定: * 比如说,前 300个病毒,列表则: * 排名第一的病毒流行值为 300 * 排名第二的病毒流行值为 299 * 依次类推 == 准备 == 1. 病毒排行收集: * 从 金山安全官方网站 - http://www.duba.net/ * 整理得到 [[attachment:毒霸疫情中的前500个病毒名.TXT]] * 从 江民病毒预警中心 http://virusinfo.jiangmin.com/online.asp * 整理得到 [[attachment:江民疫情中的前300个病毒名.TXT]] * 从 瑞星病毒疫情监测网 http://alert.rising.com.cn/virus/index.htm * 整理得到 [[attachment:瑞星疫情中的前500个病毒名.TXT]] 1. 本地病毒样本日志: * 用江民全盘扫描日志输出为 [[attachment:KV-RESULT.txt]] * 用瑞星全盘扫描日志输出的 .exl 转换为 [[attachment:RX_result.csv]] == 处理 == `使用virusampls-ratio.py 脚本进行依次处理` [[attachment:virusampls-ratio.py]] 的功能如自带的帮助所述: * {{attachment:spx-100412-vsr-0-help.png}} 1. `--lkv` 处理江民日志文本,输出 .dump 为后缀的 Python 字典对象序列化文件 1. `--lrx` 处理瑞星日志文本,输出 .dump 为后缀的 Python 字典对象序列化文件 1. `--r 指定.dump 某疫情排行文本` 对比指定杀软日志处理中间结果和疫情的对比 * 输出:`*-hot4-*.txt` 一个击中指定疫情排行的本地病毒列表 * 更新:`virusampls-ratio.dict.dump` 本地综合积累对比Python 字典对象序列化文件 * 字典内在结构是:{{{ { "病毒名":[积累热点值,"本地隔离区目录样本路径"] ,... } e.g. 'AdWare.Win32.Undef.fts':[72, 'E:\\100406\\2010-04-05-2-rs\\DB\\b3daa87c013f2716591850785b58661d'] }}} 1. `-e *.txt path/2/export` 最终结果输出: * 输出一个本地病毒样本交叉对比列表,依综合所有疫情热点排行后,热点值从高到低排列 * 没有在各个疫情 top** 的本地样本不记入 * 注意!如果想脚本同时将对应的样本也复制到指定目录中,得打开注释: * {{{#!python def finalExport(args): #... for t in td: print t hotvli +="%s\t\t%s\n"%(t[0],t[1][1]) #shutil.copy(t[1][1],expdir) #就是这个! open(expfn,"w").write(hotvli) }}} === 安装 Python 环境 === * 下载: http://python.org/ftp/python/2.5.4/python-2.5.4.msi * ^囧rz^ 因为官方网站,下载页面中含有不和谐数字,所以,一直被墙,但是有很多渠道可以获得 ;-) * 正常安装 * 建议增补一下系统目录值: * `我的电脑->高级->环境变量->path`: 增补安装Python 到的目录 * {{attachment:spx-100412-vsr-a0-py-env.png}} * 这样就可以在任何目录运行 Python 了 * {{attachment:spx-100412-vsr-a1-py-done.png}} === 交叉对比 === `在本案例中,根据先后次序,列举运行的命令和关键截屏:` 处理日志:: * `注意!` 为了通用,请将所有日志文本,转存成 utf-8 编码的,否则,是对比不能的 ;-) * `>python virusampls-ratio.py --lkv KV-RESULT.txt` * 输出类似:{{attachment:spx-100412-vsr-0-kv.png}} * `>python virusampls-ratio.py --lrx RX_result.csv` * 输出类似:{{attachment:spx-100412-vsr-0-rx.png}} 分别对比疫情排行: * {{{ > python virusampls-ratio.py -r KV-RESULT.txt.dump 毒霸疫情中的前500个病毒名.TXT > python virusampls-ratio.py -r KV-RESULT.txt.dump 江民疫情中的前300个病毒名.TXT > python virusampls-ratio.py -r KV-RESULT.txt.dump 瑞星疫情中的前500个病毒名.TXT }}} * 输出类似: {{attachment:spx-100412-vsr-1-yq.png}} * {{{ > python virusampls-ratio.py -r RX_result.csv.dump 毒霸疫情中的前500个病毒名.TXT > python virusampls-ratio.py -r RX_result.csv.dump 江民疫情中的前300个病毒名.TXT > python virusampls-ratio.py -r RX_result.csv.dump 瑞星疫情中的前500个病毒名.TXT }}} * 输出类似: {{attachment:spx-100412-vsr-2-yq.png}} 最终输出成果: * {{{>python virusampls-ratio.py -e virus-hotest-in-my-pc.tx tmp}}} * 输出类似: {{attachment:spx-100412-vsr-3-export.png}} * 本次综合对比后得出的 186个高热点样本列表: * [[attachment:virus-hotest-in-my-pc.txt]] == 代码 == `含注释,空行,共145行,完成所有处理!` {{{#!python #!/usr/bin/env python # -*- coding: utf-8 -*- import os,sys,time,pickle,shutil from optparse import OptionParser from operator import itemgetter VERSION="virusampls-ratio v10.4.12" def processLogKV(fname): "简单处理KV查杀日志为list对象[计数,病毒名,隔离区目录]" print fname dumpf = "%s.dump"%fname dumpd = {} for line in open(fname).readlines(): if " 中发现 " in line: tags = line.split() print tags[3],tags[1] viru = tags[3] path = tags[1] if viru in dumpd.keys(): pass else: dumpd[viru]=[0,path] pickle.dump(dumpd, open(dumpf, 'wb')) print "\n\n%s\n\tdumped %d lines checked log as Python List obj."%(VERSION,len(dumpd.keys())) def processLogRX(fname): "简单处理RX查杀日志为list对象[计数,病毒名,隔离区目录]" print fname dumpf = "%s.dump"%fname dumpd = {} for line in open(fname).readlines(): if "手动查杀" in line: tags = line.split(";") print tags[2][1:-1],tags[6][1:-1] viru = tags[2][1:-1] path = tags[6][1:-1] if viru in dumpd.keys(): pass else: dumpd[viru]=[0,path] pickle.dump(dumpd, open(dumpf, 'wb')) print "\n\n%s\n\tdumped %d lines checked log as Python List obj."%(VERSION,len(dumpd.keys())) def ratioYQ(args): """将查杀日志和厂商疫情进行对比,按照排名积累分数,最终得到综合热度: 前500排名的话,第一名为500分; MiscItems/2008-07-01 - Woodpecker Wiki for CPUG http://wiki.woodpecker.org.cn/moin/MiscItems/2008-07-01 Python中最快的字典排序方法 | Windstorm http://www.kunli.info/2009/05/07/sorting-dictionaries-by-value-in-python/ """ dumpf = args[0] yqfile = args[1] tophotf = "%s-hot4-%s.txt"%(dumpf.split(".")[0],yqfile.split(".")[0]) ratio = pickle.load(open(dumpf, 'rb')) flines = open(yqfile).readlines() for i in range(len(flines)): hvname = flines[i].upper().replace(".","").replace("/","") for v in ratio.keys(): vname = v.upper().replace(".","").replace("/","") if vname in hvname: ratio[v][0]+=i unitRatioDictFile = "virusampls-ratio.dict.dump" try: unitRD = pickle.load(open(unitRatioDictFile, 'rb')) except: unitRD = {} td = sorted(ratio.iteritems(), key=itemgetter(1), reverse=True) hotvli="" for t in td: if 0!=t[1][0]: print t hotvli +="%s\t\t%s\n"%(t[0],t[1][1]) if t[0] in unitRD.keys(): unitRD[t[0]][0] +=t[1][0] else: unitRD[t[0]] =[t[1][0],t[1][1]] open(tophotf,"w").write(hotvli) print "\n\n%s\n\tfound top %d hotest Virus base %s...\n\t\t export as:%s"%(VERSION ,len(hotvli) ,yqfile ,tophotf ) pickle.dump(unitRD, open(unitRatioDictFile, 'wb')) def finalExport(args): "将最终交叉对比出来的列表输出到指定目录/文件,同时(尝试将隔离区文件也复制到指定目录)" expfn = "%s/%s"%(args[1],args[0]) expdir = args[1] unitRatioDictFile = "virusampls-ratio.dict.dump" unitRD = pickle.load(open(unitRatioDictFile, 'rb')) td = sorted(unitRD.iteritems(), key=itemgetter(1), reverse=True) hotvli="" for t in td: print t hotvli +="%s\t\t%s\n"%(t[0],t[1][1]) #shutil.copy(t[1][1],expdir) open(expfn,"w").write(hotvli) print "\n\n%s\n\tfound top %d hotest Virus in my pc \n\t\t export list file::%s"%(VERSION ,len(td) ,expfn ) if __name__ == '__main__': # this way the module can be begin = time.time() usage = "usage: %prog [option0] arg0 [arg1]" parser = OptionParser(usage,version=VERSION) parser.add_option("-r","--ratio",dest="ratio",nargs=2, type="string",metavar="*.dump some-hot-virus-list.txt", help="YiQing comparison,uasge --lrx|lkv processed .dump file " "e.g KV-RESULT.dump some-hot-virus-list.txt") parser.add_option("--lrx",dest="lrx", type="string", help="process RX checking log") parser.add_option("--lkv",dest="lkv", type="string", help="process KV checking log") parser.add_option("-e","--export",dest="export",nargs=2, type="string",metavar="*.txt path/2/export ", help="export total hotest virus list into dir " "e.g -e virus-hotest-in-my-pc.tx tmp") (options, args) = parser.parse_args() if 1 == len(sys.argv): parser.print_help() if options.ratio : print "comparison checked list and YiQing list\n\n" ratioYQ(options.ratio) else: if options.lrx: print "\n\nreFormat RX checking list\n\n" processLogRX(options.lrx) if options.lkv: print "\n\nreFormat KV checking list\n\n" processLogKV(options.lkv) if options.export: print "\n\nexport total hotest virus list in to\n\n" finalExport(options.export) if (options.lrx and options.ratio) or (options.lkv and options.ratio): print "\n\nATTENTION!\n\t -r and --lrx|lkx can not usage in same time!\n\n" parser.error("incorrect number of arguments! \nATTENTION!\n" "\ne.g.\n \tpython %s -lrx something.txt " "\nor\n\tpython %s -r sonething.dump top500-from-RX.TXT"%(parser.get_prog_name() ,parser.get_prog_name()) ) parser.print_help() }}} ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]