实现一个病毒扫描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
下面还要把它存到数据库,然后客户端获取到这个数据库,然后就是各种比对找出病毒就行了