2017-03-15 74 views
0

我正在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))如何解释recvfrom的结果(原始套接字)

谢谢!

+0

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

回答

0

它没有记录在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标头')。

希望这会帮助某人