2016-07-25 1 views
0

J'essaie de lire les trames Ethernet (IEEE 802.2/3) en utilisant principalement socket. L'application doit juste renifler les trames ethernet et selon le contenu, agir sur elle. Cependant, il n'y a presque aucune information sur la façon de faire cela sur Windows, la valeur par défaut (unix) étant socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0800)). C'est inexistant à winsock apparemment. Alors, comment puis-je renifler les cadres eth?Python Lire les trames ethernet en utilisant socket sur Windows?

Je suppose que j'ai besoin de se lier à un MAC en utilisant socket.bind() au lieu de IP.

Mon morceau actuel de code:

def _receive(interface): #Receive Eth packets. 
    #Interface = '192.168.0.10' 

    sock2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
    sock2.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)) 
    sock2.bind((interface, 0)) 

    while True: 
     data, sender = sock2.recvfrom(1500) 
     handle_data(sender, data) 

me mène nulle part. Je vois des paquets sur la connexion locale dans Wireshark, mais ce n'est pas pris en python ..

Sur linux, je peux faire sock_raw = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_802_2)), Rabattre et setsockopt(sock_raw, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq))

Je voudrais ne pas avoir à dépendre trop externe bibliothèques car cela est censé être distribué et donc assez léger. pip install -les paquets sont corrects, ils peuvent être fournis avec l'installateur.

Répondre

0

La prise Python ne possède pas de capacités de reniflage. Aussi simple que cela. L'idée d'avoir une pile réseau dans votre système d'exploitation est que les programmes "enregistrent" pour que des types spécifiques de paquets leur soient livrés - typiquement, c'est quelque chose comme écouter sur un port IP, ie. un à deux niveaux au-dessus des paquets Ethernet bruts.

Pour obtenir tous les paquets Ethernet bruts, la pile réseau de votre système d'exploitation nécessite un type de pilote/interface pour vous aider à cela. C'est pourquoi wireshark a besoin de WinPcap.

Je pense que vous allez être très heureux avec pypcap, qui est probablement PyPi/pip installable.

+0

Ce n'est pas - Il doit être compilé dans MINGW pour que cela fonctionne. Je ne sais pas comment portable il est une fois que je l'ai installé sur ma machine. Il semble que beaucoup de fuzz pour le faire fonctionner. Je vais essayer de le construire en mingw – enrm