实现一个病毒扫描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

下面还要把它存到数据库,然后客户端获取到这个数据库,然后就是各种比对找出病毒就行了

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