Python实现抓取访问特定URL的数据包
2016-08-07 10:46
411 查看
这篇文章紧接着《使用Python来分离或者直接抓取pcap抓包文件中的HTTP流》展开,那篇文章是昨天写的,今天早上突然又想实现一个直接抓包的程序,于是天没亮就又爬起来了...
本文的代码以及前文的代码在github的地址:https://github.com/marywangran/Python-Http-cap-demux/tree/master
Python有很多库可以实现抓包和分析包,典型就是pypcap用来抓包,dpkt用来分析,关于这两个库的安装,我有一些随笔,虽然这些对于一个Python老手而言似乎是信手拈来可以吹着口哨搞定的事,但是对于新手而言,似乎必然会遇到这样那样的问题,因此我先分享一些关于安装方面的事情。
Python的库太过丰富,但是前提是你必须可以随意安装它,我比较推荐使用pip安装,它就像apt-get,yum这样,甚至语法都一样:
apt-get/yum/pip install aaaaa
但是pip要真的用起来似乎还是要花点时间的。我首先下载了setuptool:
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-3.0.tar.gz 然后解压,进入其主目录后执行:
python ./setup.py build
python ./setup.py install
然后在我了解到pip本身也是一个Python库的时候,我执行了:
easy_install pip
随后得到了令人遗憾的错误提示,说什么”unknown url type: https“,然后我问了度娘,解决了该问题,很简单,执行下面的步骤即可:
1.yum install openssl-devel
2.重新编译Python并install
接下来就可以easy_install pip了,然后就可以:
pip install pypcap
pip install dpkt
最后,代码就可以随便写了...
我主要还是想在直接抓包的时候就过滤好我想要的包,而不是先抓一个超级大的pcap文件,然后再慢慢解析分流。只要脑子里面有清晰的逻辑,并且手边有一个得心应手的编程语言,模拟任何事情都不是难事,把昨天的代码一改,把分析pcap的逻辑改成pypcap/dpkt抓包解包的逻辑,一切似乎就是那么简单。代码如下:
简单,高效!这个代码也没花多长时间,写着玩。值得一提的是,请不要再以性能为由去鄙视除了C之外的别的语言,我也曾经是性能至上客的一员,也曾经为此放弃了Java,但是我后悔了...这个代码顺势可以扔到github上让编程者们嘲笑,也可以顺势跟经理或者老婆炫耀一下以便遭到他们抑扬顿挫地蔑视,并以此为乐。然后我就可以大笑着离开去干我喜欢的事情咯,比如看看世界史,研究一下台风,而这些是身负KPI的经理们和主妇们所无法指染的。座椅爆炸...
本文的代码以及前文的代码在github的地址:https://github.com/marywangran/Python-Http-cap-demux/tree/master
Python有很多库可以实现抓包和分析包,典型就是pypcap用来抓包,dpkt用来分析,关于这两个库的安装,我有一些随笔,虽然这些对于一个Python老手而言似乎是信手拈来可以吹着口哨搞定的事,但是对于新手而言,似乎必然会遇到这样那样的问题,因此我先分享一些关于安装方面的事情。
Python的库太过丰富,但是前提是你必须可以随意安装它,我比较推荐使用pip安装,它就像apt-get,yum这样,甚至语法都一样:
apt-get/yum/pip install aaaaa
但是pip要真的用起来似乎还是要花点时间的。我首先下载了setuptool:
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-3.0.tar.gz 然后解压,进入其主目录后执行:
python ./setup.py build
python ./setup.py install
然后在我了解到pip本身也是一个Python库的时候,我执行了:
easy_install pip
随后得到了令人遗憾的错误提示,说什么”unknown url type: https“,然后我问了度娘,解决了该问题,很简单,执行下面的步骤即可:
1.yum install openssl-devel
2.重新编译Python并install
接下来就可以easy_install pip了,然后就可以:
pip install pypcap
pip install dpkt
最后,代码就可以随便写了...
我主要还是想在直接抓包的时候就过滤好我想要的包,而不是先抓一个超级大的pcap文件,然后再慢慢解析分流。只要脑子里面有清晰的逻辑,并且手边有一个得心应手的编程语言,模拟任何事情都不是难事,把昨天的代码一改,把分析pcap的逻辑改成pypcap/dpkt抓包解包的逻辑,一切似乎就是那么简单。代码如下:
#!/usr/local/bin/python import pcap import dpkt cap = pcap.pcap('eth3') cap.setfilter('tcp port 80') files4out = {} url = 'www.baidu.com' for ptime,pktdata in cap: pkt = dpkt.ethernet.Ethernet(pktdata) if pkt.data.data.__class__.__name__ <> 'TCP': continue ipsrc_tag = 0 ipdst_tag = 0 sport_tag = 0 dport_tag = 0 ipdata = pkt.data sip='%d.%d.%d.%d'%tuple(map(ord,list(ipdata.src))) dip='%d.%d.%d.%d'%tuple(map(ord,list(ipdata.dst))) tcpdata = pkt.data.data sport = tcpdata.sport dport = tcpdata.dport src_tag = sip dst_tag = dip sp_tag = str(sport) dp_tag = str(dport) if ord(list(ipdata.src)[0]) > ord(list(ipdata.dst)[0]): temp = dst_tag dst_tag = src_tag src_tag = temp if sport > dport: temp = sp_tag sp_tag = dp_tag dp_tag = temp content = url FLAG = 0 appdata = tcpdata.data if appdata.find(content) <> -1: print 'find' FLAG = 1 name = src_tag + '_' + dst_tag + '_' + sp_tag + '_' + dp_tag if (name) in files4out: item = files4out[name] fi = 0 cnt = item[1] if cnt < 6 and item[3] <> 1: item[1] += 1 item[2].append(pktdata) if FLAG == 1: item[3] = 1 elif item[3] == 1: for index in range(cnt+1): pktdatai = item[2][index] pkti = dpkt.ethernet.Ethernet(pktdatai) ipdatai = pkti.data tcpdatai = pkti.data.data sipi='%d.%d.%d.%d'%tuple(map(ord,list(ipdatai.src))) dipi='%d.%d.%d.%d'%tuple(map(ord,list(ipdatai.dst))) sporti = tcpdatai.sport dporti = tcpdatai.dport print '[datai]' + sipi + ':' + str(sporti) + '-' + dipi + ':' + str(dporti) item[1] = -1 print '[data]' + sip + ':' + str(sport) + '-' + dip + ':' + str(dport) else # 这里优化空间巨大! # 为了不让随意的五元组无情地侵占字典空间,这里有几个策略: # 1.发现FIN的时候,再容许这个流在字典中存在固定的时间段或者在允许此流来回5个包,之后删除字典的索引 # 2.如果超过6个包都没有等到GET /$url,那么在timewait的时间内,此流不允许占据字典空间 del files4out[name] else: item = [0, 0, [], 0, 0] item[2].append(pktdata) files4out[name] = item
简单,高效!这个代码也没花多长时间,写着玩。值得一提的是,请不要再以性能为由去鄙视除了C之外的别的语言,我也曾经是性能至上客的一员,也曾经为此放弃了Java,但是我后悔了...这个代码顺势可以扔到github上让编程者们嘲笑,也可以顺势跟经理或者老婆炫耀一下以便遭到他们抑扬顿挫地蔑视,并以此为乐。然后我就可以大笑着离开去干我喜欢的事情咯,比如看看世界史,研究一下台风,而这些是身负KPI的经理们和主妇们所无法指染的。座椅爆炸...
相关文章推荐
- Python实现抓取访问特定URL的数据包
- Python爬虫实现网页信息抓取功能示例【URL与正则模块】
- python实现通过代理服务器访问远程url的方法
- python实现通过代理服务器访问远程url的方法
- [转载]在Linux系统上实现用Python远程访问Oracle数据库
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- 基于Bloom-Filter算法的URL过滤器的实现[避免重复抓取]
- py单词翻译小工具(python抓取html实现)
- 转载 通过JAVA语言实现使用URL访问网络资源
- MVC利用URLRoute实现伪静态后正真的静态html无法访问
- 用SEP实现“只允许访问特定的网站,其他网站一律屏蔽”
- C#实现从Internet上抓取指定URL的源码的方案
- UrlRewritingNet 实现URL重写 映射 真实的.html(例如FCKeditor)无法访问的解决方法 .
- 优化URL访问,实现伪静态.
- 过滤器实现登录验证及拒绝直接输URL访问网页
- Mod_python 访问时不访问特定py文件的配置方法
- python通过URL获得的网络文件可否当做普通的文件来进行访问
- python:WSGI实现url映射