Python 進行病毒樣本特徵分析
這幾天一直在做有關病毒樣本特徵提取的工作,解析出了一個樣本病毒特徵,今天用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()
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來對二進位制資料轉化為記憶體資料,這樣才能與病毒樣本進行比較。還有一點就是要無論何時都要記住函式的封裝性,這樣不僅僅容易分析,當有錯誤時也更加容易進行分析。
分享一句自己很喜歡的話:
強者不是沒有眼淚的人,而是含著眼淚奔跑的人!