这几天一直在做有关病毒样本特征提取的工作,解析出了一个样本病毒特征,今天用python进行了相似样本的检验,想和大家一同分享。
开始是这么写的:
#!/usr/bin/python
import os
import os.path
rootdir = "./sample_Backdoor_Linux"
for filenames in os.walk(rootdir):
for filename in filenames[2]:
record = open(rootdir+"/"+filename,"rb")
link = open("bad virus.txt","r")
str_find = record.read()
print str_find
str_text = link.read()
print str_text
# if str_find.index(str_text) < 0:
# break
# print filenam
运行之后发现根本无法找到病毒样本,为什么(⊙o⊙)?
后来发现了这个让我想揍自己的问题所在,文本中读取出的二进制,并非内存中的二进制,所以根本根本没有可比性,please 记住
于是就有了下面的版本:
#!/usr/bin/python
import os
import os.path
import binascii
rootdir = "./sample_Backdoor_Linux"
def loaddb(dbname):
fd = open(dbname, "r")
signs = fd.readlines()
return signs
def process_sign(signs):
signatures = []
for line in signs:
a=line.strip()
print a
signatures.append(binascii.a2b_hex(line.strip()))
return signatures
def compare_sign(signatures,rootdir):
for filenames in os.walk(rootdir):
file_count = 0
found = 0
for filename in filenames[2]:
file_count = file_count + 1
filepath = rootdir+"/"+filename
content = open(filepath,"rb").read()
i=0
for sign in signatures:
i = i+1
if content.find(sign) != -1:
found = found + 1
print filepath, "Found Virus[%d]"%i
break
print "detect objects: %d/%d"%(found, file_count)
signs_txt_list = loaddb('bad virus.txt')
signatures = process_sign(signs_txt_list)
compare_sign(signatures,rootdir)
后来成功的完成了检验工作,感觉自己真的还要踏踏实实的提高自己才行。
上面主要用了binascii.a2b_hex来对二进制数据转化为内存数据,这样才能与病毒样本进行比较。还有一点就是要无论何时都要记住函数的封装性,这样不仅仅容易分析,当有错误时也更加容易进行分析。
分享一句自己很喜欢的话:
强者不是没有眼泪的人,而是含着眼泪奔跑的人!