天天看點

實作一個病毒掃描app——python爬取病毒樣本

實作一個病毒掃描app——python爬取病毒樣本

文章目錄

    • 開篇
    • 再開篇
    • 正篇

開篇

最近閑來無事,準備做一個病毒掃描的app,那麼從哪裡開始呢?

首先來分析下一般的清除步驟都有哪些

  1. 基于黑白名單的清除

    這種是有一個龐大的資料庫,裡面放着各個廠商掃出來的病毒樣本,裡面放着病毒檔案md5/病毒各種資訊

    隻需要将你的包名或者簽名或者檔案md5傳進去就能辨識是不是有毒

  2. 基于特征碼的掃描

    這種就是有一個病毒特征碼庫,通過對apk解包,深度掃描檔案裡是不是存在病毒

再開篇

首先我們要做個病毒庫,難道要去網絡上把各個廠商的病毒庫都拿過來,還是要自己做一個網站等着别人來上傳病毒,好像都不行,那得到猴年馬月去了,今天 我們要做的就是将網絡上的别人做好病毒庫用python把他們爬取出來

正篇

首先我們使用的是python3,python2就不要搞事情了

首先先确定要爬取的頁面

# 好吧,我就找到這一個免費的
urlprefix = 'http://www.virscan.org/reportlist'
           

然後我們既然做爬蟲,咱就要僞裝成正常使用者

# 僞裝成浏覽器通路,适用于拒絕爬蟲的網站
headers = {'User-Agent': 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10',
           'Referer': 'http://www.baidu.com/'}
           

第一步要通路這個界面

import re
import urllib.parse
import urllib.request
import bs4
import time

reponse = urllib.request.Request(myurl)
html = urllib.request.urlopen(reponse).read().decode("utf-8")

# 解析html
soup = bs4.BeautifulSoup(html, 'html.parser')
           

拿到了html之後,就可以搞事情了

實作一個病毒掃描app——python爬取病毒樣本

對,就是要拿到這個裡面的這個頁數的連結

# 正則解析頁面URL
    pattern = r'/reportlist/\w+'
    liResult = soup.find_all('a', href=re.compile(pattern))

    # 找到頁面最大值
    maxPage = 1
    for link in liResult:
        url2 = link['href']
        page = url2.split('/')[-1]
        if maxPage < int(page):
            maxPage = int(page)

    print(maxPage)
    # 通路查找到url
    for x in range(1, maxPage+1):
        pageUrl = myurl+'/%d' % (x)
        # print(pageUrl)
        getReport(pageUrl)
        time.sleep(1)
           

通過上面的步驟我們拿到了每一頁的url,下面開始通路每一頁的資料了

def getReport(myurl):
    #print('---------getReport-->'+myurl)
    reponse = urllib.request.Request(myurl)
    html = urllib.request.urlopen(reponse).read().decode("utf-8")
    # 解析html
    soup = bs4.BeautifulSoup(html, 'html.parser')

    # 查找首頁所有a連結,比對想要的URL格式(v.xxx内容)
    pattern = r'http://v.virscan.org/\w+'  # URL格式
    vLinks = soup.find_all('a', href=re.compile(pattern))
    for vlink in vLinks:
        url3 = urllib.parse.quote(vlink['href'])
        url3 = url3.replace('http%3A', 'http:')
        # print(url3)
        if vlink.has_attr('alt'):
            vn = vlink['alt']
        else:
            vn = ''
        # print(vn)
        # 隻掃面和Android相關的病毒連結
        if 'android' in url3.lower():
            # 擷取到病毒名稱
            if vn == '':
                vn = url3.split('/')[-1][0:-5]
                vn = urllib.parse.unquote(vn)
            print('get antivirus name :'+vn)
            getAndroidVirusReport(url3)
            time.sleep(1)
           

通過上面的代碼找到的就是它

實作一個病毒掃描app——python爬取病毒樣本

然後點進去開始爬取詳情

def getAndroidVirusReport(myurl):
    #print('--------getAndroidReport-->'+myurl)
    reponse = urllib.request.Request(myurl)
    html = urllib.request.urlopen(reponse).read().decode("utf-8")
    # 解析html
    soup = bs4.BeautifulSoup(html, 'html.parser')

    basepageurl = urllib.parse.unquote(myurl[:-5]) + '/'

    # 擷取詳解界面
    pattern = 'http://v.virscan.org/'
    VInfoLinks = soup.find_all('a', href=re.compile(pattern))
    # 這裡是找到頁面最大值,然後for循環通路
    maxpagenum = 1
    for link in VInfoLinks:    
        url4 = link['href']
        numstr = url4.split('/')[-1][0:-5]
        try:
            if maxpagenum < int(numstr):
                maxpagenum = int(numstr)
               
        except:
            continue
    print('found max page:'+ str(maxpagenum))

    for i in range(1, maxpagenum+1):
        url5 = urllib.parse.quote(basepageurl + str(i) + '.html')
        url5 = url5.replace('http%3A','http:')
        #print(url5)
        getAndroidVirusPage(url5)
        time.sleep(1)

           
實作一個病毒掃描app——python爬取病毒樣本

點進去就是上面這樣,病毒的檔案的md5就拿到了,這時候不要要着急,還要把這個md5取出來

# 擷取病毒md5值
def getAndroidVirusPage(myurl):
    #print('--------getAndroidVirusPage-->'+myurl)
    reponse = urllib.request.Request(myurl)
    html = urllib.request.urlopen(reponse).read().decode("utf-8")
    # 解析html
    soup = bs4.BeautifulSoup(html, 'html.parser')
    # 拿到md5值
    pattern = r'http://md5.virscan.org/\w+'  #URL格式
    md5Links = soup.find_all('a', href=re.compile(pattern))
    for link in md5Links:    
        url6 = link['href']
        md5str = url6.split('/')[-1][0:-5]
        print("get file md5 :"+md5str)
    
           

好了,到此結束,我們拿到了病毒檔案md5

下面還要把它存到資料庫,然後用戶端擷取到這個資料庫,然後就是各種比對找出病毒就行了