适合菜鸟的 Python 数据包嗅探器和套接字

标签 python windows sockets runtime-error sniffer

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

我尝试在 YouTube 上观看几个稍微讨论这个过程的视频,并试图找到更好的 Material 来进一步研究它,但我一直无法找到对我有意义的来源。

我包含的代码来自 youtube 上的一个视频,看起来很有意义,但我猜他可能使用的是 Linux 或其他东西,因为 Windows 不支持 AF_PACKET。经过一番研究,我发现人们使用 AF_INET,但我收到错误:

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

是否有人可以在某个地方或某种方式为我解释一下套接字?我不打算在这个项目的最终版本中使用Windows,并且我还计划将来将其修改为蓝牙,所以如果我能找到一种方法来做到这一点,我想了解背后的原因。

` 进口 socket 导入结构体 导入文本换行

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()

`

最佳答案

使用套接字进行数据包嗅探的操作系统是:

  1. Linux
  2. 艾丽克斯

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

如果您想编写一个嗅探器,最好建议您使用 libpcap/WinPcap 的包装器,并让它们处理在特定操作系统上完成数据包嗅探的痛苦细节。 Python 的包装器包括 pylibpcappcapy ;我不知道它们是否可以在 Windows 上使用 WinPcap 运行。

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

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

关于适合菜鸟的 Python 数据包嗅探器和套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209819/

相关文章:

Python Pandas 根据时间序列中缺失的顺序值添加行

python - 根据时间对 pandas DataFrame 进行子集化

c - 更新标题栏 Winapi

Windows 10 兼容模式 |注册表项

c - 我一次可以在 TCP 套接字上写入多少字节?

sockets - Linux 上的最大套接字数

python - 在日志记录配置中使用socket.SOCK_STREAM时为"Protocol wrong type for socket"

python - 有没有办法在 Python 中设置线程的标题/名称?

python - django-taggit:使标签在管理员中不需要

python - Pymssql 安装错误