本文主要介绍了利用Python实现windows下的包捕获和分析,很不错,有参考价值。有需要的朋友可以参考一下。
环境:windows7,我选择windows是因为我对日常机器上的流量感兴趣。
Python环境:python2.7 .这里之所以不选择python3,是因为接下来要用的scapy包在python3中安装要比python2麻烦很多。如果你习惯python3,包分析可以在3下完成,因为包捕获和分析是两个完全独立的过程。
需要Python包:scapy和dpkt
抓取包代码:
从scapy.sendrecv导入嗅探
从scapy.utils导入wrpcap
Dpkt=sniff(count=100) #这里是单网卡的机器,多网卡的网卡可以在参数中指定。
wrpcap('demo.pcap ',dpkt)
你说的没错,实现一个简单的包捕获功能只需要两行代码。Sniff函数负责嗅探数据包,而wrpcap函数保存捕获的数据包。
数据包的分析:
导入dpkt
导入插座
导入日期时间
def printPcap(pcap):
尝试:
对于时间戳,pcap中的buf:
eth=dpkt . Ethernet . Ethernet(BUF)#获取以太网包,即数据链路层包。
Print ('IP层:' eth . data . _ _ class _ _ _ _ _ name _ _)#以太网包的数据既是网络层包,
Print ('TCP层:' eth . data . data . _ _ class _ _ _ _ _ name _ _)#网络层包的数据既是传输层包,
print(' http layer:' eth . data . data . data . _ _ class _ _ _ _ name _ _)#传输层包的数据既是应用层包,
Print ('timestamp:',str(datetime . datetime . utcfromtimestamp(timestamp)))#打印出包的抓取时间。
如果不是isinstance(eth.data,dpkt.ip.IP):
print('不支持非IP数据包类型%s' % eth.data.__class__。__name__)
继续
ip=eth.data
do _ 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 _ off mask
print(' IP:% s-% s(len=% d TTL=% d DF=% d MF=% d offset=% d)' %(socket . inet _ ntoa(IP . src),socket.inet_ntoa(ip.dst),ip.len,ip.ttl,do_not_fragment,more_fragments,fragment_offset))
除了:
及格
def main():
f=打开(' demo.pcap ',' rb ')
pcap=dpkt.pcap.Reader
printPcap(pcap)
if __name__=='__main__ ':
主()
结果显示:
这是我打开360的路由器卫士时抢到的包。这个软件一打开就和路由器通讯,获取连接路由器的电脑和手机列表。192.168.1.100是我的机器,192.168.1.1是路由器地址。可以看出,windows发送的数据包的ttl值默认为128,其他系统默认为64,这与我们的理论常识是一致的。
TCP/IP五层分层结构和数据包流程,两个附图:
总结
以上就是边肖给大家介绍的,用Python实现windows下的抓取和分析。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。