Обнаружение пакетов в Python (Windows)

Каков наилучший способ обнюхать сетевые пакеты с помощью Python?

Я слышал из нескольких мест, что лучшим модулем для этого является модуль Scapy, к сожалению, он вызывает сбой python.exe в моей системе. Я бы предположил, что это просто проблема с тем, как я его установил, за исключением того, что многие другие говорили мне, что он не работает особенно хорошо в Windows. (Если кому-то интересно, я запускаю Windows Vista, что может повлиять на вещи).

Кто-нибудь знает о лучшем решении?

UPD:

После прочтения ответа, в котором говорилось, что я устанавливаю PyPcap, я немного общался с ним и узнал, что Scapy, который я пытался использовать, говорил мне также установить PyPcap, за исключением того, что это модифицированная версия для его использования. Именно этот модифицированный PyPcap вызывал проблему, по-видимому, так как пример в ответе также вызвал зависание.

Я установил исходную версию PyPcap (с сайта Google), и Scapy начал нормально работать (я не пробовал много вещей, но, по крайней мере, он не разбился, как только я начал обнюхивать). Я отправил новый дефектный билет разработчикам Scapy: http://trac.secdev.org/scapy/ticket/166 , надеюсь, что они могут что-то с этим сделать.

В любом случае, просто подумал, что позволю тебе знать.

    5 Solutions collect form web for “Обнаружение пакетов в Python (Windows)”

    Использование pypcap :

    import dpkt, pcap pc = pcap.pcap() # construct pcap object pc.setfilter('icmp') # filter out unwanted packets for timestamp, packet in pc: print dpkt.ethernet.Ethernet(packet) 

    выходной образец:

     Ethernet(src='\x00\x03G\xb2M\xe4', dst='\x00\x03G\x06h\x18', data=IP(src='\n\x00\x01\x1c', dst='\n\x00\x01\x10', sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667, type=8, data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi')))) Ethernet(src='\x00\x03G\x06h\x18', dst='\x00\x03G\xb2M\xe4', data=IP(src='\n\x00\x01\x10', dst='\n\x00\x01\x1c', sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715, data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi')))) 

    Используйте python-libpcap .

     import pcap p = pcap.pcapObject() dev = pcap.lookupdev() p.open_live(dev, 1600, 0, 100) #p.setnonblock(1) try: for pktlen, data, timestamp in p: print "[%s] Got data: %s" % (time.strftime('%H:%M', time.localtime(timestamp)), data) except KeyboardInterrupt: print '%s' % sys.exc_type print 'shutting down' print ('%d packets received, %d packets dropped' ' %d packets dropped by interface') % p.stats() 

    Трудный путь

    Вы можете обнюхать все IP-пакеты, используя сырой сокет.
    Raw socket – это сокет, который отправляет и получает данные в двоичном формате.
    Двоичный в python представлен в строке, которая выглядит так: \x00\xff … каждый \x.. является байтом.
    Чтобы прочитать IP-пакет, вам необходимо проанализировать полученный пакет в двоичном формате в соответствии с протоколом IP.

    Это и изображение формата IP-протокола с размером в битах каждого заголовка.

    Формат протокола IP http://cfs13.blog.daum.net/image/6/blog/2008/04/26/19/15/481300a2a7674&filename=IP_Header.png

    Этот учебник поможет вам понять процесс понимания необработанного пакета и разделения его на заголовки: http://www.binarytides.com/python-packet-sniffer-code-linux/

    Простой способ

    Еще один способ обманывать IP-пакеты очень легко – использовать scapy-модуль.

     from scapy.all import * sniff(filter="ip", prn=lambda x:x.sprintf("{IP:%IP.src% -> %IP.dst%\n}") 

    Этот код будет печатать для вас IP-адрес источника и IP-адрес назначения для каждого IP-пакета. Вы можете сделать гораздо больше с помощью scapy, прочитав здесь документацию: http://www.secdev.org/projects/scapy/doc/usage.html

    Это зависит от цели, которую вы пытаетесь достичь, но если вам нужно создать проект, то его функции будут обнюхать IP-пакеты, тогда я рекомендую использовать scapy для более стабильных сценариев.

    вы можете использовать сырые сокеты с IP-адресом вашего интерфейса (в режиме администратора),

     import socket s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP) s.bind(("YOUR_INTERFACE_IP",0)) s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1) s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON) while True: data = s.recvfrom(10000) print data 

    Другой вариант – pypcap .

    Чтобы проанализировать результаты, Construct является очень гладким.

    Python - лучший язык программирования в мире.