python中实现抓包的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

系统环境:windows7,选择windows系统是因为我对自己平时日常机器上的流量比较感兴趣

python环境:python2.7 ,这里不选择python3的原因,是因为接下来要用到的scapy包在python3中安装较于python2要麻烦得多。如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程。

需要的python包:scapy和dpkt

抓包代码:

fromscapy.sendrecvimportsnifffromscapy.utilsimportwrpcapdpkt=sniff(count=100)#这里是针对单网卡的机子,多网卡的可以在参数中指定网卡wrpcap("demo.pcap",dpkt)

你没看错,仅仅只需要两行代码就可以实现一个简单的抓包功能。sniff函数负责嗅探数据包,而wrpcap函数将抓取到的数据包保存起来。

数据包的分析:

importdpktimportsocketimportdatetimedefprintPcap(pcap):try:fortimestamp,bufinpcap:eth=dpkt.ethernet.Ethernet(buf)#获得以太包,即数据链路层包print("iplayer:"+eth.data.__class__.__name__)#以太包的数据既是网络层包print("tcplayer:"+eth.data.data.__class__.__name__)#网络层包的数据既是传输层包print("httplayer:"+eth.data.data.data.__class__.__name__)#传输层包的数据既是应用层包print('Timestamp:',str(datetime.datetime.utcfromtimestamp(timestamp)))#打印出包的抓取时间ifnotisinstance(eth.data,dpkt.ip.IP):print('NonIPPackettypenotsupported%s'%eth.data.__class__.__name__)continueip=eth.datado_not_fragment=bool(ip.off&dpkt.ip.IP_DF)more_fragments=bool(ip.off&dpkt.ip.IP_MF)fragment_offset=ip.off&dpkt.ip.IP_OFFMASKprint('IP:%s->%s(len=%dttl=%dDF=%dMF=%doffset=%d)'%(socket.inet_ntoa(ip.src),socket.inet_ntoa(ip.dst),ip.len,ip.ttl,do_not_fragment,more_fragments,fragment_offset))except:passdefmain():f=open('demo.pcap','rb')pcap=dpkt.pcap.Reader(f)printPcap(pcap)if__name__=='__main__':main()

结果显示:

这是我打开360的路由器卫士时抓取的数据包。这个软件在打开时与路由器通信,获得连接路由器的电脑和手机的列表。192.168.1.100是我的机器,192.168.1.1是路由器地址,其中可以看到windows发送的数据包的ttl值默认是128,其他的系统默认是64,与我们的理论常识是相符的。

感谢各位的阅读!看完上述内容,你们对python中实现抓包的方法大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注亿速云行业资讯频道。