分享

IP包流量分析(一)(python+pypcap+dkpt)...

 大傻子的文渊阁 2021-02-23

计算机网络实验:IP包流量分析 (抓取IP包并解析,运行结果GUI输出)

系统:Mac Mojave10.14.6

环境:python3.7, pycharm CE

(计算机网络课程实验,老师要求抓包分析,也即实现一小部分Wireshark软件功能。网上查了很多资料,大多数使用了winpcap以及c++。很遗憾,我没学过c++,所以改用python,使用pypcap抓包,dkpt解析包。)

1.准备工作

pypcap是基于libpcap封装的为python语言提供的抓包库。

dpkt是用来解析数据包的库。

安装:在终端通过pip安装

  1. $pip install pypcap
  2. $pip install dpkt

安装成功页面:

成功安装pypcap-1.2.3以及dpkt-1.9.2,开始进行抓包分析。

2.抓包分析

  1. import pcap
  2. import dpkt
  3. import time
  4. '''
  5. 计网实验一:IP包流量分析
  6. 利用pcap抓包
  7. 利用dpkt解析包
  8. 输出IP数据包信息:time,src,dst,protocol,length,ttl,df,mf,offset,checksum
  9. '''
  10. # 所有网络接口
  11. devs = pcap.findalldevs()
  12. print('All NIC:',devs, sep='\n')
  13. # 抓包
  14. sniffer = pcap.pcap(name='en4', promisc=True, immediate=True)
  15. # 解析: timestamp(时间戳),raw_buf(包中原始数据)
  16. for timestamp, raw_buf in sniffer:
  17. # 解析以太网帧
  18. eth = dpkt.ethernet.Ethernet(raw_buf)
  19. # 判断是否为IP数据报
  20. if not isinstance(eth.data, dpkt.ip.IP):
  21. print("Non IP packet type not supported ", eth.data.__class__.__name__)
  22. continue
  23. # 抓IP数据包
  24. packet = eth.data
  25. # 取出分片信息
  26. df = bool(packet.off & dpkt.ip.IP_DF)
  27. mf = bool(packet.off & dpkt.ip.IP_MF)
  28. offset = packet.off & dpkt.ip.IP_OFFMASK
  29. # 输出数据包信息:time,src,dst,protocol,length,ttl,df,mf,offset,checksum
  30. output1 = {'time':time.strftime('%Y-%m-%d %H:%M:%S',(time.localtime(timestamp)))}
  31. output2 = {'src':'%d.%d.%d.%d'%tuple(packet.src) , 'dst':'%d.%d.%d.%d'%tuple(packet.dst)}
  32. output3 = {'protocol':packet.p, 'len':packet.len, 'ttl':packet.ttl}
  33. output4 = {'df':df, 'mf':mf, 'offset':offset, 'checksum':packet.sum}
  34. print()
  35. print(output1)
  36. print(output2)
  37. print(output3)
  38. print(output4)

3.程序解读

通过pcap.findalldevs()找出所有网络接口:

  1. # 所有网络接口
  2. devs = pcap.findalldevs()
  3. print('All NIC:',devs, sep='\n')

运行结果如下:

  1. All NIC:
  2. ['bridge0', 'utun0', 'en1', 'utun1', 'en2', 'en4', 'lo0', 'en0', 'gif0', 'stf0', 'XHC0', 'p2p0', 'awdl0', 'XHC20']

使用pcap.pcap()抓包:

  1. # 抓包
  2. sniffer = pcap.pcap(name='en4', promisc=True, immediate=True)

pcap.pcap()函数参数列表中name=‘en4’的意思是抓取网口en4的数据包,在上一条运行结果中也可以找到网口en4。那能不能抓取其他网口的数据包呢?我这里的尝试结果是不可以,因为我在连接校园网时使用的网口就是en4。所以在运行前检查一下本机使用的网口,实在不确定是哪一个,就在所有网口列表里一个个试吧。

接下来就是解析包:

  1. # 解析: timestamp(时间戳),raw_buf(包中原始数据)
  2. for timestamp, raw_buf in sniffer:

使用for循环解析sniffer中的各种包。

  1. # 解析以太网帧
  2. eth = dpkt.ethernet.Ethernet(raw_buf)
  3. # 判断是否为IP数据报
  4. if not isinstance(eth.data, dpkt.ip.IP):
  5. print("Non IP packet type not supported ", eth.data.__class__.__name__)
  6. continue

