Python Raw Sockets (Windows): анализ фреймов Ethernet - PullRequest
3 голосов
/ 03 июня 2011

Я видел несколько примеров создания сокетов для сниффинга для IP-пакетов, например, используя:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

То, чего я пытаюсь добиться, это сниффинг для фреймов Ethernet и анализданные, полученные в Windows.Интересующие меня пакеты: PPPoE Frames, не содержащие IP .

В Linux (с использованием Python) я смог добиться этого с помощью:

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, struct.pack("%ds"%(len("eth0")+1,),"eth0"))
while condition:
    pkt = s.recvfrom(1500)
    addToQueue(filter(pkt))

Теперь из-за различий между сокетами Linux и WinSock2 API у меня возниклиследующие проблемы совместимости:

  • Нет пакета IN для Windows.Это означает, что SO_BINDTODEVICE отсутствует.Как Я нюхаю все, что происходит на интерфейсе eth0?
  • Что я должен использовать для опции протокола в конструкторе socket (), так как я не хочу ограничивать его IPPROTO_IP.

Может кто-нибудь указать мне правильное направление?Я проходил подобные вопросы, но ни один из них не решил мою проблему, так как все они были связаны со сниффингом IP-пакетов

Примечание: я знаю, что библиотеки, такие как Scapy, могли бы использоваться для сниффинга, но он теряет пакеты, если мыпытаюсь сделать какую-то сложную фильтрацию (или использовать функцию prn) и не подходит для того, что я пытаюсь сделать.Сырые розетки идеально соответствуют моим потребностям.

1 Ответ

2 голосов
/ 03 июня 2011

Я не могу проверить это без окна Windows, но я думаю, что все, что вам нужно, это ...

HOST = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
s.bind((HOST, 0))
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
while condition:
    pkt = s.recvfrom(1500)
    addToQueue(filter(pkt))

Кроме того, я бы рекомендовал вам использовать что-то вроде pypcap (или другоеобертка libpcap).

...