python抓取数据包_Python实现抓取访问特定URL的数据包

这篇文章紧接着《使用Python来分离或者直接抓取pcap抓包文件中的HTTP流》展开,那篇文章是昨天写的,今天早上突然又想实现一个直接抓包的程序,于是天没亮就又爬起来了...

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的经理们和主妇们所无法指染的。座椅爆炸...

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

标签:item,Python,data,.%,URL,tag,install,数据包

来源: https://www.cnblogs.com/ksiwnhiwhs/p/10388937.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值