循环内部:先解析以太网帧,并判断是否为IP数据包,不是则输出提示语句跳出本轮循环,是则进行后续解析:

  1. # 抓IP数据包
  2. packet = eth.data
  3. # 取出分片信息
  4. df = bool(packet.off & dpkt.ip.IP_DF)
  5. mf = bool(packet.off & dpkt.ip.IP_MF)
  6. offset = packet.off & dpkt.ip.IP_OFFMASK

将IP数据包放入packet,取出其中包含的分片信息。接下来就是最后的输出部分:

  1. # 输出数据包信息:time,src,dst,protocol,length,ttl,df,mf,offset,checksum
  2. output1 = {'time':time.strftime('%Y-%m-%d %H:%M:%S',(time.localtime(timestamp)))}
  3. output2 = {'src':'%d.%d.%d.%d'%tuple(packet.src) , 'dst':'%d.%d.%d.%d'%tuple(packet.dst)}
  4. output3 = {'protocol':packet.p, 'len':packet.len, 'ttl':packet.ttl}
  5. output4 = {'df':df, 'mf':mf, 'offset':offset, 'checksum':packet.sum}
  6. print()
  7. print(output1)
  8. print(output2)
  9. print(output3)
  10. print(output4)

4.运行结果

首次运行可能会遇到类似错误:(cannot open BPF device) /dev/bpf0: Permission denied

解决方法是要在终端开启网口:sudo chmod o+r /dev/bpf*

之后就能顺利运行程序了,运行结果如下:

  1. All NIC:
  2. ['bridge0', 'utun0', 'en1', 'utun1', 'en2', 'en4', 'lo0', 'en0', 'gif0', 'stf0', 'XHC0', 'p2p0', 'awdl0', 'XHC20']
  3. Non IP packet type not supported bytes
  4. Non IP packet type not supported ARP
  5. Non IP packet type not supported LLC
  6. Non IP packet type not supported bytes
  7. Non IP packet type not supported bytes
  8. {'time': '2019-10-23 15:44:16'}
  9. {'src': '10.11.107.157', 'dst': '108.177.125.188'}
  10. {'protocol': 6, 'len': 40, 'ttl': 64}
  11. {'df': False, 'mf': False, 'offset': 0, 'checksum': 4249}
  12. {'time': '2019-10-23 15:44:16'}
  13. {'src': '108.177.125.188', 'dst': '10.11.107.157'}
  14. {'protocol': 6, 'len': 52, 'ttl': 104}
  15. {'df': False, 'mf': False, 'offset': 0, 'checksum': 62437}
  16. Non IP packet type not supported bytes
  17. {'time': '2019-10-23 15:44:28'}
  18. {'src': '10.11.107.157', 'dst': '108.177.125.188'}
  19. {'protocol': 6, 'len': 78, 'ttl': 64}
  20. {'df': True, 'mf': False, 'offset': 0, 'checksum': 55956}
  21. {'time': '2019-10-23 15:44:28'}
  22. {'src': '108.177.125.188', 'dst': '10.11.107.157'}
  23. {'protocol': 6, 'len': 78, 'ttl': 104}
  24. {'df': False, 'mf': False, 'offset': 0, 'checksum': 54208}
  25. {'time': '2019-10-23 15:44:28'}
  26. {'src': '10.11.107.157', 'dst': '108.177.125.188'}
  27. {'protocol': 6, 'len': 52, 'ttl': 64}
  28. {'df': True, 'mf': False, 'offset': 0, 'checksum': 55982}
  29. Non IP packet type not supported LLC
  30. Non IP packet type not supported bytes
  31. Non IP packet type not supported bytes
  32. Non IP packet type not supported bytes
  33. Non IP packet type not supported LLC
  34. Non IP packet type not supported ARP
  35. Non IP packet type not supported bytes
  36. {'time': '2019-10-23 15:44:39'}
  37. {'src': '10.11.107.140', 'dst': '10.11.107.255'}
  38. {'protocol': 17, 'len': 229, 'ttl': 128}
  39. {'df': False, 'mf': False, 'offset': 0, 'checksum': 58804}
  40. Non IP packet type not supported LLC
  41. Non IP packet type not supported bytes

在不人为干预的情况下,程序会一直进行抓包分析,不断输出解析结果。

到这里抓包解析就完成了。

(这里的运行结果在console输出。如果需要输出到GUI,欢迎阅读下一篇博客。)

 

主要参考资料:

https://blog.csdn.net/weixin_39138707/article/details/74612637

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多