Python数据包嗅探器和插槽用于Noobs

时间:2016-02-04 19:25:37

标签: python windows sockets runtime-error sniffer

所以我对套接字和嗅探器编程有一些疑问...... 我刚刚开始编程并且有一个项目,我希望使用通过我的网络发送的信息。

我试着在youtube上观看几个关于这个过程的视频,并尝试找到更好的材料来进一步研究它,但我找不到对我有意义的来源。

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

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

有没有人可以为我解释插座的地方或方式?我不打算在这个项目的最终版本中使用windows,而且我还打算将来修改它用于蓝牙,所以如果我能找到一种方法,我想了解背后的原因。< / p>

`     导入套接字     导入结构     import textwrap

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 个答案:

答案 0 :(得分:1)

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

  1. 的Linux
  2. Irix的
  3. Windows不在该列表中(在名称,OS X,Solaris,HP-UX,AIX等中没有&#34; BSD&#34;)。 Linux和Irix都碰巧使用套接字进行嗅探,但这只是他们的选择(并且他们没有选择相同的类型的套接字,他们恰好选择了套接字)

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

    (请注意,您不能保证在嗅探数据包上获得以太网标头;您应该调用pcap_datalink(),或者等同于包装器的等价物,并检查其返回值 - 如果它是不是DLT_EN10MB,或者是包装器的等价物,您将无法获得以太网接头。)

    AF_INET原始套接字位于任何平台上,不会为您提供以太网标头。根据{{​​3}}附录A和该协议,我不知道<3> 3的协议参数你得到的是GGP的互联网协议号码是古老的,据我所知,没有使用;你最终可能会得到一个套接字,你可以在其上发送GGP数据包并从中接收GGP数据包,这是值得的(这并不多)。 (另外,C中socket()调用的参数是按主机字节顺序排列的,Python可能也是一样的,所以你可能不希望那里有socket.ntohs(),而不是它#&# 39;会有所作为。)