From 6057906368d55634d11e1d19a5cca1f127595b11 Mon Sep 17 00:00:00 2001 From: Robin Jarry <robin.jarry@6wind.com> Date: Wed, 1 Jun 2016 16:17:07 +0200 Subject: [PATCH] Fix individual modules import When using scapy as a third party library, we do not "benefit" from the loading routine that puts all symbols in the __builtin__ namespace. This implies that all modules must be "importable" without any errors for undefined symbols. This patch fixes importing every scapy module individually. Some circular imports were fixed (between inet6 and dhcp6). Most errors were detected by using pylint with the right configuration (scapy produces a *lot* of errors). Other errors were detected with the following shell script: export PYTHONPATH=".:$PYTHONPATH" for f in $(find scapy/ -name '*.py'); do f=${f%/__init__.py} module=$(echo ${f%.py} | sed 's,/,.,g') python -c "import $module; print $module" done Also, replace all implicit relative imports by absolute imports to avoid surprises with some python versions. Signed-off-by: Robin Jarry <robin.jarry@6wind.com> --- scapy/all.py | 64 +++++++++++++++---------------- scapy/ansmachine.py | 6 +-- scapy/arch/__init__.py | 16 ++++---- scapy/arch/linux.py | 3 +- scapy/arch/pcapdnet.py | 12 +++--- scapy/arch/solaris.py | 2 +- scapy/arch/unix.py | 6 +-- scapy/arch/windows/__init__.py | 3 +- scapy/as_resolvers.py | 2 +- scapy/asn1/asn1.py | 2 +- scapy/asn1/ber.py | 2 +- scapy/asn1fields.py | 21 +++++----- scapy/asn1packet.py | 3 +- scapy/automaton.py | 12 +++--- scapy/autorun.py | 8 ++-- scapy/base_classes.py | 6 +-- scapy/config.py | 11 +++--- scapy/contrib/HomePlugAV.py | 5 ++- scapy/contrib/bgp.py | 1 + scapy/contrib/carp.py | 5 ++- scapy/contrib/eigrp.uts | 1 + scapy/contrib/gsm_um.py | 7 +++- scapy/contrib/icmp_extensions.py | 6 ++- scapy/contrib/igmp.py | 4 +- scapy/contrib/igmpv3.py | 4 +- scapy/contrib/ikev2.py | 5 ++- scapy/contrib/isis.py | 14 ++----- scapy/contrib/modbus.py | 4 +- scapy/contrib/mpls.py | 7 ++-- scapy/contrib/openflow.py | 5 ++- scapy/contrib/openflow3.py | 4 +- scapy/contrib/ospf.py | 6 ++- scapy/contrib/send.py | 4 +- scapy/contrib/skinny.py | 8 ++-- scapy/contrib/spbm.py | 4 +- scapy/contrib/vtp.py | 5 ++- scapy/dadict.py | 2 +- scapy/data.py | 4 +- scapy/error.py | 2 +- scapy/fields.py | 12 +++--- scapy/layers/bluetooth.py | 3 +- scapy/layers/dhcp.py | 3 +- scapy/layers/dhcp6.py | 55 ++------------------------ scapy/layers/dns.py | 2 + scapy/layers/dot11.py | 9 ++++- scapy/layers/inet.py | 5 ++- scapy/layers/inet6.py | 66 +++++++++++++++++++++++++++++--- scapy/layers/isakmp.py | 1 + scapy/layers/l2.py | 4 +- scapy/layers/sctp.py | 1 + scapy/layers/snmp.py | 7 +++- scapy/layers/tftp.py | 2 +- scapy/layers/x509.py | 4 ++ scapy/main.py | 17 +++++--- scapy/modules/nmap.py | 3 ++ scapy/modules/p0f.py | 11 +++++- scapy/modules/queso.py | 3 ++ scapy/modules/voip.py | 2 + scapy/packet.py | 17 ++++---- scapy/pipetool.py | 8 ++-- scapy/plist.py | 21 ++++------ scapy/pton_ntop.py | 4 +- scapy/route.py | 8 ++-- scapy/route6.py | 8 ++-- scapy/scapypipes.py | 7 +++- scapy/sendrecv.py | 18 ++++----- scapy/supersocket.py | 14 ++++--- scapy/themes.py | 4 +- scapy/tools/UTscapy.py | 2 +- scapy/utils.py | 17 ++++---- scapy/utils6.py | 12 ++++-- scapy/volatile.py | 4 +- test/ipsec.uts | 2 + test/regression.uts | 8 +++- 74 files changed, 372 insertions(+), 278 deletions(-) diff --git a/scapy/all.py b/scapy/all.py index 15dd3ca4..9d6e5b5d 100644 --- a/scapy/all.py +++ b/scapy/all.py @@ -7,41 +7,41 @@ Aggregate top level objects from all Scapy modules. """ -from base_classes import * -from config import * -from dadict import * -from data import * -from error import * -from themes import * -from arch import * - -from plist import * -from fields import * -from packet import * -from asn1fields import * -from asn1packet import * - -from utils import * -from route import * +from scapy.base_classes import * +from scapy.config import * +from scapy.dadict import * +from scapy.data import * +from scapy.error import * +from scapy.themes import * +from scapy.arch import * + +from scapy.plist import * +from scapy.fields import * +from scapy.packet import * +from scapy.asn1fields import * +from scapy.asn1packet import * + +from scapy.utils import * +from scapy.route import * if conf.ipv6_enabled: - from utils6 import * - from route6 import * -from sendrecv import * -from supersocket import * -from volatile import * -from as_resolvers import * + from scapy.utils6 import * + from scapy.route6 import * +from scapy.sendrecv import * +from scapy.supersocket import * +from scapy.volatile import * +from scapy.as_resolvers import * -from ansmachine import * -from automaton import * -from autorun import * +from scapy.ansmachine import * +from scapy.automaton import * +from scapy.autorun import * -from main import * +from scapy.main import * -from layers.all import * +from scapy.layers.all import * -from asn1.asn1 import * -from asn1.ber import * -from asn1.mib import * +from scapy.asn1.asn1 import * +from scapy.asn1.ber import * +from scapy.asn1.mib import * -from pipetool import * -from scapypipes import * +from scapy.pipetool import * +from scapy.scapypipes import * diff --git a/scapy/ansmachine.py b/scapy/ansmachine.py index d73bd421..7f570cbf 100644 --- a/scapy/ansmachine.py +++ b/scapy/ansmachine.py @@ -11,9 +11,9 @@ Answering machines. ## Answering machines ## ######################## -from sendrecv import send,sendp,sniff -from config import conf -from error import log_interactive +from scapy.sendrecv import send,sendp,sniff +from scapy.config import conf +from scapy.error import log_interactive class ReferenceAM(type): def __new__(cls, name, bases, dct): diff --git a/scapy/arch/__init__.py b/scapy/arch/__init__.py index 058f0f17..389a22b2 100644 --- a/scapy/arch/__init__.py +++ b/scapy/arch/__init__.py @@ -9,8 +9,10 @@ Operating system specific functionality. import sys,os,socket + from scapy.error import * import scapy.config +from scapy.pton_ntop import inet_pton try: from matplotlib import get_backend as matplotlib_get_backend @@ -79,19 +81,19 @@ ARM_64 = not WINDOWS and (os.uname()[4] == 'aarch64') if LINUX: - from linux import * + from scapy.arch.linux import * if scapy.config.conf.use_pcap or scapy.config.conf.use_dnet: - from pcapdnet import * + from scapy.arch.pcapdnet import * elif BSD: - from bsd import LOOPBACK_NAME - from unix import read_routes, read_routes6, in6_getifaddr + from scapy.arch.bsd import LOOPBACK_NAME + from scapy.arch.unix import read_routes, read_routes6, in6_getifaddr scapy.config.conf.use_pcap = True scapy.config.conf.use_dnet = True - from pcapdnet import * + from scapy.arch.pcapdnet import * elif SOLARIS: - from solaris import * + from scapy.arch.solaris import * elif WINDOWS: - from windows import * + from scapy.arch.windows import * if scapy.config.conf.iface is None: scapy.config.conf.iface = LOOPBACK_NAME diff --git a/scapy/arch/linux.py b/scapy/arch/linux.py index 0b2b9b9e..a9908bfc 100644 --- a/scapy/arch/linux.py +++ b/scapy/arch/linux.py @@ -11,6 +11,7 @@ from __future__ import with_statement import sys,os,struct,socket,time from select import select from fcntl import ioctl + import scapy.utils import scapy.utils6 from scapy.packet import Packet, Padding @@ -18,7 +19,7 @@ from scapy.config import conf from scapy.data import * from scapy.supersocket import SuperSocket import scapy.arch -from scapy.error import warning, Scapy_Exception +from scapy.error import warning, Scapy_Exception, log_interactive, log_loading from scapy.arch.common import get_if diff --git a/scapy/arch/pcapdnet.py b/scapy/arch/pcapdnet.py index 13ec1fae..ae628bce 100755 --- a/scapy/arch/pcapdnet.py +++ b/scapy/arch/pcapdnet.py @@ -8,16 +8,16 @@ Packet sending and receiving with libdnet and libpcap/WinPcap. """ import time,struct,sys +import socket if not sys.platform.startswith("win"): from fcntl import ioctl + from scapy.data import * from scapy.config import conf from scapy.utils import warning, mac2str from scapy.supersocket import SuperSocket -from scapy.error import Scapy_Exception +from scapy.error import Scapy_Exception, log_loading import scapy.arch -import socket - if conf.use_winpcapy: #mostly code from https://github.com/phaethon/scapy translated to python2.X @@ -145,17 +145,17 @@ if conf.use_winpcapy: return pcap_datalink(self.pcap) def fileno(self): if sys.platform.startswith("win"): - error("Cannot get selectable PCAP fd on Windows") + log_loading.error("Cannot get selectable PCAP fd on Windows") return 0 return pcap_get_selectable_fd(self.pcap) def setfilter(self, f): filter_exp = create_string_buffer(f) if pcap_compile(self.pcap, byref(self.bpf_program), filter_exp, 0, -1) == -1: - error("Could not compile filter expression %s" % f) + log_loading.error("Could not compile filter expression %s" % f) return False else: if pcap_setfilter(self.pcap, byref(self.bpf_program)) == -1: - error("Could not install filter %s" % f) + log_loading.error("Could not install filter %s" % f) return False return True def setnonblock(self, i): diff --git a/scapy/arch/solaris.py b/scapy/arch/solaris.py index 3117076a..13d23497 100644 --- a/scapy/arch/solaris.py +++ b/scapy/arch/solaris.py @@ -13,4 +13,4 @@ socket.IPPROTO_GRE = 47 LOOPBACK_NAME="lo0" -from unix import * +from scapy.arch.unix import * diff --git a/scapy/arch/unix.py b/scapy/arch/unix.py index 1449df37..624844d4 100644 --- a/scapy/arch/unix.py +++ b/scapy/arch/unix.py @@ -9,7 +9,9 @@ Common customizations for all Unix-like operating systems other than Linux import sys,os,struct,socket,time from fcntl import ioctl -from scapy.error import warning +import socket + +from scapy.error import warning, log_interactive import scapy.config import scapy.utils from scapy.utils6 import in6_getscope, construct_source_candidate_set @@ -17,8 +19,6 @@ from scapy.utils6 import in6_isvalid, in6_ismlladdr, in6_ismnladdr import scapy.arch from scapy.config import conf -import socket - ################## ## Routes stuff ## diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py index b2855117..3884dac7 100755 --- a/scapy/arch/windows/__init__.py +++ b/scapy/arch/windows/__init__.py @@ -19,7 +19,6 @@ from scapy.utils import atol, itom, inet_aton, inet_ntoa, PcapReader from scapy.base_classes import Gen, Net, SetGen import scapy.plist as plist from scapy.sendrecv import debug, srp1 -from scapy.layers.l2 import Ether, ARP from scapy.data import MTU, ETHER_BROADCAST, ETH_P_ARP conf.use_pcap = False @@ -211,7 +210,7 @@ def get_windows_if_list(): ] def get_ip_from_name(ifname, v6=False): - for descr, ipadrr in exec_query(['Get-WmiObject', + for descr, ipaddr in exec_query(['Get-WmiObject', 'Win32_NetworkAdapterConfiguration'], ['Description', 'IPAddress']): if descr == ifname.strip(): diff --git a/scapy/as_resolvers.py b/scapy/as_resolvers.py index 24573c20..a1f3b796 100644 --- a/scapy/as_resolvers.py +++ b/scapy/as_resolvers.py @@ -9,7 +9,7 @@ Resolve Autonomous Systems (AS). import socket -from config import conf +from scapy.config import conf class AS_resolver: server = None diff --git a/scapy/asn1/asn1.py b/scapy/asn1/asn1.py index 6823d45b..55d7ab6b 100644 --- a/scapy/asn1/asn1.py +++ b/scapy/asn1/asn1.py @@ -12,7 +12,7 @@ import random from datetime import datetime from scapy.config import conf from scapy.error import Scapy_Exception, warning -from scapy.volatile import RandField +from scapy.volatile import RandField, RandIP from scapy.utils import Enum_metaclass, EnumElement, binrepr class RandASN1Object(RandField): diff --git a/scapy/asn1/ber.py b/scapy/asn1/ber.py index f1cdcc64..bfe74726 100644 --- a/scapy/asn1/ber.py +++ b/scapy/asn1/ber.py @@ -11,7 +11,7 @@ Basic Encoding Rules (BER) for ASN.1 from scapy.error import warning from scapy.utils import binrepr,inet_aton,inet_ntoa -from asn1 import ASN1_Decoding_Error,ASN1_Encoding_Error,ASN1_BadTag_Decoding_Error,ASN1_Codecs,ASN1_Class_UNIVERSAL,ASN1_Error,ASN1_DECODING_ERROR,ASN1_BADTAG +from scapy.asn1.asn1 import ASN1_Decoding_Error,ASN1_Encoding_Error,ASN1_BadTag_Decoding_Error,ASN1_Codecs,ASN1_Class_UNIVERSAL,ASN1_Error,ASN1_DECODING_ERROR,ASN1_BADTAG ################## ## BER encoding ## diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py index 78d4399a..7c37d14f 100644 --- a/scapy/asn1fields.py +++ b/scapy/asn1fields.py @@ -8,12 +8,13 @@ Classes that implement ASN.1 data structures. """ -from asn1.asn1 import * -from asn1.ber import * -from asn1.mib import * -from volatile import * -from base_classes import BasePacket -from utils import binrepr +from scapy.asn1.asn1 import * +from scapy.asn1.ber import * +from scapy.asn1.mib import * +from scapy.volatile import * +from scapy.base_classes import BasePacket +from scapy.utils import binrepr +from scapy import packet class ASN1F_badsequence(Exception): pass @@ -376,7 +377,7 @@ class ASN1F_SEQUENCE_OF(ASN1F_field): return self.i2m(pkt, s) def randval(self): - return fuzz(self.asn1pkt()) + return packet.fuzz(self.asn1pkt()) def __repr__(self): return "<%s %s>" % (self.__class__.__name__, self.name) @@ -496,7 +497,7 @@ class ASN1F_CHOICE(ASN1F_field): explicit_tag=exp) return BER_tagging_enc(s, explicit_tag=self.explicit_tag) def randval(self): - return RandChoice(*(fuzz(x()) for x in self.choices.itervalues())) + return RandChoice(*(packet.fuzz(x()) for x in self.choices.itervalues())) class ASN1F_PACKET(ASN1F_field): holds_packets = 1 @@ -579,7 +580,3 @@ class ASN1F_FLAGS(ASN1F_BIT_STRING): pretty_s = ", ".join(self.get_flags(pkt)) return pretty_s + " " + repr(x) return repr(x) - - -# This import must come last to avoid problems with cyclic dependencies -import packet diff --git a/scapy/asn1packet.py b/scapy/asn1packet.py index 1b83c3a3..5d7b56a3 100644 --- a/scapy/asn1packet.py +++ b/scapy/asn1packet.py @@ -7,7 +7,8 @@ Packet holding data in Abstract Syntax Notation (ASN.1). """ -from packet import * +from scapy.base_classes import Packet_metaclass +from scapy.packet import Packet class ASN1Packet_metaclass(Packet_metaclass): def __new__(cls, name, bases, dct): diff --git a/scapy/automaton.py b/scapy/automaton.py index 1dde1dac..247fa9d1 100644 --- a/scapy/automaton.py +++ b/scapy/automaton.py @@ -12,12 +12,12 @@ import types,itertools,time,os,sys,socket,traceback from select import select from collections import deque import thread -from config import conf -from utils import do_graph -from error import log_interactive -from plist import PacketList -from data import MTU -from supersocket import SuperSocket +from scapy.config import conf +from scapy.utils import do_graph +from scapy.error import log_interactive +from scapy.plist import PacketList +from scapy.data import MTU +from scapy.supersocket import SuperSocket class ObjectPipe: def __init__(self): diff --git a/scapy/autorun.py b/scapy/autorun.py index a4534949..b3b5c568 100644 --- a/scapy/autorun.py +++ b/scapy/autorun.py @@ -8,10 +8,10 @@ Run commands when the Scapy interpreter starts. """ import code,sys -from config import conf -from themes import * -from error import Scapy_Exception -from utils import tex_escape +from scapy.config import conf +from scapy.themes import * +from scapy.error import Scapy_Exception +from scapy.utils import tex_escape ######################### diff --git a/scapy/base_classes.py b/scapy/base_classes.py index 7575bf6b..a810c085 100644 --- a/scapy/base_classes.py +++ b/scapy/base_classes.py @@ -12,8 +12,6 @@ Generators and packet meta classes. ################ import re,random,socket -import config -import error import types class Gen(object): @@ -202,6 +200,7 @@ class Packet_metaclass(type): for f in newcls.fields_desc: if hasattr(f, "register_owner"): f.register_owner(newcls) + from scapy import config config.conf.layers.register(newcls) return newcls @@ -216,6 +215,7 @@ class Packet_metaclass(type): try: cls = cls.dispatch_hook(*args, **kargs) except: + from scapy import config if config.conf.debug_dissector: raise cls = config.conf.raw_layer @@ -238,7 +238,7 @@ class NewDefaultValues(Packet_metaclass): and it should still work. """ def __new__(cls, name, bases, dct): - from error import log_loading + from scapy.error import log_loading import traceback try: for tb in traceback.extract_stack()+[("??",-1,None,"")]: diff --git a/scapy/config.py b/scapy/config.py index 7f99e3d8..3f4fe8e6 100755 --- a/scapy/config.py +++ b/scapy/config.py @@ -8,10 +8,11 @@ Implementation for of the configuration object. """ import os,time,socket,sys -from data import * -import base_classes -import themes -from error import log_scapy + +from scapy.data import * +from scapy import base_classes +from scapy import themes +from scapy.error import log_scapy ############ ## Config ## @@ -279,7 +280,7 @@ def _prompt_changer(attr,val): prompt = conf.prompt try: ct = val - if isinstance(ct, AnsiColorTheme) and ct.prompt(""): + if isinstance(ct, themes.AnsiColorTheme) and ct.prompt(""): ## ^A and ^B delimit invisible caracters for readline to count right. ## And we need ct.prompt() to do change something or else ^A and ^B will be ## displayed diff --git a/scapy/contrib/HomePlugAV.py b/scapy/contrib/HomePlugAV.py index 1717f442..704720f3 100644 --- a/scapy/contrib/HomePlugAV.py +++ b/scapy/contrib/HomePlugAV.py @@ -1,4 +1,7 @@ -from scapy.all import * +from scapy.packet import * +from scapy.fields import * +from scapy.layers.l2 import Ether + """ Copyright (C) HomePlugAV Layer for Scapy by FlUxIuS (Sebastien Dudek) """ diff --git a/scapy/contrib/bgp.py b/scapy/contrib/bgp.py index 61655e37..e6b86308 100644 --- a/scapy/contrib/bgp.py +++ b/scapy/contrib/bgp.py @@ -165,5 +165,6 @@ bind_layers( BGPHeader, BGPHeader, type=4) if __name__ == "__main__": + from scapy.main import interact interact(mydict=globals(), mybanner="BGP addon .05") diff --git a/scapy/contrib/carp.py b/scapy/contrib/carp.py index 3831aae4..aba858fc 100644 --- a/scapy/contrib/carp.py +++ b/scapy/contrib/carp.py @@ -2,11 +2,12 @@ # scapy.contrib.description = CARP # scapy.contrib.status = loads +import struct, hmac, hashlib + from scapy.packet import * from scapy.layers.inet import IP from scapy.fields import BitField, ByteField, XShortField, IntField, XIntField -from scapy.utils import checksum -import struct, hmac, hashlib +from scapy.utils import checksum, inet_aton class CARP(Packet): name = "CARP" diff --git a/scapy/contrib/eigrp.uts b/scapy/contrib/eigrp.uts index 77379679..c19a56b7 100644 --- a/scapy/contrib/eigrp.uts +++ b/scapy/contrib/eigrp.uts @@ -60,6 +60,7 @@ f = EigrpIP6Field("ipaddr", "2000::", length=128) f.i2len(None, "") == 16 = EIGRPGuessPayloadClass function: Return Parameters TLV +from scapy.contrib.eigrp import _EIGRPGuessPayloadClass isinstance(_EIGRPGuessPayloadClass("\x00\x01"), EIGRPParam) = EIGRPGuessPayloadClass function: Return Authentication Data TLV diff --git a/scapy/contrib/gsm_um.py b/scapy/contrib/gsm_um.py index 923d80b7..36b6a411 100644 --- a/scapy/contrib/gsm_um.py +++ b/scapy/contrib/gsm_um.py @@ -35,7 +35,9 @@ from types import StringType #from time import sleep import socket logging.getLogger("scapy").setLevel(1) -from scapy.all import * + +from scapy.packet import * +from scapy.fields import * # This method is intended to send gsm air packets. It uses a unix domain # socket. It opens a socket, sends the parameter to the socket and @@ -2229,7 +2231,7 @@ def startCc(CallControlCapabilities_presence=0): packet = a / b if CallControlCapabilities_presence is 1: c = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0) - packet = paclet / c + packet = packet / c return packet @@ -12789,4 +12791,5 @@ class AttachType(Packet): if __name__ == "__main__": + from scapy.main import interact interact(mydict=globals(), mybanner="Scapy GSM-UM (Air) Addon") diff --git a/scapy/contrib/icmp_extensions.py b/scapy/contrib/icmp_extensions.py index d86ac2ce..56820898 100644 --- a/scapy/contrib/icmp_extensions.py +++ b/scapy/contrib/icmp_extensions.py @@ -1,8 +1,10 @@ -from scapy.contrib.mpls import MPLS +import scapy +from scapy.packet import Packet, bind_layers from scapy.fields import * +from scapy.layers.inet import IP, ICMP from scapy.layers.inet6 import IP6Field -from scapy.packet import Packet, bind_layers from scapy.utils import warning +from scapy.contrib.mpls import MPLS class ICMPExtensionObject(Packet): diff --git a/scapy/contrib/igmp.py b/scapy/contrib/igmp.py index cc3dadc8..fe7b225b 100644 --- a/scapy/contrib/igmp.py +++ b/scapy/contrib/igmp.py @@ -7,7 +7,9 @@ # TODO: scapy 2 has function getmacbyip, maybe it can replace igmpize # at least from the MAC layer -from scapy.all import * +from scapy.packet import * +from scapy.fields import * +from scapy.layers.inet import * #-------------------------------------------------------------------------- def isValidMCAddr(ip): diff --git a/scapy/contrib/igmpv3.py b/scapy/contrib/igmpv3.py index dfdcf3a1..dd41f992 100644 --- a/scapy/contrib/igmpv3.py +++ b/scapy/contrib/igmpv3.py @@ -6,6 +6,9 @@ # scapy.contrib.status = loads from scapy.packet import * +from scapy.fields import * +from scapy.layers.inet import * +from scapy.contrib.igmp import isValidMCAddr """ Based on the following references http://www.iana.org/assignments/igmp-type-numbers @@ -25,7 +28,6 @@ from scapy.packet import * # #import sys, socket, struct, time -from scapy.all import * print "IGMPv3 is still under development - Nov 2010" diff --git a/scapy/contrib/ikev2.py b/scapy/contrib/ikev2.py index 07d4dbb2..9b3f394e 100644 --- a/scapy/contrib/ikev2.py +++ b/scapy/contrib/ikev2.py @@ -5,17 +5,17 @@ # scapy.contrib.description = IKEv2 # scapy.contrib.status = loads -from scapy.all import * import logging +import struct ## Modified from the original ISAKMP code by Yaron Sheffer <yaronf.ietf@gmail.com>, June 2010. -import struct from scapy.packet import * from scapy.fields import * from scapy.ansmachine import * from scapy.layers.inet import IP,UDP +from scapy.layers.isakmp import ISAKMP from scapy.sendrecv import sr # see http://www.iana.org/assignments/ikev2-parameters for details @@ -358,4 +358,5 @@ def ikev2scan(ip): # conf.debug_dissector = 1 if __name__ == "__main__": + from scapy.main import interact interact(mydict=globals(), mybanner="IKEv2 alpha-level protocol implementation") diff --git a/scapy/contrib/isis.py b/scapy/contrib/isis.py index 34325657..c37dd163 100644 --- a/scapy/contrib/isis.py +++ b/scapy/contrib/isis.py @@ -46,19 +46,13 @@ """ import struct +import random from scapy.config import conf -from scapy.fields import Field, FlagsField, ByteField, ByteEnumField, \ - FieldLenField, ShortField, PacketListField, XIntField, \ - XShortField, ConditionalField, ThreeBytesField, IntField, BitField, IPField, \ - FieldListField, MACField, BitFieldLenField, IPPrefixField, IP6PrefixField,\ - BoundStrLenField +from scapy.fields import * +from scapy.packet import * from scapy.layers.clns import network_layer_protocol_ids, register_cln_protocol from scapy.layers.inet6 import IP6ListField -from scapy.packet import Packet, bind_layers -from scapy.utils import fletcher16_checkbytes -from scapy.volatile import RandString, RandByte -import random EXT_VERSION = "v0.0.1" @@ -772,4 +766,4 @@ bind_layers(ISIS_CommonHdr, ISIS_L2_LSP, hdrlen=27, pdutype=20) bind_layers(ISIS_CommonHdr, ISIS_L1_CSNP, hdrlen=33, pdutype=24) bind_layers(ISIS_CommonHdr, ISIS_L2_CSNP, hdrlen=33, pdutype=25) bind_layers(ISIS_CommonHdr, ISIS_L1_PSNP, hdrlen=17, pdutype=26) -bind_layers(ISIS_CommonHdr, ISIS_L2_PSNP, hdrlen=17, pdutype=27) \ No newline at end of file +bind_layers(ISIS_CommonHdr, ISIS_L2_PSNP, hdrlen=17, pdutype=27) diff --git a/scapy/contrib/modbus.py b/scapy/contrib/modbus.py index 8f4e83da..a6be7ff5 100644 --- a/scapy/contrib/modbus.py +++ b/scapy/contrib/modbus.py @@ -16,7 +16,9 @@ # Copyright (C) 2016 Arthur Gervais, Ken LE PRADO, Sébastien Mainand -from scapy.all import * +from scapy.packet import * +from scapy.fields import * +from scapy.layers.inet import * # TODO: implement serial specific function codes diff --git a/scapy/contrib/mpls.py b/scapy/contrib/mpls.py index 7f1f85a3..640a0c57 100644 --- a/scapy/contrib/mpls.py +++ b/scapy/contrib/mpls.py @@ -3,10 +3,11 @@ # scapy.contrib.description = MPLS # scapy.contrib.status = loads -from scapy.packet import Packet,bind_layers +from scapy.packet import Packet, bind_layers, Padding from scapy.fields import BitField,ByteField -from scapy.layers.l2 import Ether -from scapy.layers.l2 import GRE +from scapy.layers.inet import IP +from scapy.layers.inet6 import IPv6 +from scapy.layers.l2 import Ether, GRE class MPLS(Packet): name = "MPLS" diff --git a/scapy/contrib/openflow.py b/scapy/contrib/openflow.py index 3e5fcf73..dd11630a 100755 --- a/scapy/contrib/openflow.py +++ b/scapy/contrib/openflow.py @@ -12,8 +12,9 @@ # scapy.contrib.status = loads import struct -from scapy.all import * -from scapy.utils import binrepr +from scapy.fields import * +from scapy.layers.l2 import * +from scapy.layers.inet import * ### If prereq_autocomplete is True then match prerequisites will be ### automatically handled. See OFPMatch class. diff --git a/scapy/contrib/openflow3.py b/scapy/contrib/openflow3.py index 5df721ad..9ef88587 100755 --- a/scapy/contrib/openflow3.py +++ b/scapy/contrib/openflow3.py @@ -12,7 +12,9 @@ # scapy.contrib.status = loads import struct -from scapy.all import * +from scapy.fields import * +from scapy.layers.l2 import * +from scapy.layers.inet import * ### If prereq_autocomplete is True then match prerequisites will be ### automatically handled. See OFPMatch class. diff --git a/scapy/contrib/ospf.py b/scapy/contrib/ospf.py index 66c79b3e..7b10cea6 100644 --- a/scapy/contrib/ospf.py +++ b/scapy/contrib/ospf.py @@ -24,7 +24,10 @@ GNU General Public License for more details. """ -from scapy.all import * +from scapy.packet import * +from scapy.fields import * +from scapy.layers.inet import * +from scapy.layers.inet6 import * EXT_VERSION = "v0.9.2" @@ -746,4 +749,5 @@ DestIP6Field.bind_addr(OSPFv3_Hdr, "ff02::5") if __name__ == "__main__": + from scapy.main import interact interact(mydict=globals(), mybanner="OSPF extension %s" % EXT_VERSION) diff --git a/scapy/contrib/send.py b/scapy/contrib/send.py index 23f8c1cd..676158a4 100644 --- a/scapy/contrib/send.py +++ b/scapy/contrib/send.py @@ -8,9 +8,11 @@ # scapy.contrib.description = SEND # scapy.contrib.status = loads +import socket + from scapy.packet import * from scapy.fields import * -from scapy.layers.inet6 import icmp6typescls, _ICMPv6NDGuessPayload +from scapy.layers.inet6 import icmp6typescls, _ICMPv6NDGuessPayload, Net6 send_icmp6typescls = { 11: "ICMPv6NDOptCGA", 12: "ICMPv6NDOptRsaSig", diff --git a/scapy/contrib/skinny.py b/scapy/contrib/skinny.py index 41cbaa0a..1ed02e42 100644 --- a/scapy/contrib/skinny.py +++ b/scapy/contrib/skinny.py @@ -22,8 +22,9 @@ ## ## ############################################################################# -from scapy.all import * -import __builtin__ +from scapy.packet import * +from scapy.fields import * +from scapy.layers.inet import TCP ##################################################################### # Helpers and constants @@ -474,7 +475,7 @@ class Skinny(Packet): name="Skinny" fields_desc = [ LEIntField("len", None), LEIntField("res",0), - LEIntEnumField("msg",0, skinny_messages) ] + LEIntEnumField("msg",0, skinny_messages_cls) ] def post_build(self, pkt, p): if self.len is None: @@ -495,5 +496,6 @@ bind_layers(TCP, Skinny, { "dport": 2000 } ) bind_layers(TCP, Skinny, { "sport": 2000 } ) if __name__ == "__main__": + from scapy.main import interact interact(mydict=globals(),mybanner="Welcome to Skinny add-on") diff --git a/scapy/contrib/spbm.py b/scapy/contrib/spbm.py index efd48488..44ae942d 100644 --- a/scapy/contrib/spbm.py +++ b/scapy/contrib/spbm.py @@ -19,8 +19,8 @@ # spb_example = backboneEther/backboneDot1Q/backboneServiceID/customerEther/customerDot1Q/customerIP/customerUDP/"Payload" from scapy.packet import Packet, bind_layers -from scapy.layers.l2 import Ether from scapy.fields import * +from scapy.layers.l2 import Ether, Dot1Q class SPBM(Packet): name = "SPBM" @@ -35,4 +35,4 @@ class SPBM(Packet): return self.sprintf("SPBM (isid=%SPBM.isid%") bind_layers(Dot1Q, SPBM, type=0x88e7) -bind_layers(SPBM, Ether) \ No newline at end of file +bind_layers(SPBM, Ether) diff --git a/scapy/contrib/vtp.py b/scapy/contrib/vtp.py index af5c2823..0ebb17d8 100644 --- a/scapy/contrib/vtp.py +++ b/scapy/contrib/vtp.py @@ -42,7 +42,9 @@ http://www.cisco.com/en/US/tech/tk389/tk689/technologies_tech_note09186a0080094c52.shtml """ -from scapy.all import * +from scapy.packet import * +from scapy.fields import * +from scapy.layers.l2 import * _VTP_VLAN_TYPE = { 1 : 'Ethernet', @@ -168,4 +170,5 @@ class VTP(Packet): bind_layers(SNAP, VTP, code=0x2003) if __name__ == '__main__': + from scapy.main import interact interact(mydict=globals(), mybanner="VTP") diff --git a/scapy/dadict.py b/scapy/dadict.py index f50ccfb1..62addb31 100644 --- a/scapy/dadict.py +++ b/scapy/dadict.py @@ -7,7 +7,7 @@ Direct Access dictionary. """ -from error import Scapy_Exception +from scapy.error import Scapy_Exception ############################### ## Direct Access dictionnary ## diff --git a/scapy/data.py b/scapy/data.py index 643ba964..890b00af 100644 --- a/scapy/data.py +++ b/scapy/data.py @@ -8,8 +8,8 @@ Global variables and functions for handling external data sets. """ import os,sys,re -from dadict import DADict -from error import log_loading +from scapy.dadict import DADict +from scapy.error import log_loading ############ ## Consts ## diff --git a/scapy/error.py b/scapy/error.py index 29ebc1ba..ee879d53 100644 --- a/scapy/error.py +++ b/scapy/error.py @@ -21,7 +21,7 @@ class ScapyFreqFilter(logging.Filter): logging.Filter.__init__(self) self.warning_table = {} def filter(self, record): - from config import conf + from scapy.config import conf wt = conf.warning_threshold if wt > 0: stk = traceback.extract_stack() diff --git a/scapy/fields.py b/scapy/fields.py index e7a2ed55..0a92cef8 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -8,11 +8,11 @@ Fields: basic data structures that make up parts of packets. """ import struct,copy,socket -from config import conf -from volatile import * -from data import * -from utils import * -from base_classes import BasePacket, Gen, Net, Field_metaclass +from scapy.config import conf +from scapy.volatile import * +from scapy.data import * +from scapy.utils import * +from scapy.base_classes import BasePacket, Gen, Net, Field_metaclass ############ @@ -630,7 +630,7 @@ class FieldLenField(Field): self.count_of = count_of self.adjust = adjust if fld is not None: - FIELD_LENGTH_MANAGEMENT_DEPRECATION(self.__class__.__name__) + #FIELD_LENGTH_MANAGEMENT_DEPRECATION(self.__class__.__name__) self.length_of = fld def i2m(self, pkt, x): if x is None: diff --git a/scapy/layers/bluetooth.py b/scapy/layers/bluetooth.py index db91e5da..9d7e4963 100644 --- a/scapy/layers/bluetooth.py +++ b/scapy/layers/bluetooth.py @@ -10,13 +10,14 @@ Bluetooth layers, sockets and send/receive functions. import socket,struct,array from ctypes import * +from select import select from scapy.config import conf from scapy.packet import * from scapy.fields import * from scapy.supersocket import SuperSocket +from scapy.sendrecv import sndrcv from scapy.data import MTU -from select import select ########## # Fields # diff --git a/scapy/layers/dhcp.py b/scapy/layers/dhcp.py index ebd8f67c..612d72f7 100644 --- a/scapy/layers/dhcp.py +++ b/scapy/layers/dhcp.py @@ -12,13 +12,14 @@ import struct from scapy.packet import * from scapy.fields import * from scapy.ansmachine import * +from scapy.data import * from scapy.layers.inet import UDP,IP from scapy.layers.l2 import Ether from scapy.base_classes import Net from scapy.volatile import RandField from scapy.arch import get_if_raw_hwaddr -from scapy.sendrecv import srp1 +from scapy.sendrecv import * dhcpmagic="c\x82Sc" diff --git a/scapy/layers/dhcp6.py b/scapy/layers/dhcp6.py index 32f28d6e..40ecedc1 100644 --- a/scapy/layers/dhcp6.py +++ b/scapy/layers/dhcp6.py @@ -11,11 +11,15 @@ DHCPv6: Dynamic Host Configuration Protocol for IPv6. [RFC 3315] """ import socket + from scapy.packet import * from scapy.fields import * +from scapy.data import * from scapy.utils6 import * +from scapy.themes import Color from scapy.layers.inet6 import * from scapy.ansmachine import AnsweringMachine +from scapy.sendrecv import * ############################################################################# # Helpers ## @@ -657,57 +661,6 @@ class DHCP6OptReconfAccept(_DHCP6OptGuessPayload): # RFC sect 22.20 fields_desc = [ ShortEnumField("optcode", 20, dhcp6opts), ShortField("optlen", 0)] -# As required in Sect 8. of RFC 3315, Domain Names must be encoded as -# described in section 3.1 of RFC 1035 -# XXX Label should be at most 63 octets in length : we do not enforce it -# Total length of domain should be 255 : we do not enforce it either -class DomainNameListField(StrLenField): - __slots__ = ["padded"] - islist = 1 - padded_unit = 8 - - def __init__(self, name, default, fld=None, length_from=None, padded=False): - self.padded = padded - StrLenField.__init__(self, name, default, fld, length_from) - - def i2len(self, pkt, x): - return len(self.i2m(pkt, x)) - - def m2i(self, pkt, x): - res = [] - while x: - # Get a name until \x00 is reached - cur = [] - while x and x[0] != '\x00': - l = ord(x[0]) - cur.append(x[1:l+1]) - x = x[l+1:] - if self.padded: - # Discard following \x00 in padded mode - if len(cur): - res.append(".".join(cur) + ".") - else: - # Store the current name - res.append(".".join(cur) + ".") - if x and x[0] == '\x00': - x = x[1:] - return res - - def i2m(self, pkt, x): - def conditionalTrailingDot(z): - if z and z[-1] == '\x00': - return z - return z+'\x00' - # Build the encode names - tmp = map(lambda y: map((lambda z: chr(len(z))+z), y.split('.')), x) - ret_string = "".join(map(lambda x: conditionalTrailingDot("".join(x)), tmp)) - - # In padded mode, add some \x00 bytes - if self.padded and not len(ret_string) % self.padded_unit == 0: - ret_string += "\x00" * (self.padded_unit - len(ret_string) % self.padded_unit) - - return ret_string - class DHCP6OptSIPDomains(_DHCP6OptGuessPayload): #RFC3319 name = "DHCP6 Option - SIP Servers Domain Name List" fields_desc = [ ShortEnumField("optcode", 21, dhcp6opts), diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py index ac7d4ad5..2532633a 100644 --- a/scapy/layers/dns.py +++ b/scapy/layers/dns.py @@ -9,9 +9,11 @@ DNS: Domain Name System. import socket,struct +from scapy.config import conf from scapy.packet import * from scapy.fields import * from scapy.ansmachine import * +from scapy.sendrecv import sr1 from scapy.layers.inet import IP, DestIPField, UDP from scapy.layers.inet6 import DestIP6Field diff --git a/scapy/layers/dot11.py b/scapy/layers/dot11.py index df91e104..27e84dbc 100644 --- a/scapy/layers/dot11.py +++ b/scapy/layers/dot11.py @@ -8,11 +8,16 @@ Wireless LAN according to IEEE 802.11. """ import re,struct +from zlib import crc32 +from scapy.config import conf +from scapy.data import * from scapy.packet import * from scapy.fields import * +from scapy.ansmachine import * from scapy.plist import PacketList from scapy.layers.l2 import * +from scapy.layers.inet import IP, TCP try: @@ -441,11 +446,11 @@ iwconfig wlan0 mode managed p /= self.replace q.ID += 1 q.getlayer(TCP).flags="RA" - q.getlayer(TCP).seq+=len(replace) + q.getlayer(TCP).seq+=len(self.replace) return [p,q] def print_reply(self): - print p.sprintf("Sent %IP.src%:%IP.sport% > %IP.dst%:%TCP.dport%") + print self.sprintf("Sent %IP.src%:%IP.sport% > %IP.dst%:%TCP.dport%") def send_reply(self, reply): sendp(reply, iface=self.ifto, **self.optsend) diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index cf5cbbff..7f080acb 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -11,7 +11,9 @@ import os,time,struct,re,socket,new from select import select from collections import defaultdict -from scapy.utils import checksum +from scapy.utils import checksum,inet_aton,inet_ntoa +from scapy.base_classes import Gen +from scapy.data import * from scapy.layers.l2 import * from scapy.config import conf from scapy.fields import * @@ -20,6 +22,7 @@ from scapy.volatile import * from scapy.sendrecv import sr,sr1,srp1 from scapy.plist import PacketList,SndRcvList from scapy.automaton import Automaton,ATMT +from scapy.error import warning import scapy.as_resolvers diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index d64496cc..ec2c94a1 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -24,7 +24,9 @@ IPv6 (Internet Protocol v6). """ +import random import socket +import sys if not socket.has_ipv6: raise socket.error("can't use AF_INET6, IPv6 is disabled") if not hasattr(socket, "IPPROTO_IPV6"): @@ -35,8 +37,8 @@ if not hasattr(socket, "IPPROTO_IPIP"): socket.IPPROTO_IPIP = 4 from scapy.config import conf -from scapy.layers.l2 import * -from scapy.layers.inet import * +from scapy.base_classes import * +from scapy.data import * from scapy.fields import * from scapy.packet import * from scapy.volatile import * @@ -45,6 +47,10 @@ from scapy.as_resolvers import AS_resolver_riswhois from scapy.supersocket import SuperSocket,L3RawSocket from scapy.arch import * from scapy.utils6 import * +from scapy.layers.l2 import * +from scapy.layers.inet import * +from scapy.utils import inet_pton, inet_ntop, strxor +from scapy.error import warning ############################################################################# @@ -1649,7 +1655,7 @@ class ICMPv6NDOptMAP(_ICMPv6NDGuessPayload, Packet): # RFC 4140 IP6Field("addr", "::") ] -class IP6PrefixField(IP6Field): +class _IP6PrefixField(IP6Field): __slots__ = ["length_from"] def __init__(self, name, default): IP6Field.__init__(self, name, default) @@ -1696,7 +1702,7 @@ class ICMPv6NDOptRouteInfo(_ICMPv6NDGuessPayload, Packet): # RFC 4191 BitField("prf",0,2), BitField("res2",0,3), IntField("rtlifetime", 0xffffffff), - IP6PrefixField("prefix", None) ] + _IP6PrefixField("prefix", None) ] class ICMPv6NDOptRDNSS(_ICMPv6NDGuessPayload, Packet): # RFC 5006 name = "ICMPv6 Neighbor Discovery Option - Recursive DNS Server Option" @@ -1714,7 +1720,57 @@ class ICMPv6NDOptEFA(_ICMPv6NDGuessPayload, Packet): # RFC 5175 (prev. 5075) ByteField("len", 1), BitField("res", 0, 48) ] -from scapy.layers.dhcp6 import DomainNameListField +# As required in Sect 8. of RFC 3315, Domain Names must be encoded as +# described in section 3.1 of RFC 1035 +# XXX Label should be at most 63 octets in length : we do not enforce it +# Total length of domain should be 255 : we do not enforce it either +class DomainNameListField(StrLenField): + __slots__ = ["padded"] + islist = 1 + padded_unit = 8 + + def __init__(self, name, default, fld=None, length_from=None, padded=False): + self.padded = padded + StrLenField.__init__(self, name, default, fld, length_from) + + def i2len(self, pkt, x): + return len(self.i2m(pkt, x)) + + def m2i(self, pkt, x): + res = [] + while x: + # Get a name until \x00 is reached + cur = [] + while x and x[0] != '\x00': + l = ord(x[0]) + cur.append(x[1:l+1]) + x = x[l+1:] + if self.padded: + # Discard following \x00 in padded mode + if len(cur): + res.append(".".join(cur) + ".") + else: + # Store the current name + res.append(".".join(cur) + ".") + if x and x[0] == '\x00': + x = x[1:] + return res + + def i2m(self, pkt, x): + def conditionalTrailingDot(z): + if z and z[-1] == '\x00': + return z + return z+'\x00' + # Build the encode names + tmp = map(lambda y: map((lambda z: chr(len(z))+z), y.split('.')), x) + ret_string = "".join(map(lambda x: conditionalTrailingDot("".join(x)), tmp)) + + # In padded mode, add some \x00 bytes + if self.padded and not len(ret_string) % self.padded_unit == 0: + ret_string += "\x00" * (self.padded_unit - len(ret_string) % self.padded_unit) + + return ret_string + class ICMPv6NDOptDNSSL(_ICMPv6NDGuessPayload, Packet): # RFC 6106 name = "ICMPv6 Neighbor Discovery Option - DNS Search List Option" fields_desc = [ ByteField("type", 31), diff --git a/scapy/layers/isakmp.py b/scapy/layers/isakmp.py index 4d96a626..17e538dd 100644 --- a/scapy/layers/isakmp.py +++ b/scapy/layers/isakmp.py @@ -8,6 +8,7 @@ ISAKMP (Internet Security Association and Key Management Protocol). """ import struct +from scapy.config import conf from scapy.packet import * from scapy.fields import * from scapy.ansmachine import * diff --git a/scapy/layers/l2.py b/scapy/layers/l2.py index 5ddc803b..db479314 100644 --- a/scapy/layers/l2.py +++ b/scapy/layers/l2.py @@ -11,12 +11,14 @@ import os, struct, time, socket from scapy.base_classes import Net from scapy.config import conf +from scapy.data import * from scapy.packet import * from scapy.ansmachine import * from scapy.plist import SndRcvList from scapy.fields import * -from scapy.sendrecv import srp,srp1 +from scapy.sendrecv import * from scapy.arch import get_if_hwaddr +from scapy.utils import inet_ntoa, inet_aton diff --git a/scapy/layers/sctp.py b/scapy/layers/sctp.py index 49d44122..ff0b0946 100644 --- a/scapy/layers/sctp.py +++ b/scapy/layers/sctp.py @@ -10,6 +10,7 @@ SCTP (Stream Control Transmission Protocol). import struct +from scapy.config import conf from scapy.packet import * from scapy.fields import * from scapy.layers.inet import IP diff --git a/scapy/layers/snmp.py b/scapy/layers/snmp.py index 2c588250..37bcdfe1 100644 --- a/scapy/layers/snmp.py +++ b/scapy/layers/snmp.py @@ -7,9 +7,14 @@ SNMP (Simple Network Management Protocol). """ +from scapy.packet import * from scapy.asn1packet import * from scapy.asn1fields import * -from scapy.layers.inet import UDP +from scapy.asn1.asn1 import * +from scapy.asn1.ber import * +from scapy.sendrecv import sr1 +from scapy.volatile import * +from scapy.layers.inet import UDP, IP, ICMP ########## ## SNMP ## diff --git a/scapy/layers/tftp.py b/scapy/layers/tftp.py index 9a2aa0a5..4727108b 100644 --- a/scapy/layers/tftp.py +++ b/scapy/layers/tftp.py @@ -11,7 +11,7 @@ import os,random from scapy.packet import * from scapy.fields import * from scapy.automaton import * -from scapy.layers.inet import UDP +from scapy.layers.inet import UDP, IP diff --git a/scapy/layers/x509.py b/scapy/layers/x509.py index a5ca38cc..ee14bc43 100644 --- a/scapy/layers/x509.py +++ b/scapy/layers/x509.py @@ -8,9 +8,13 @@ X.509 certificates. """ +from scapy.asn1.asn1 import * +from scapy.asn1.ber import * from scapy.asn1packet import * from scapy.asn1fields import * +from scapy.packet import Packet from scapy.fields import PacketField +from scapy.volatile import * class ASN1P_OID(ASN1_Packet): ASN1_codec = ASN1_Codecs.BER diff --git a/scapy/main.py b/scapy/main.py index 63c615c1..4337cdd5 100644 --- a/scapy/main.py +++ b/scapy/main.py @@ -10,9 +10,13 @@ Main module for interactive startup. from __future__ import generators import os,sys import glob +import types +import gzip +import cPickle import __builtin__ -from error import * -import utils + +from scapy.error import * +from scapy import utils def _probe_config_file(cf): @@ -44,8 +48,8 @@ def _usage(): sys.exit(0) -from config import conf -from themes import DefaultTheme +from scapy.config import conf +from scapy.themes import DefaultTheme ###################### @@ -178,8 +182,8 @@ def scapy_write_history_file(readline): def interact(mydict=None,argv=None,mybanner=None,loglevel=20): global session - import code,sys,cPickle,os,getopt,re - from config import conf + import code,sys,os,getopt,re + from scapy.config import conf conf.interactive = True if loglevel is not None: conf.logLevel=loglevel @@ -220,6 +224,7 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20): object = eval(expr) except: object = eval(expr, session) + from scapy.packet import Packet, Packet_metaclass if isinstance(object, Packet) or isinstance(object, Packet_metaclass): words = filter(lambda x: x[0]!="_",dir(object)) words += [x.name for x in object.fields_desc] diff --git a/scapy/modules/nmap.py b/scapy/modules/nmap.py index 4ff1a56a..0eeafdbd 100644 --- a/scapy/modules/nmap.py +++ b/scapy/modules/nmap.py @@ -12,6 +12,9 @@ import os from scapy.data import KnowledgeBase from scapy.config import conf from scapy.arch import WINDOWS +from scapy.error import warning +from scapy.layers.inet import IP, TCP, UDP, ICMP, UDPerror, IPerror +from scapy.sendrecv import sr if WINDOWS: diff --git a/scapy/modules/p0f.py b/scapy/modules/p0f.py index 2585adb6..a93482d7 100644 --- a/scapy/modules/p0f.py +++ b/scapy/modules/p0f.py @@ -7,10 +7,19 @@ Clone of p0f passive OS fingerprinting """ +import time +import struct +import os +import socket +import random + from scapy.data import KnowledgeBase from scapy.config import conf from scapy.layers.inet import IP, TCP, TCPOptions -from scapy.packet import NoPayload +from scapy.packet import NoPayload, Packet +from scapy.error import warning, Scapy_Exception, log_runtime +from scapy.volatile import RandInt, RandByte, RandChoice, RandNum, RandShort, RandString +from scapy.sendrecv import sniff conf.p0f_base ="/etc/p0f/p0f.fp" conf.p0fa_base ="/etc/p0f/p0fa.fp" diff --git a/scapy/modules/queso.py b/scapy/modules/queso.py index ebc5486e..9c38f427 100644 --- a/scapy/modules/queso.py +++ b/scapy/modules/queso.py @@ -10,6 +10,9 @@ Clone of queso OS fingerprinting from scapy.data import KnowledgeBase from scapy.config import conf from scapy.layers.inet import IP,TCP +from scapy.error import warning +from scapy.volatile import RandInt +from scapy.sendrecv import sr #from conf.queso_base ="/etc/queso.conf" diff --git a/scapy/modules/voip.py b/scapy/modules/voip.py index de9ed1d3..52c7893d 100644 --- a/scapy/modules/voip.py +++ b/scapy/modules/voip.py @@ -94,6 +94,7 @@ def voip_play1(s1,list=None,**kargs): return ip=pkt.getlayer(IP) if s1 in [ip.src, ip.dst]: + from scapy.config import conf dsp.write(pkt.getlayer(conf.raw_layer).load[12:]) try: if list is None: @@ -137,6 +138,7 @@ def voip_play3(lst=None,**kargs): dsp,rd = os.popen2("sox -t .ul - -t ossdsp /dev/dsp") try: def play(pkt, dsp=dsp): + from scapy.config import conf if pkt and pkt.haslayer(UDP) and pkt.haslayer(conf.raw_layer): dsp.write(pkt.getlayer(RTP).load) if lst is None: diff --git a/scapy/packet.py b/scapy/packet.py index 611c373e..f3739c8f 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -10,16 +10,16 @@ Packet class. Binding mechanism. fuzz() method. import re import time,itertools import copy -from fields import StrField, ConditionalField, Emph, PacketListField, BitField, \ - MultiEnumField, EnumField, FlagsField -from themes import AnsiColorTheme -from config import conf -from base_classes import BasePacket, Gen, SetGen, Packet_metaclass -from volatile import VolatileValue -from utils import import_hexcap,tex_escape,colgen,get_temp_file -from error import Scapy_Exception,log_runtime import subprocess +from scapy.fields import StrField, ConditionalField, Emph, PacketListField, BitField, \ + MultiEnumField, EnumField, FlagsField +from scapy.config import conf +from scapy.base_classes import BasePacket, Gen, SetGen, Packet_metaclass +from scapy.volatile import VolatileValue +from scapy.utils import import_hexcap,tex_escape,colgen,get_temp_file +from scapy.error import Scapy_Exception,log_runtime + try: import pyx except ImportError: @@ -845,6 +845,7 @@ Creates an EPS file describing a packet. If filename is not provided a temporary """ if dump: + from scapy.themes import AnsiColorTheme ct = AnsiColorTheme() # No color for dump output else: ct = conf.color_theme diff --git a/scapy/pipetool.py b/scapy/pipetool.py index 7b85dd78..fb6f6179 100644 --- a/scapy/pipetool.py +++ b/scapy/pipetool.py @@ -7,15 +7,16 @@ from __future__ import with_statement -import scapy.utils -from scapy.config import conf import os,thread,select import subprocess import itertools import collections import time -from scapy.error import log_interactive,warning import Queue +import scapy.utils + +from scapy.error import log_interactive,warning +from scapy.config import conf class PipeEngine: pipes = {} @@ -262,6 +263,7 @@ class Source(Pipe): Pipe.__init__(self, name=name) self.is_exhausted = False def _read_message(self): + from scapy.automaton import Message return Message() def deliver(self): msg = self._read_message diff --git a/scapy/plist.py b/scapy/plist.py index 5e3fdea5..9c754f41 100644 --- a/scapy/plist.py +++ b/scapy/plist.py @@ -9,11 +9,11 @@ PacketList: holds several packets and allows to do operations on them. import os,subprocess -from config import conf -from base_classes import BasePacket,BasePacketList from collections import defaultdict -from utils import do_graph,hexdump,make_table,make_lined_table,make_tex_table,get_temp_file +from scapy.config import conf +from scapy.base_classes import BasePacket,BasePacketList +from scapy.utils import do_graph,hexdump,make_table,make_lined_table,make_tex_table,get_temp_file from scapy.arch import plt, MATPLOTLIB_INLINED, MATPLOTLIB_DEFAULT_PLOT_KARGS @@ -293,10 +293,10 @@ lfilter: truth function to apply to each packet to decide whether it will be dis prog: which graphviz program to use""" if getsrcdst is None: def getsrcdst(pkt): - if IP in pkt: - return (pkt[IP].src, pkt[IP].dst) - if ARP in pkt: - return (pkt[ARP].psrc, pkt[ARP].pdst) + if 'IP' in pkt: + return (pkt['IP'].src, pkt['IP'].dst) + if 'ARP' in pkt: + return (pkt['ARP'].psrc, pkt['ARP'].pdst) raise TypeError() conv = {} for p in self.res: @@ -546,10 +546,3 @@ class SndRcvList(PacketList): return elt[1] def _elt2sum(self, elt): return "%s ==> %s" % (elt[0].summary(),elt[1].summary()) - - - - - - - diff --git a/scapy/pton_ntop.py b/scapy/pton_ntop.py index 1bd88920..ce93b676 100644 --- a/scapy/pton_ntop.py +++ b/scapy/pton_ntop.py @@ -15,7 +15,7 @@ import socket,struct def inet_pton(af, addr): """Convert an IP address from text representation into binary form""" if af == socket.AF_INET: - return inet_aton(addr) + return socket.inet_aton(addr) elif af == socket.AF_INET6: # IPv6: The use of "::" indicates one or more groups of 16 bits of zeros. # We deal with this form of wildcard using a special marker. @@ -63,7 +63,7 @@ def inet_pton(af, addr): def inet_ntop(af, addr): """Convert an IP address from binary form into text represenation""" if af == socket.AF_INET: - return inet_ntoa(addr) + return socket.inet_ntoa(addr) elif af == socket.AF_INET6: # IPv6 addresses have 128bits (16 bytes) if len(addr) != 16: diff --git a/scapy/route.py b/scapy/route.py index 170de483..1e426a7a 100644 --- a/scapy/route.py +++ b/scapy/route.py @@ -8,10 +8,10 @@ Routing and handling of network interfaces. """ import socket -from arch import read_routes,get_if_addr,LOOPBACK_NAME -from utils import atol,ltoa,itom -from config import conf -from error import Scapy_Exception,warning +from scapy.arch import read_routes,get_if_addr,LOOPBACK_NAME +from scapy.utils import atol,ltoa,itom +from scapy.config import conf +from scapy.error import Scapy_Exception,warning ############################## ## Routing/Interfaces stuff ## diff --git a/scapy/route6.py b/scapy/route6.py index 341a7c3e..82c6f8f3 100644 --- a/scapy/route6.py +++ b/scapy/route6.py @@ -17,9 +17,11 @@ Routing and network interface handling for IPv6. ############################################################################# import socket -from config import conf -from utils6 import * -from arch import * +from scapy.config import conf +from scapy.utils6 import * +from scapy.arch import * +from scapy.pton_ntop import * +from scapy.error import warning, log_loading class Route6: diff --git a/scapy/scapypipes.py b/scapy/scapypipes.py index 94bd401a..9af8193e 100644 --- a/scapy/scapypipes.py +++ b/scapy/scapypipes.py @@ -3,8 +3,9 @@ ## Copyright (C) Philippe Biondi <phil@secdev.org> ## This program is published under a GPLv2 license -from pipetool import Source,Drain,Sink -from config import conf +from scapy.pipetool import Source,Drain,Sink +from scapy.config import conf +from scapy.utils import PcapReader, PcapWriter class SniffSource(Source): @@ -114,10 +115,12 @@ class UDPDrain(Drain): self.port = port def push(self, msg): + from scapy.layers.inet import IP, UDP if IP in msg and msg[IP].proto == 17 and UDP in msg: payload = msg[UDP].payload self._high_send(str(payload)) def high_push(self, msg): + from scapy.layers.inet import IP, UDP p = IP(dst=self.ip)/UDP(sport=1234,dport=self.port)/msg self._send(p) diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py index 29227409..474bcccd 100644 --- a/scapy/sendrecv.py +++ b/scapy/sendrecv.py @@ -11,15 +11,15 @@ import errno import cPickle,os,sys,time,subprocess import itertools from select import select -from data import * -import arch -from config import conf -from packet import Gen -from utils import warning,get_temp_file,PcapReader,wrpcap -import plist -from error import log_runtime,log_interactive -from base_classes import SetGen -from supersocket import StreamSocket +from scapy.data import * +from scapy import arch +from scapy.config import conf +from scapy.packet import Gen +from scapy.utils import warning,get_temp_file,PcapReader,wrpcap +from scapy import plist +from scapy.error import log_runtime,log_interactive +from scapy.base_classes import SetGen +from scapy.supersocket import StreamSocket ################# ## Debug class ## diff --git a/scapy/supersocket.py b/scapy/supersocket.py index 6e844197..3fd0fef5 100644 --- a/scapy/supersocket.py +++ b/scapy/supersocket.py @@ -8,8 +8,9 @@ SuperSocket. """ import socket,time -from config import conf -from data import * + +from scapy.config import conf +from scapy.data import * from scapy.error import warning, log_runtime class _SuperSocket_metaclass(type): @@ -47,14 +48,17 @@ class SuperSocket: if self.ins and self.ins.fileno() != -1: self.ins.close() def sr(self, *args, **kargs): + from scapy import sendrecv return sendrecv.sndrcv(self, *args, **kargs) def sr1(self, *args, **kargs): + from scapy import sendrecv a,b = sendrecv.sndrcv(self, *args, **kargs) if len(a) > 0: return a[0][1] else: return None def sniff(self, *args, **kargs): + from scapy import sendrecv return sendrecv.sniff(opened_socket=self, *args, **kargs) class L3RawSocket(SuperSocket): @@ -92,7 +96,7 @@ class L3RawSocket(SuperSocket): pkt = pkt.payload if pkt is not None: - from arch import get_last_packet_timestamp + from scapy.arch import get_last_packet_timestamp pkt.time = get_last_packet_timestamp(self.ins) return pkt def send(self, x): @@ -127,6 +131,7 @@ class StreamSocket(SimpleSocket): pad = pkt.getlayer(conf.padding_layer) if pad is not None and pad.underlayer is not None: del(pad.underlayer.payload) + from scapy.packet import NoPayload while pad is not None and not isinstance(pad, NoPayload): x -= len(pad.load) pad = pad.payload @@ -137,6 +142,3 @@ class StreamSocket(SimpleSocket): if conf.L3socket is None: conf.L3socket = L3RawSocket - -import arch -import sendrecv diff --git a/scapy/themes.py b/scapy/themes.py index 188fd547..a0529d70 100644 --- a/scapy/themes.py +++ b/scapy/themes.py @@ -264,6 +264,7 @@ class ColorPrompt: __prompt = ">>> " def __str__(self): try: + from scapy import config ct = config.conf.color_theme if isinstance(ct, AnsiColorTheme): ## ^A and ^B delimit invisible caracters for readline to count right @@ -272,6 +273,3 @@ class ColorPrompt: return ct.prompt(config.conf.prompt) except: return self.__prompt - - -import config diff --git a/scapy/tools/UTscapy.py b/scapy/tools/UTscapy.py index 7753e1a1..c6401468 100755 --- a/scapy/tools/UTscapy.py +++ b/scapy/tools/UTscapy.py @@ -38,7 +38,7 @@ class File: def get_local(self): return bz2.decompress(base64.decodestring(self.local)) def get_URL(self): - return URL + return self.URL def write(self, dir): if dir: dir += "/" diff --git a/scapy/utils.py b/scapy/utils.py index 21118561..c8daa522 100644 --- a/scapy/utils.py +++ b/scapy/utils.py @@ -17,10 +17,10 @@ import subprocess import warnings warnings.filterwarnings("ignore","tempnam",RuntimeWarning, __name__) -from config import conf -from data import MTU -from error import log_runtime,log_loading,log_interactive, Scapy_Exception -from base_classes import BasePacketList +from scapy.config import conf +from scapy.data import MTU +from scapy.error import log_runtime,log_loading,log_interactive, Scapy_Exception +from scapy.base_classes import BasePacketList WINDOWS=sys.platform.startswith("win32") @@ -215,9 +215,6 @@ def hexdiff(x,y): else: i += 16 - -crc32 = zlib.crc32 - if struct.pack("H",1) == "\x00\x01": # big endian def checksum(pkt): if len(pkt) % 2 == 1: @@ -592,7 +589,7 @@ class PcapReader_metaclass(type): i.__init__(filename, fdesc, magic) except Scapy_Exception: try: - self.f.seek(-4, 1) + i.f.seek(-4, 1) except: pass raise Scapy_Exception("Not a supported capture file") @@ -730,7 +727,7 @@ class PcapReader(RawPcapReader): return p def read_all(self,count=-1): res = RawPcapReader.read_all(self, count) - import plist + from scapy import plist return plist.PacketList(res,name = os.path.basename(self.filename)) def recv(self, size=MTU): return self.read_packet(size=size) @@ -829,7 +826,7 @@ class PcapNgReader(RawPcapNgReader): return p def read_all(self,count=-1): res = RawPcapNgReader.read_all(self, count) - import plist + from scapy import plist return plist.PacketList(res, name=os.path.basename(self.filename)) def recv(self, size=MTU): return self.read_packet() diff --git a/scapy/utils6.py b/scapy/utils6.py index 6a2ae83d..eb4ecb5a 100644 --- a/scapy/utils6.py +++ b/scapy/utils6.py @@ -9,10 +9,14 @@ """ Utility functions for IPv6. """ - -from config import conf -from data import * -from utils import * +import random +import socket +import struct + +from scapy.config import conf +from scapy.data import * +from scapy.utils import * +from scapy.pton_ntop import * def construct_source_candidate_set(addr, plen, laddr, loname): diff --git a/scapy/volatile.py b/scapy/volatile.py index a870b23c..f59e9ecf 100644 --- a/scapy/volatile.py +++ b/scapy/volatile.py @@ -8,8 +8,8 @@ Fields that hold random numbers. """ import random,time,math -from base_classes import Net -from utils import corrupt_bits,corrupt_bytes +from scapy.base_classes import Net +from scapy.utils import corrupt_bits,corrupt_bytes #################### ## Random numbers ## diff --git a/test/ipsec.uts b/test/ipsec.uts index 01f13571..bf13075a 100644 --- a/test/ipsec.uts +++ b/test/ipsec.uts @@ -8,6 +8,8 @@ ####################################### = IPv4 / ESP - Transport - AES-CBC - NULL +import socket + p = IP(src='1.1.1.1', dst='2.2.2.2') p /= TCP(sport=45012, dport=80) p /= Raw('testdata') diff --git a/test/regression.uts b/test/regression.uts index 849fb80c..ff454d71 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -46,7 +46,7 @@ routes6 = read_routes6() if len(routes6): iflist = get_if_list() - if iflist == [scapy.arch.LOOPBACK_NAME]: + if iflist == [LOOPBACK_NAME]: len(routes6) == 1 elif len(iflist) >= 2: len(routes6) >= 3 @@ -358,10 +358,12 @@ a = TestFLF() a.lst = [7,65539] ls(a) str(a) +import struct _ == struct.pack("!BII", 2,7,65539) = Disassemble ~ field +import struct TestFLF("\x00\x11\x12") assert(_.len == 0 and Raw in _ and _[Raw].load == "\x11\x12") TestFLF(struct.pack("!BIII",3,1234,2345,12345678)) @@ -900,6 +902,8 @@ assert( _ == "Saturn" ) = Automaton test io event from external fd ~ automaton +import os + class ATMT8(Automaton): @ATMT.state(initial=1) def BEGIN(self): @@ -1257,6 +1261,8 @@ in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff: ########### RFC 3041 related function ############################### = Test in6_getRandomizedIfaceId +import socket + res=True for _ in xrange(10): s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3') -- GitLab