python-3.x - 如何解释 recvfrom 的结果(原始套接字)

标签 python-3.x sockets packet-sniffers

我正在 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)
打印('pktAdr:'+str(pktAdr))

谢谢!

最佳答案

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

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

希望这会对某人有所帮助

关于python-3.x - 如何解释 recvfrom 的结果(原始套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821309/

相关文章:

python - 查找数组中具有重复键值的 dict 对象

python - 如何通过多个函数向下传递多个参数

java - 通过 Java 套接字错误传输文件

c - pcap 仅接收新连接

html - 当我向服务器发送表单时如何捕获我的发布请求?

c++ - 'pcap_loop' 没有记录数据包,甚至没有运行

Python:动态存储字典的访问

python - 是否可以将以一种方式堆叠的 Python 数组 reshape 为另一种堆叠类型?

c++ - 同一命令的多个手册页之间有什么区别?

c - IPC中使用Socket的优缺点是什么