Python 适用于新手的数据包嗅探器和套接字

Python Packet Sniffer and Sockets for Noobs

所以我有一些关于套接字和嗅探器编程的问题... 我刚刚开始编程并且有一个项目,我想在其中使用通过我的网络发送的信息。

我试着在 youtube 上观看了一些视频,稍微讨论了这个过程,并试图找到更好的 material 来进一步研究它,但我一直没能找到有意义的来源我.

我包含的代码来自 youtube 上的一个视频,并且按照他们的解释似乎很有意义,但我猜他可能一直在使用 Linux 或其他东西,因为 Windows 不支持AF_PACKET。经过一些研究,我发现人们使用 AF_INET,但我得到了错误:

OSError:[WinError 10043]请求的协议尚未配置到系统中,或者不存在它的实现

有什么地方或方法可以为我解释一下套接字吗?我不打算使用 windows 作为这个项目的最终版本,我也打算在未来修改它用于蓝牙,所以如果我能找到一种方法,我想了解事情背后的原因这样做。

` 进口套接字 导入结构 导入文字环绕

def main():
    conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.ntohs(3))
        while True:
        raw_data, addr = conn.recvfrom(65535)
        dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
        print('\nEthernet Frame:')
        print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto, data[:14]))


#unpack ethernet frame
def ethernet_frame(data):
     dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
     return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]

#Get Mac Address
def get_mac_addr(bytes_addr):
    bytes_str = map('{:02x}'.format, bytes_addr)
    return ':'.join(bytes_str).upper()

main()

`

您使用套接字进行数据包嗅探的 OSes 是:

  1. Linux
  2. Irix

Windows 不在该列表中(名称中带有“BSD”的任何内容、OS X、Solaris、HP-UX、AIX 等也不在其中)。 Linux 和 Irix 都碰巧使用套接字来做嗅探,但这只是他们的选择(而且他们没有选择相同的 type 套接字,他们只是碰巧选择了套接字).

如果你想写一个嗅探器,你可能最好在 libpcap/WinPcap 周围使用一个包装器,让他们处理在特定操作系统上完成数据包嗅探的方式的痛苦细节. Python 的包装器包括 pylibpcap and pcapy;我不知道他们中的任何一个是否可以在 Windows 上使用 WinPcap。

(请注意,您不能保证在嗅探数据包上获得以太网 headers;您应该调用 pcap_datalink(),或任何包装器的等效项,并检查其 return 值 -如果它不是 DLT_EN10MB,或者包装器的等效项,您将不会获得以太网 headers。)

AF_INET 原始套接字,在 任何 平台上,不会为您提供以太网 headers。我不知道 什么 你会得到一个协议参数 3 - 3 是 GGP 的 Internet 协议编号,根据 RFC 823 附录 A,该协议是据我所知古老且未被使用;您可能最终会得到一个套接字,您可以在该套接字上发送 GGP 数据包,也可以从该套接字接收 GGP 数据包,这是值得的(不多)。 (此外,C 中 socket() 调用的参数按主机字节顺序排列,并且 Python 可能工作相同,因此您可能不希望 socket.ntohs() 在那里,而不是它会有所作为。)