diff options
author | imarom <imarom@cisco.com> | 2016-03-21 16:03:47 +0200 |
---|---|---|
committer | imarom <imarom@cisco.com> | 2016-03-21 16:03:47 +0200 |
commit | b89efa188810bf95a9d245e69e2961b5721c3b0f (patch) | |
tree | 454273ac6c4ae972ebb8a2c86b893296970b4fa9 /scripts/external_libs/scapy-2.3.1/python2/scapy/arch/pcapdnet.py | |
parent | f72c6df9d2e9998ae1f3529d729ab7930b35785a (diff) |
scapy python 2/3
Diffstat (limited to 'scripts/external_libs/scapy-2.3.1/python2/scapy/arch/pcapdnet.py')
-rw-r--r-- | scripts/external_libs/scapy-2.3.1/python2/scapy/arch/pcapdnet.py | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/scripts/external_libs/scapy-2.3.1/python2/scapy/arch/pcapdnet.py b/scripts/external_libs/scapy-2.3.1/python2/scapy/arch/pcapdnet.py new file mode 100644 index 00000000..94673d7d --- /dev/null +++ b/scripts/external_libs/scapy-2.3.1/python2/scapy/arch/pcapdnet.py @@ -0,0 +1,368 @@ +## This file is part of Scapy +## See http://www.secdev.org/projects/scapy for more informations +## Copyright (C) Philippe Biondi <phil@secdev.org> +## This program is published under a GPLv2 license + +""" +Packet sending and receiving with libdnet and libpcap/WinPcap. +""" + +import time,struct,sys +if not sys.platform.startswith("win"): + from fcntl import ioctl +from scapy.data import * +from scapy.config import conf +from scapy.utils import warning +from scapy.supersocket import SuperSocket +from scapy.error import Scapy_Exception +import scapy.arch + + + +if conf.use_pcap: + + + + try: + import pcap + except ImportError,e: + try: + import pcapy as pcap + except ImportError,e2: + if conf.interactive: + log_loading.error("Unable to import pcap module: %s/%s" % (e,e2)) + conf.use_pcap = False + else: + raise + if conf.use_pcap: + + # From BSD net/bpf.h + #BIOCIMMEDIATE=0x80044270 + BIOCIMMEDIATE=-2147204496 + + if hasattr(pcap,"pcap"): # python-pypcap + class _PcapWrapper_pypcap: + def __init__(self, device, snaplen, promisc, to_ms): + try: + self.pcap = pcap.pcap(device, snaplen, promisc, immediate=1, timeout_ms=to_ms) + except TypeError: + # Older pypcap versions do not support the timeout_ms argument + self.pcap = pcap.pcap(device, snaplen, promisc, immediate=1) + def __getattr__(self, attr): + return getattr(self.pcap, attr) + def __del__(self): + warning("__del__: don't know how to close the file descriptor. Bugs ahead ! Please report this bug.") + def next(self): + c = self.pcap.next() + if c is None: + return + ts, pkt = c + return ts, str(pkt) + open_pcap = lambda *args,**kargs: _PcapWrapper_pypcap(*args,**kargs) + elif hasattr(pcap,"pcapObject"): # python-libpcap + class _PcapWrapper_libpcap: + def __init__(self, *args, **kargs): + self.pcap = pcap.pcapObject() + self.pcap.open_live(*args, **kargs) + def setfilter(self, filter): + self.pcap.setfilter(filter, 0, 0) + def next(self): + c = self.pcap.next() + if c is None: + return + l,pkt,ts = c + return ts,pkt + def __getattr__(self, attr): + return getattr(self.pcap, attr) + def __del__(self): + fd = self.pcap.fileno() + os.close(fd) + open_pcap = lambda *args,**kargs: _PcapWrapper_libpcap(*args,**kargs) + elif hasattr(pcap,"open_live"): # python-pcapy + class _PcapWrapper_pcapy: + def __init__(self, *args, **kargs): + self.pcap = pcap.open_live(*args, **kargs) + def next(self): + try: + c = self.pcap.next() + except pcap.PcapError: + return None + else: + h,p = c + s,us = h.getts() + return (s+0.000001*us), p + def fileno(self): + warning("fileno: pcapy API does not permit to get capure file descriptor. Bugs ahead! Press Enter to trigger packet reading") + return 0 + def __getattr__(self, attr): + return getattr(self.pcap, attr) + def __del__(self): + warning("__del__: don't know how to close the file descriptor. Bugs ahead ! Please report this bug.") + open_pcap = lambda *args,**kargs: _PcapWrapper_pcapy(*args,**kargs) + + + class PcapTimeoutElapsed(Scapy_Exception): + pass + + class L2pcapListenSocket(SuperSocket): + desc = "read packets at layer 2 using libpcap" + def __init__(self, iface = None, type = ETH_P_ALL, promisc=None, filter=None): + self.type = type + self.outs = None + self.iface = iface + if iface is None: + iface = conf.iface + if promisc is None: + promisc = conf.sniff_promisc + self.promisc = promisc + self.ins = open_pcap(iface, 1600, self.promisc, 100) + try: + ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1)) + except: + pass + if type == ETH_P_ALL: # Do not apply any filter if Ethernet type is given + if conf.except_filter: + if filter: + filter = "(%s) and not (%s)" % (filter, conf.except_filter) + else: + filter = "not (%s)" % conf.except_filter + if filter: + self.ins.setfilter(filter) + + def close(self): + del(self.ins) + + def recv(self, x=MTU): + ll = self.ins.datalink() + if ll in conf.l2types: + cls = conf.l2types[ll] + else: + cls = conf.default_l2 + warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name)) + + pkt = None + while pkt is None: + pkt = self.ins.next() + if pkt is not None: + ts,pkt = pkt + if scapy.arch.WINDOWS and pkt is None: + raise PcapTimeoutElapsed + + try: + pkt = cls(pkt) + except KeyboardInterrupt: + raise + except: + if conf.debug_dissector: + raise + pkt = conf.raw_layer(pkt) + pkt.time = ts + return pkt + + def send(self, x): + raise Scapy_Exception("Can't send anything with L2pcapListenSocket") + + + conf.L2listen = L2pcapListenSocket + + + + +if conf.use_dnet: + try: + import dnet + except ImportError,e: + if conf.interactive: + log_loading.error("Unable to import dnet module: %s" % e) + conf.use_dnet = False + def get_if_raw_hwaddr(iff): + "dummy" + return (0,"\0\0\0\0\0\0") + def get_if_raw_addr(iff): + "dummy" + return "\0\0\0\0" + def get_if_list(): + "dummy" + return [] + else: + raise + else: + def get_if_raw_hwaddr(iff): + if iff == scapy.arch.LOOPBACK_NAME: + return (772, '\x00'*6) + try: + l = dnet.intf().get(iff) + l = l["link_addr"] + except: + raise Scapy_Exception("Error in attempting to get hw address for interface [%s]" % iff) + return l.type,l.data + def get_if_raw_addr(ifname): + i = dnet.intf() + return i.get(ifname)["addr"].data + def get_if_list(): + return [i.get("name", None) for i in dnet.intf()] + + +if conf.use_pcap and conf.use_dnet: + class L3dnetSocket(SuperSocket): + desc = "read/write packets at layer 3 using libdnet and libpcap" + def __init__(self, type = ETH_P_ALL, filter=None, promisc=None, iface=None, nofilter=0): + self.iflist = {} + self.intf = dnet.intf() + if iface is None: + iface = conf.iface + self.iface = iface + self.ins = open_pcap(iface, 1600, 0, 100) + try: + ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1)) + except: + pass + if nofilter: + if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap + filter = "ether proto %i" % type + else: + filter = None + else: + if conf.except_filter: + if filter: + filter = "(%s) and not (%s)" % (filter, conf.except_filter) + else: + filter = "not (%s)" % conf.except_filter + if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap + if filter: + filter = "(ether proto %i) and (%s)" % (type,filter) + else: + filter = "ether proto %i" % type + if filter: + self.ins.setfilter(filter) + def send(self, x): + iff,a,gw = x.route() + if iff is None: + iff = conf.iface + ifs,cls = self.iflist.get(iff,(None,None)) + if ifs is None: + iftype = self.intf.get(iff)["type"] + if iftype == dnet.INTF_TYPE_ETH: + try: + cls = conf.l2types[1] + except KeyError: + warning("Unable to find Ethernet class. Using nothing") + ifs = dnet.eth(iff) + else: + ifs = dnet.ip() + self.iflist[iff] = ifs,cls + if cls is None: + sx = str(x) + else: + sx = str(cls()/x) + x.sent_time = time.time() + ifs.send(sx) + def recv(self,x=MTU): + ll = self.ins.datalink() + if ll in conf.l2types: + cls = conf.l2types[ll] + else: + cls = conf.default_l2 + warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name)) + + pkt = self.ins.next() + if pkt is not None: + ts,pkt = pkt + if pkt is None: + return + + try: + pkt = cls(pkt) + except KeyboardInterrupt: + raise + except: + if conf.debug_dissector: + raise + pkt = conf.raw_layer(pkt) + pkt.time = ts + return pkt.payload + + def nonblock_recv(self): + self.ins.setnonblock(1) + p = self.recv() + self.ins.setnonblock(0) + return p + + def close(self): + if hasattr(self, "ins"): + del(self.ins) + if hasattr(self, "outs"): + del(self.outs) + + class L2dnetSocket(SuperSocket): + desc = "read/write packets at layer 2 using libdnet and libpcap" + def __init__(self, iface = None, type = ETH_P_ALL, filter=None, nofilter=0): + if iface is None: + iface = conf.iface + self.iface = iface + self.ins = open_pcap(iface, 1600, 0, 100) + try: + ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1)) + except: + pass + if nofilter: + if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap + filter = "ether proto %i" % type + else: + filter = None + else: + if conf.except_filter: + if filter: + filter = "(%s) and not (%s)" % (filter, conf.except_filter) + else: + filter = "not (%s)" % conf.except_filter + if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap + if filter: + filter = "(ether proto %i) and (%s)" % (type,filter) + else: + filter = "ether proto %i" % type + if filter: + self.ins.setfilter(filter) + self.outs = dnet.eth(iface) + def recv(self,x=MTU): + ll = self.ins.datalink() + if ll in conf.l2types: + cls = conf.l2types[ll] + else: + cls = conf.default_l2 + warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name)) + + pkt = self.ins.next() + if pkt is not None: + ts,pkt = pkt + if pkt is None: + return + + try: + pkt = cls(pkt) + except KeyboardInterrupt: + raise + except: + if conf.debug_dissector: + raise + pkt = conf.raw_layer(pkt) + pkt.time = ts + return pkt + + def nonblock_recv(self): + self.ins.setnonblock(1) + p = self.recv(MTU) + self.ins.setnonblock(0) + return p + + def close(self): + if hasattr(self, "ins"): + del(self.ins) + if hasattr(self, "outs"): + del(self.outs) + + conf.L3socket=L3dnetSocket + conf.L2socket=L2dnetSocket + + + |