IP Adresse aus Device Info von PCapy auslesen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
pyTom
User
Beiträge: 2
Registriert: Dienstag 8. Januar 2008, 13:03

Hallo zusammen,

hoffe mir kann jemand helfen. Ich benutze das PCapy Modul um in Python Pakete zu capturen. PCapy bieten eine Funktion an, mit der ich alle Network Devices auslesen kann. Mit dieser Funktion wähle ich mir dann in meinem Programm das Device aus, welches die Pakete capturen soll.
Soweit so gut.
Jetzt würde ich die Pakete gerne weiterverarbeiten, also die Header Daten auslesen und auswerten. Jedoch brauche ich dafür die IP Adresse des Devices. Zur Zeit trage ich sie jedesmal per Hand ein, was keine wirkliche Lösung ist. Weiß jemand wie das geht?
Es gibt eine Funktion, welche mir das Netzwerk des Devices angibt, aber das hilft mir auch nicht wirklich weiter.
Mit Socket könnte ich zwar die IP rausbekommen, aber es werden 2 aktive Devices während dem capturen in Betrieb sein und ich weiß nicht ob das dann mit getsockname() funktioniert.

Hoffe es war jetzt nicht zu verwirrend. Falls ihr Fragen habt oder mehr Infos braucht, meldet euch.

Hier mal der Codeausschnitt, mit dem ich die Devices auslese:

Code: Alles auswählen

from pcapy import findalldevs

def getInterface():
	
	ifs = findalldevs()

	# No interfaces available, abort.
	if 0 == len(ifs):
		print "You don't have enough permissions to open any interface on this system."
		sys.exit(1)
	
	# Ask the user to choose an interface from the list.
	count = 0
	for iface in ifs:
		print '%i - %s' % (count, iface)
		count += 1
	idx = int(raw_input('Please select an interface: '))

	return ifs[idx]

Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das Reader-Objekt, das dir `open_live' zurückgibt, hat die Methode `getnet', die sollte dir die IP zurückgeben.
pyTom
User
Beiträge: 2
Registriert: Dienstag 8. Januar 2008, 13:03

Hi,

leider nicht. getnet() habe ich auch schon gefunden. Diese Methode gibt mir aber nur das Netz und nicht die IP zurück.
Also 192.168.2.0 anstatt 192.168.2.170.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Hm.. ich habe mir, als ich pcap einmal benutzt habe, eine Funktion geschrieben, die unter Posix fcntl.ioctl und unter Win WMI benutzt:

Code: Alles auswählen

import os

def get_ip(device_name):
    if os.name == 'posix':
        import fcntl
        import struct
        so = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        ip = fcntl.ioctl(so.fileno(),
                         0x8915, # SIOCGIFADDR
                         struct.pack('256s', device_name[:15]))[20:24]
        so.close()
        return socket.inet_ntoa(ip)
    elif os.name == 'nt':
        from win32com.client import GetObject
        wmi = GetObject('winmgmts:')
        adapter = wmi.ExecQuery('Select * From Win32_NetworkAdapterConfiguration Where SettingID=%s' % device_name[device_name.index('{'):])[0]
        return adapter.IPAddress[0]
Benötigt aber die Win32-Extensions IIRC und ich hab damals kein Pcapy benutzt.
lobo
User
Beiträge: 29
Registriert: Sonntag 25. August 2002, 16:10
Wohnort: bei Augsburg

Hi,

hier sind 2 Möglichkeiten aus dem Scapy Sourccode:

Das Beispiel basiert auf Libdnet und dürfte recht platformunabhängig sein. Auf der anderen Seite hat man aber eben dnet als Abhängigkeit.

Code: Alles auswählen

import dnet
ifaces = dnet.intf()
print ifaces.get("wlan0")["addr"]
Das Problem bei diesem Beispiel ist wohl, dass nicht auf allen Platformen ioctl verfügbar ist.

Code: Alles auswählen

import socket
import struct
from fcntl import ioctl
SIOCGIFADDR = 0x8915
s=socket.socket()
ifreq = ioctl(s, SIOCGIFADDR, struct.pack("16s16x","wlan0"))
print socket.inet_ntoa(ifreq[20:24])
Den Sourccode kann man sich einfach per "wget scapy.secdev.org" besorgen.

Gruss

Jochen
Jabber: lobo@jabber.ccc.de
[url=http://www.c3a.de/]chaostreff augsburg[/url]
Antworten