實作一個病毒掃描app——python爬取病毒樣本
文章目錄
-
- 開篇
- 再開篇
- 正篇
開篇
最近閑來無事,準備做一個病毒掃描的app,那麼從哪裡開始呢?
首先來分析下一般的清除步驟都有哪些
-
基于黑白名單的清除
這種是有一個龐大的資料庫,裡面放着各個廠商掃出來的病毒樣本,裡面放着病毒檔案md5/病毒各種資訊
隻需要将你的包名或者簽名或者檔案md5傳進去就能辨識是不是有毒
-
基于特征碼的掃描
這種就是有一個病毒特征碼庫,通過對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之後,就可以搞事情了
對,就是要拿到這個裡面的這個頁數的連結
# 正則解析頁面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)
通過上面的代碼找到的就是它
然後點進去開始爬取詳情
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)
點進去就是上面這樣,病毒的檔案的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
下面還要把它存到資料庫,然後用戶端擷取到這個資料庫,然後就是各種比對找出病毒就行了