1. 程式人生 > >爬取某線上惡意軟體倉庫病毒檔案進行分析

爬取某線上惡意軟體倉庫病毒檔案進行分析

 前段時間,因為工作需要,要收集一些木馬檔案,於是就找到了一個網站:VirusShare.com,在這裡,研究者可以提交併獲得惡意軟體的樣本。該網站實時更新來自全球的惡意檔案樣本。本來打算自己動手下載呢,但是特徵檔案更新比較慢,等好久才會出現一個我想要的檔案。剛好當時也在寫Python的爬蟲,就寫了一個爬蟲來爬。後來實驗的效果果然不錯,一晚上就把我一星期的工作量就完成了。又一次說明一個道理:程式碼解放雙手。。。
好了,不多說了,我們看一下這個網站的樣子:
這裡寫圖片描述

可以看到現在圖片是黑白顏色的,原因是我們還沒有進行登陸。登陸後會有一些變化。因為是實時更新的,我們現在看到的惡意檔案的MD5和sha1以及SHA256的值,其中我們最想知道的是檔案的型別,這個在File Type中可以看到是PE檔案,也就是可執行檔案。還有一些其他的引數,沒怎麼仔細看。好了,不多說了,下面說一下爬蟲的編寫過程:

  1. 首先我們模擬一遍下載的過程,通過HTTPFox抓包分析每一條請求,然後把下載請求找出來,HTTPFox的使用細節不多說了。
  2. 然後,我直接上程式碼吧
# coding=utf-8
#author='CMZ'
import urllib
import urllib2
import cookielib
import datetime
import time
import re

url = 'http://www.virusshare.com'
def Get_Page():

    #主機地址
    hosturl = 'http://virusshare.com/'
    # post的url
posturl = 'http://virusshare.com/processlogin.4n6' #設定cookie處理器 cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) #開啟登陸頁面 h = urllib2.urlopen(hosturl) #構造header
headers = {'User-Agent': 'Mozilla/4.0 compatible; MSIE 5.5; Windows NT'} postData = {'username': '*******',#登陸賬號 'password': '*******'#登陸密碼 } #給post資料編碼 postData = urllib.urlencode(postData) #通過urllib提供的request方法向指定的url傳送剛才構造的資料,完成登陸 request = urllib2.Request(posturl, postData, headers) # print request response = urllib2.urlopen(request) text = response.read() return text def Judje_Page(page): ''' 判斷是不是PE檔案,如果是,儲存到本地,如果不是則丟棄! ''' PE_page = re.search('PE', page)#這裡可以修改第一個引數來改變你想要的檔案型別,因為我需要的PE所以這裡就填寫的'PE'引數。 if PE_page: SHA256 = re.findall(r'href="(.*?)">', page) url = 'http://virusshare.com/'+ SHA256[9] print '\033[0;32;40m'+'匹配成功! ',datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'-------現在儲存檔案.....' # print url #用檔案SHA256進行命名,將檔案下載並儲存到本地以檔案的, i = str(SHA256[9]) with open(str(i[-64:])+'.exe','wb')as code: code.write(urllib2.urlopen(url).read()) else: print '\033[0;31;40m'+'匹配失敗!',datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'-------現在丟棄檔案.....' while True: page = Get_Page() # print page Judje_Page(page) time.sleep(15)

3.上面就是程式碼了,寫的很渣。
**

                         - 完!

**