實現一個病毒掃描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之後,就可以搞事情了

界面1

對,就是要拿到這個裏面的這個頁數的鏈接

# 正則解析頁面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)

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

圖片2

然後點進去開始爬取詳情

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)

圖片3

點進去就是上面這樣,病毒的文件的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

下面還要把它存到數據庫,然後客戶端獲取到這個數據庫,然後就是各種比對找出病毒就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章