Обнюхивание пакетов в 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, надеюсь, они смогут что-то с этим сделать.
в любом случае, я просто подумал, что дам вам знать.
6 ответов
используя 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'))))
трудный путь
вы можете обнюхать все IP-пакеты, используя необработанный сокет.
Raw socket-это сокет, который отправляет и получает данные в двоичном формате.
Двоичный файл в python представлен в строке, которая выглядит следующим образом \x00\xff
... каждый \x..
- это байт.
Для чтения IP-пакета необходимо проанализировать полученный пакет в двоичном формате по протоколу IP.
это и изображение формата протокола IP с размером в битах каждого заголовок.
этот учебник может помочь вам понять процесс понимания необработанного пакета и разделения его на заголовки: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 для более стабильных сценариев.
использовать 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-адресом интерфейса (в режиме администратора),
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
Если scapy, pleae попробуйте следующий метод. (Работает на Windows 10)
# -*- coding: utf-8 -*-
# pip install scapy
"""
[{'name': 'Intel(R) 82574L Gigabit Network Connection',
'win_index': '4',
'description': 'Ethernet0',
'guid': '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}',
'mac': '00:0C:29:5C:EE:6D',
'netid': 'Ethernet0'}]
"""
from pprint import pprint
from scapy.arch.windows import get_windows_if_list
from scapy.all import *
# disable verbose mode
conf.verb = 0
def parse_packet(packet):
"""sniff callback function.
"""
if packet and packet.haslayer('UDP'):
udp = packet.getlayer('UDP')
udp.show()
def udp_sniffer():
"""start a sniffer.
"""
interfaces = get_windows_if_list()
pprint(interfaces)
print('\n[*] start udp sniffer')
sniff(
filter="udp port 53",
iface=r'Intel(R) 82574L Gigabit Network Connection', prn=parse_packet
)
if __name__ == '__main__':
udp_sniffer()