Changeset 885:464de76db543
- Timestamp:
- 08/28/08 10:52:46 (4 months ago)
- Files:
-
- scapy/arch/__init__.py (modified) (3 diffs)
- scapy/arch/linux.py (modified) (3 diffs)
- scapy/arch/pcapdnet.py (added)
- scapy/arch/unix.py (modified) (3 diffs)
- scapy/config.py (modified) (2 diffs)
- scapy/main.py (modified) (1 diff)
- scapy/supersocket.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
scapy/arch/__init__.py
r884 r885 8 8 from fcntl import ioctl 9 9 from scapy.error import * 10 import scapy.config 10 11 11 12 try: … … 72 73 if LINUX: 73 74 from linux import * 75 if scapy.config.conf.use_pcap or scapy.config.conf.use_dnet: 76 from pcapdnet import * 74 77 elif OPENBSD or FREEBSD or NETBSD or DARWIN: 75 78 from bsd import * … … 77 80 from solaris import * 78 81 82 if scapy.config.conf.iface is None: 83 scapy.config.conf.iface = LOOPBACK_NAME 79 84 80 import scapy.config81 scapy.config.conf.iface = get_working_if()scapy/arch/linux.py
r884 r885 9 9 from fcntl import ioctl 10 10 import scapy.utils 11 from scapy.config import conf 12 from scapy.data import * 13 from scapy.supersocket import SuperSocket 14 11 15 12 16 … … 57 61 58 62 59 DNET=PCAP=060 63 LOOPBACK_NAME="lo" 61 64 … … 193 196 194 197 195 198 def _flush_fd(fd): 199 if type(fd) is not int: 200 fd = fd.fileno() 201 while 1: 202 r,w,e = select([fd],[],[],0) 203 if r: 204 os.read(fd,MTU) 205 else: 206 break 207 208 209 210 211 212 class L3PacketSocket(SuperSocket): 213 def __init__(self, type = ETH_P_ALL, filter=None, promisc=None, iface=None, nofilter=0): 214 self.type = type 215 self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) 216 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0) 217 _flush_fd(self.ins) 218 if iface: 219 self.ins.bind((iface, type)) 220 if not nofilter: 221 if conf.except_filter: 222 if filter: 223 filter = "(%s) and not (%s)" % (filter, conf.except_filter) 224 else: 225 filter = "not (%s)" % conf.except_filter 226 if filter is not None: 227 arch.attach_filter(self.ins, filter) 228 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) 229 self.outs = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) 230 self.outs.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2**30) 231 if promisc is None: 232 promisc = conf.promisc 233 self.promisc = promisc 234 if self.promisc: 235 if iface is None: 236 self.iff = arch.get_if_list() 237 else: 238 if iface.__class__ is list: 239 self.iff = iface 240 else: 241 self.iff = [iface] 242 for i in self.iff: 243 arch.set_promisc(self.ins, i) 244 def close(self): 245 if self.closed: 246 return 247 self.closed=1 248 if self.promisc: 249 for i in self.iff: 250 arch.set_promisc(self.ins, i, 0) 251 SuperSocket.close(self) 252 def recv(self, x): 253 pkt, sa_ll = self.ins.recvfrom(x) 254 if sa_ll[2] == socket.PACKET_OUTGOING: 255 return None 256 if sa_ll[3] in conf.l2types: 257 cls = conf.l2types[sa_ll[3]] 258 lvl = 2 259 elif sa_ll[1] in conf.l3types: 260 cls = conf.l3types[sa_ll[1]] 261 lvl = 3 262 else: 263 warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using Ethernet" % (sa_ll[0],sa_ll[1],sa_ll[3])) 264 cls = Ether 265 lvl = 2 266 267 try: 268 pkt = cls(pkt) 269 except KeyboardInterrupt: 270 raise 271 except: 272 if conf.debug_dissector: 273 raise 274 pkt = Raw(pkt) 275 if lvl == 2: 276 pkt = pkt.payload 277 278 if pkt is not None: 279 pkt.time = arch.get_last_packet_timestamp(self.ins) 280 return pkt 281 282 def send(self, x): 283 iff,a,gw = x.route() 284 if iff is None: 285 iff = conf.iface 286 sdto = (iff, self.type) 287 self.outs.bind(sdto) 288 sn = self.outs.getsockname() 289 ll = lambda x:x 290 if sn[3] in (ARPHDR_PPP,ARPHDR_TUN): 291 sdto = (iff, ETH_P_IP) 292 if sn[3] in conf.l2types: 293 ll = lambda x:conf.l2types[sn[3]]()/x 294 try: 295 sx = str(ll(x)) 296 x.sent_time = time.time() 297 self.outs.sendto(sx, sdto) 298 except socket.error,msg: 299 x.sent_time = time.time() # bad approximation 300 if conf.auto_fragment and msg[0] == 90: 301 for p in fragment(x): 302 self.outs.sendto(str(ll(p)), sdto) 303 else: 304 raise 305 306 307 308 309 class L2Socket(SuperSocket): 310 def __init__(self, iface = None, type = ETH_P_ALL, filter=None, nofilter=0): 311 if iface is None: 312 iface = conf.iface 313 self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) 314 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0) 315 _flush_fd(self.ins) 316 if not nofilter: 317 if conf.except_filter: 318 if filter: 319 filter = "(%s) and not (%s)" % (filter, conf.except_filter) 320 else: 321 filter = "not (%s)" % conf.except_filter 322 if filter is not None: 323 arch.attach_filter(self.ins, filter) 324 self.ins.bind((iface, type)) 325 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) 326 self.outs = self.ins 327 self.outs.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2**30) 328 sa_ll = self.outs.getsockname() 329 if sa_ll[3] in conf.l2types: 330 self.LL = conf.l2types[sa_ll[3]] 331 elif sa_ll[1] in conf.l3types: 332 self.LL = conf.l3types[sa_ll[1]] 333 else: 334 warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using Ethernet" % (sa_ll[0],sa_ll[1],sa_ll[3])) 335 self.LL = Ether 336 337 def recv(self, x): 338 pkt, sa_ll = self.ins.recvfrom(x) 339 if sa_ll[2] == socket.PACKET_OUTGOING: 340 return None 341 try: 342 q = self.LL(pkt) 343 except KeyboardInterrupt: 344 raise 345 except: 346 if conf.debug_dissector: 347 raise 348 q = Raw(pkt) 349 q.time = get_last_packet_timestamp(self.ins) 350 return q 351 352 353 class L2ListenSocket(SuperSocket): 354 def __init__(self, iface = None, type = ETH_P_ALL, promisc=None, filter=None, nofilter=0): 355 self.type = type 356 self.outs = None 357 self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) 358 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0) 359 _flush_fd(self.ins) 360 if iface is not None: 361 self.ins.bind((iface, type)) 362 if not nofilter: 363 if conf.except_filter: 364 if filter: 365 filter = "(%s) and not (%s)" % (filter, conf.except_filter) 366 else: 367 filter = "not (%s)" % conf.except_filter 368 if filter is not None: 369 arch.attach_filter(self.ins, filter) 370 if promisc is None: 371 promisc = conf.sniff_promisc 372 self.promisc = promisc 373 if iface is None: 374 self.iff = arch.get_if_list() 375 else: 376 if iface.__class__ is list: 377 self.iff = iface 378 else: 379 self.iff = [iface] 380 if self.promisc: 381 for i in self.iff: 382 arch.set_promisc(self.ins, i) 383 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) 384 def close(self): 385 if self.promisc: 386 for i in self.iff: 387 arch.set_promisc(self.ins, i, 0) 388 SuperSocket.close(self) 389 390 def recv(self, x): 391 pkt, sa_ll = self.ins.recvfrom(x) 392 if sa_ll[3] in conf.l2types : 393 cls = conf.l2types[sa_ll[3]] 394 elif sa_ll[1] in conf.l3types: 395 cls = conf.l3types[sa_ll[1]] 396 else: 397 warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using Ethernet" % (sa_ll[0],sa_ll[1],sa_ll[3])) 398 cls = Ether 399 400 try: 401 pkt = cls(pkt) 402 except KeyboardInterrupt: 403 raise 404 except: 405 if conf.debug_dissector: 406 raise 407 pkt = Raw(pkt) 408 pkt.time = get_last_packet_timestamp(self.ins) 409 return pkt 410 411 def send(self, x): 412 raise Scapy_Exception("Can't send anything with L2ListenSocket") 413 414 415 conf.L3socket = L3PacketSocket 416 conf.L2socket = L2Socket 417 conf.L2listen = L2ListenSocket 418 419 conf.iface = get_working_if() scapy/arch/unix.py
r884 r885 7 7 import sys,os,struct,socket,time 8 8 from fcntl import ioctl 9 import scapy.config 9 10 import scapy.utils 10 11 import scapy.arch 11 12 12 DNET=PCAP=1 13 scapy.config.conf.use_pcap = 1 14 scapy.config.conf.use_dnet = 1 15 from pcapdnet import * 13 16 14 17 15 try:16 import pcap17 PCAP = 118 except ImportError:19 if __name__ == "__main__":20 log_loading.error("did not find pcap module")21 raise SystemExit22 else:23 raise24 25 try:26 import dnet27 DNET = 128 except ImportError:29 if __name__ == "__main__":30 log_loading.error("did not find dnet module")31 raise SystemExit32 else:33 raise34 35 36 def get_if_raw_hwaddr(iff):37 if iff[:2] == scapy.arch.LOOPBACK_NAME:38 return (772, '\x00'*6)39 try:40 l = dnet.intf().get(iff)41 l = l["link_addr"]42 except:43 raise Scapy_Exception("Error in attempting to get hw address for interface [%s]" % iff)44 return l.type,l.data45 def get_if_raw_addr(ifname):46 i = dnet.intf()47 return i.get(ifname)["addr"].data48 49 def get_if_list():50 # remove 'any' interface51 return map(lambda x:x[0],filter(lambda x:x[1] is None,pcap.findalldevs()))52 def get_working_if():53 try:54 return pcap.lookupdev()55 except Exception:56 return scapy.arch.LOOPBACK_NAME57 58 def attach_filter(s, filter):59 warning("attach_filter() should not be called in PCAP mode")60 def set_promisc(s,iff,val=1):61 warning("set_promisc() should not be called in DNET/PCAP mode")62 18 63 19 … … 67 23 ################## 68 24 69 def new_read_routes():70 71 rtlst = []72 def addrt(rt,lst):73 dst,gw = rt74 lst.append(rt)75 76 r = dnet.route()77 print r.loop(addrt, rtlst)78 return rtlst79 25 80 26 def read_routes(): … … 132 78 return routes 133 79 134 def read_interfaces():135 i = dnet.intf()136 ifflist = {}137 def addif(iff,lst):138 if not iff.has_key("addr"):139 return140 if not iff.has_key("link_addr"):141 return142 rawip = iff["addr"].data143 ip = inet_ntoa(rawip)144 rawll = iff["link_addr"].data145 ll = scapy.arch.str2mac(rawll)146 lst[iff["name"]] = (rawll,ll,rawip,ip)147 i.loop(addif, ifflist)148 return ifflist149 80 150 81 scapy/config.py
r884 r885 224 224 """ 225 225 version = "2.0.0.5 beta" 226 session = "" 226 session = "" 227 interactive = False 227 228 stealth = "not implemented" 228 iface = "none"229 iface = None 229 230 layers = LayersList() 230 231 commands = CommandsList() … … 256 257 resolve = Resolve() 257 258 noenum = Resolve() 259 use_pcap = False 260 use_dnet = False 258 261 ethertypes = ETHER_TYPES 259 262 protocols = IP_PROTOS scapy/main.py
r862 r885 86 86 import code,sys,cPickle,os,imp,getopt,logging,re 87 87 from config import conf 88 88 conf.interactive = True 89 89 if loglevel is not None: 90 90 conf.logLevel=loglevel scapy/supersocket.py
r884 r885 7 7 from select import select 8 8 from packet import Raw 9 from config import conf 9 10 from data import * 10 from config import conf11 import arch12 11 13 # From BSD net/bpf.h14 #BIOCIMMEDIATE=0x8004427015 BIOCIMMEDIATE=-214720449616 17 18 def flush_fd(fd):19 if type(fd) is not int:20 fd = fd.fileno()21 while 1:22 r,w,e = select([fd],[],[],0)23 if r:24 os.read(fd,MTU)25 else:26 break27 12 28 13 class SuperSocket: … … 69 54 except socket.error,msg: 70 55 log_runtime.error(msg) 71 72 73 74 class L3PacketSocket(SuperSocket):75 def __init__(self, type = ETH_P_ALL, filter=None, promisc=None, iface=None, nofilter=0):76 self.type = type77 self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))78 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0)79 flush_fd(self.ins)80 if iface:81 self.ins.bind((iface, type))82 if not nofilter:83 if conf.except_filter:84 if filter:85 filter = "(%s) and not (%s)" % (filter, conf.except_filter)86 else:87 filter = "not (%s)" % conf.except_filter88 if filter is not None:89 arch.attach_filter(self.ins, filter)90 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30)91 self.outs = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))92 self.outs.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2**30)93 if promisc is None:94 promisc = conf.promisc95 self.promisc = promisc96 if self.promisc:97 if iface is None:98 self.iff = arch.get_if_list()99 else:100 if iface.__class__ is list:101 self.iff = iface102 else:103 self.iff = [iface]104 for i in self.iff:105 arch.set_promisc(self.ins, i)106 def close(self):107 if self.closed:108 return109 self.closed=1110 if self.promisc:111 for i in self.iff:112 arch.set_promisc(self.ins, i, 0)113 SuperSocket.close(self)114 def recv(self, x):115 pkt, sa_ll = self.ins.recvfrom(x)116 if sa_ll[2] == socket.PACKET_OUTGOING:117 return None118 if sa_ll[3] in conf.l2types:119 cls = conf.l2types[sa_ll[3]]120 lvl = 2121 elif sa_ll[1] in conf.l3types:122 cls = conf.l3types[sa_ll[1]]123 lvl = 3124 else:125 warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using Ethernet" % (sa_ll[0],sa_ll[1],sa_ll[3]))126 cls = Ether127 lvl = 2128 129 try:130 pkt = cls(pkt)131 except KeyboardInterrupt:132 raise133 except:134 if conf.debug_dissector:135 raise136 pkt = Raw(pkt)137 if lvl == 2:138 pkt = pkt.payload139 140 if pkt is not None:141 pkt.time = arch.get_last_packet_timestamp(self.ins)142 return pkt143 144 def send(self, x):145 iff,a,gw = x.route()146 if iff is None:147 iff = conf.iface148 sdto = (iff, self.type)149 self.outs.bind(sdto)150 sn = self.outs.getsockname()151 ll = lambda x:x152 if sn[3] in (ARPHDR_PPP,ARPHDR_TUN):153 sdto = (iff, ETH_P_IP)154 if sn[3] in conf.l2types:155 ll = lambda x:conf.l2types[sn[3]]()/x156 try:157 sx = str(ll(x))158 x.sent_time = time.time()159 self.outs.sendto(sx, sdto)160 except socket.error,msg:161 x.sent_time = time.time() # bad approximation162 if conf.auto_fragment and msg[0] == 90:163 for p in fragment(x):164 self.outs.sendto(str(ll(p)), sdto)165 else:166 raise167 168 169 170 171 class L2Socket(SuperSocket):172 def __init__(self, iface = None, type = ETH_P_ALL, filter=None, nofilter=0):173 if iface is None:174 iface = conf.iface175 self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))176 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0)177 flush_fd(self.ins)178 if not nofilter:179 if conf.except_filter:180 if filter:181 filter = "(%s) and not (%s)" % (filter, conf.except_filter)182 else:183 filter = "not (%s)" % conf.except_filter184 if filter is not None:185 arch.attach_filter(self.ins, filter)186 self.ins.bind((iface, type))187 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30)188 self.outs = self.ins189 self.outs.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2**30)190 sa_ll = self.outs.getsockname()191 if sa_ll[3] in conf.l2types:192 self.LL = conf.l2types[sa_ll[3]]193 elif sa_ll[1] in conf.l3types:194 self.LL = conf.l3types[sa_ll[1]]195 else:196 warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using Ethernet" % (sa_ll[0],sa_ll[1],sa_ll[3]))197 self.LL = Ether198 199 def recv(self, x):200 pkt, sa_ll = self.ins.recvfrom(x)201 if sa_ll[2] == socket.PACKET_OUTGOING:202 return None203 try:204 q = self.LL(pkt)205 except KeyboardInterrupt:206 raise207 except:208 if conf.debug_dissector:209 raise210 q = Raw(pkt)211 q.time = get_last_packet_timestamp(self.ins)212 return q213 214 215 class L2ListenSocket(SuperSocket):216 def __init__(self, iface = None, type = ETH_P_ALL, promisc=None, filter=None, nofilter=0):217 self.type = type218 self.outs = None219 self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))220 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0)221 flush_fd(self.ins)222 if iface is not None:223 self.ins.bind((iface, type))224 if not nofilter:225 if conf.except_filter:226 if filter:227 filter = "(%s) and not (%s)" % (filter, conf.except_filter)228 else:229 filter = "not (%s)" % conf.except_filter230 if filter is not None:231 arch.attach_filter(self.ins, filter)232 if promisc is None:233 promisc = conf.sniff_promisc234 self.promisc = promisc235 if iface is None:236 self.iff = arch.get_if_list()237 else:238 if iface.__class__ is list:239 self.iff = iface240 else:241 self.iff = [iface]242 if self.promisc:243 for i in self.iff:244 arch.set_promisc(self.ins, i)245 self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30)246 def close(self):247 if self.promisc:248 for i in self.iff:249 arch.set_promisc(self.ins, i, 0)250 SuperSocket.close(self)251 252 def recv(self, x):253 pkt, sa_ll = self.ins.recvfrom(x)254 if sa_ll[3] in conf.l2types :255 cls = conf.l2types[sa_ll[3]]256 elif sa_ll[1] in conf.l3types:257 cls = conf.l3types[sa_ll[1]]258 else:259 warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using Ethernet" % (sa_ll[0],sa_ll[1],sa_ll[3]))260 cls = Ether261 262 try:263 pkt = cls(pkt)264 except KeyboardInterrupt:265 raise266 except:267 if conf.debug_dissector:268 raise269 pkt = Raw(pkt)270 pkt.time = get_last_packet_timestamp(self.ins)271 return pkt272 273 def send(self, x):274 raise Scapy_Exception("Can't send anything with L2ListenSocket")275 276 277 278 class L3dnetSocket(SuperSocket):279 def __init__(self, type = ETH_P_ALL, filter=None, promisc=None, iface=None, nofilter=0):280 self.iflist = {}281 self.ins = pcap.pcapObject()282 if iface is None:283 iface = conf.iface284 self.iface = iface285 self.ins.open_live(iface, 1600, 0, 100)286 try:287 ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1))288 except:289 pass290 if nofilter:291 if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap292 filter = "ether proto %i" % type293 else:294 filter = None295 else:296 if conf.except_filter:297 if filter:298 filter = "(%s) and not (%s)" % (filter, conf.except_filter)299 else:300 filter = "not (%s)" % conf.except_filter301 if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap302 if filter:303 filter = "(ether proto %i) and (%s)" % (type,filter)304 else:305 filter = "ether proto %i" % type306 if filter:307 self.ins.setfilter(filter, 0, 0)308 def send(self, x):309 iff,a,gw = x.route()310 if iff is None:311 iff = conf.iface312 ifs = self.iflist.get(iff)313 if ifs is None:314 self.iflist[iff] = ifs = dnet.eth(iff)315 sx = str(Ether()/x)316 x.sent_time = time.time()317 ifs.send(sx)318 def recv(self,x=MTU):319 ll = self.ins.datalink()320 if ll in conf.l2types:321 cls = conf.l2types[ll]322 else:323 warning("Unable to guess datalink type (interface=%s linktype=%i). Using Ethernet" % (self.iface, ll))324 cls = Ether325 326 pkt = self.ins.next()327 if pkt is not None:328 l,pkt,ts = pkt329 if pkt is None:330 return331 332 try:333 pkt = cls(pkt)334 except KeyboardInterrupt:335 raise336 except:337 if conf.debug_dissector:338 raise339 pkt = Raw(pkt)340 pkt.time = ts341 return pkt.payload342 343 def nonblock_recv(self):344 self.ins.setnonblock(1)345 p = self.recv()346 self.ins.setnonblock(0)347 return p348 349 def close(self):350 if hasattr(self, "ins"):351 del(self.ins)352 if hasattr(self, "outs"):353 del(self.outs)354 355 class L2dnetSocket(SuperSocket):356 def __init__(self, iface = None, type = ETH_P_ALL, filter=None, nofilter=0):357 if iface is None:358 iface = conf.iface359 self.iface = iface360 self.ins = pcap.pcapObject()361 self.ins.open_live(iface, 1600, 0, 100)362 try:363 ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1))364 except:365 pass366 if nofilter:367 if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap368 filter = "ether proto %i" % type369 else:370 filter = None371 else:372 if conf.except_filter:373 if filter:374 filter = "(%s) and not (%s)" % (filter, conf.except_filter)375 else:376 filter = "not (%s)" % conf.except_filter377 if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap378 if filter:379 filter = "(ether proto %i) and (%s)" % (type,filter)380 else:381 filter = "ether proto %i" % type382 if filter:383 self.ins.setfilter(filter, 0, 0)384 self.outs = dnet.eth(iface)385 def recv(self,x):386 ll = self.ins.datalink()387 if ll in conf.l2types:388 cls = conf.l2types[ll]389 else:390 warning("Unable to guess datalink type (interface=%s linktype=%i). Using Ethernet" % (self.iface, ll))391 cls = Ether392 393 pkt = self.ins.next()394 if pkt is not None:395 l,pkt,ts = pkt396 if pkt is None:397 return398 399 try:400 pkt = cls(pkt)401 except KeyboardInterrupt:402 raise403 except:404 if conf.debug_dissector:405 raise406 pkt = Raw(pkt)407 pkt.time = ts408 return pkt409 410 def nonblock_recv(self):411 self.ins.setnonblock(1)412 p = self.recv(MTU)413 self.ins.setnonblock(0)414 return p415 416 def close(self):417 if hasattr(self, "ins"):418 del(self.ins)419 if hasattr(self, "outs"):420 del(self.outs)421 422 423 424 425 426 class L2pcapListenSocket(SuperSocket):427 def __init__(self, iface = None, type = ETH_P_ALL, promisc=None, filter=None):428 self.type = type429 self.outs = None430 self.ins = pcap.pcapObject()431 self.iface = iface432 if iface is None:433 iface = conf.iface434 if promisc is None:435 promisc = conf.sniff_promisc436 self.promisc = promisc437 self.ins.open_live(iface, 1600, self.promisc, 100)438 try:439 ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1))440 except:441 pass442 if type == ETH_P_ALL: # Do not apply any filter if Ethernet type is given443 if conf.except_filter:444 if filter:445 filter = "(%s) and not (%s)" % (filter, conf.except_filter)446 else:447 filter = "not (%s)" % conf.except_filter448 if filter:449 self.ins.setfilter(filter, 0, 0)450 451 def close(self):452 del(self.ins)453 454 def recv(self, x):455 ll = self.ins.datalink()456 if ll in conf.l2types:457 cls = conf.l2types[ll]458 else:459 warning("Unable to guess datalink type (interface=%s linktype=%i). Using Ethernet" % (self.iface, ll))460 cls = Ether461 462 pkt = None463 while pkt is None:464 pkt = self.ins.next()465 if pkt is not None:466 l,pkt,ts = pkt467 468 try:469 pkt = cls(pkt)470 except KeyboardInterrupt:471 raise472 except:473 if conf.debug_dissector:474 raise475 pkt = Raw(pkt)476 pkt.time = ts477 return pkt478 479 def send(self, x):480 raise Scapy_Exception("Can't send anything with L2pcapListenSocket")481 482 56 483 57 class SimpleSocket(SuperSocket): … … 508 82 509 83 510 conf.L3socket = L3PacketSocket511 conf.L2socket = L2Socket512 conf.L2listen = L2ListenSocket513 84 514 if arch.PCAP: 515 conf.L2listen=L2pcapListenSocket 516 if arch.DNET: 517 conf.L3socket=L3dnetSocket 518 conf.L2socket=L2dnetSocket 519 85 if conf.L3socket is None: 86 conf.L3socket = L3RawSocket