【问题标题】:How to interpret result of recvfrom (raw socket)如何解释 recvfrom 的结果(原始套接字)
【发布时间】:2017-03-15 21:47:39
【问题描述】:

我正在 Python3 中开发一个自定义数据包嗅探器。
它不必独立于平台。我正在使用 Linux。
我使用的方法是从套接字(AF_PACKET、SOCK_RAW)recvfrom()。
它工作正常,但我对 recvfrom() 返回的信息有疑问。
recvfrom() 返回一个包含 5 个组件的元组。
示例:('eno1', 2054, 0, 1, b'\x00!\x9b\x16\xfa\xd1')
我如何解释最后 4 个组件? 它记录在哪里?
我不喜欢使用 libpcap 或 scapy。

好的!这是一个代码片段:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
...
数据包,pktAdr = s.recvfrom(65565)
print('pktAdr:'+str(pktAdr))

谢谢!

【问题讨论】:

  • 记录在哪里?在 docs.python.org 上怎么样?此外,如果您需要帮助,则需要显示您的代码。

标签: python-3.x sockets packet-sniffers


【解决方案1】:

docs.python.org 上没有记录,所以我做了一些研究。
我现在可以回答自己了。

recvfrom 返回的元组类似于 Linux 内核返回的 sockaddr_ll 结构。
元组包含 5 个组件:
- [0]:接口名称(例如“eth0”)
- [1]:物理层协议(定义在 linux/if_ether.h)
- [2]:数据包类型(定义在 linux/if_packet.h)
- [3]: ARPHRD (定义在 linux/if_arp.h)
- [4]:物理地址
问题中提供的示例可以解码为:
- 'eno1'
- ARP 协议 (0x806)
- 传入数据包
- 以太网帧
- MAC地址
如果 WiFi 接口处于监控模式,[3] 元素将是 803(意思是“IEEE802.11 + RadioTap 标头”)。

希望这会对某人有所帮助

【讨论】:

  • 如果应该返回(字节,地址),你是如何得到 5 个元素元组的?
  • 带有 SOCK_RAW 选项的套接字文档很少(在 Linux 和 Python 中)。这是我的理解(请注意我不是内核专家)。在 SOCK_RAW 模式下,内核返回的数据包以 SLL 结构(也称为 Linux Cooked Interface)为前缀。在 Python 中,从数据包中删除 SLL 并解码 SLL 信息并在数组中提供(在我的回答中进行了描述)。因此,您的 Python 程序将接收 2 个元素(数据包和 SLL 数组 [5])。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多