- Early WEP support

- voip_play() tweaks
- Added LEShortField for Dot11 SC field
This commit is contained in:
pbi 2004-12-01 16:13:28 +00:00
parent 87b2bf7841
commit f2ad034092
1 changed files with 74 additions and 26 deletions

100
scapy.py
View File

@ -21,6 +21,11 @@
#
# $Log: scapy.py,v $
# Revision 0.9.17.20 2004/12/01 17:13:28 pbi
# - Early WEP support
# - voip_play() tweaks
# - Added LEShortField for Dot11 SC field
#
# Revision 0.9.17.19 2004/10/18 13:42:50 pbi
# - HSRP early support
# - Cisco CSSP Skinny early support
@ -487,7 +492,7 @@
from __future__ import generators
RCSID="$Id: scapy.py,v 0.9.17.19 2004/10/18 13:42:50 pbi Exp $"
RCSID="$Id: scapy.py,v 0.9.17.20 2004/12/01 17:13:28 pbi Exp $"
VERSION = RCSID.split()[2]+"beta"
@ -654,6 +659,12 @@ try:
except ImportError:
DNET = 0
try:
from Crypto.Cipher import ARC4
except ImportError:
warning("Can't find Crypto python lib. Won't be able to decrypt WEP")
# Workarround bug 643005 : https://sourceforge.net/tracker/?func=detail&atid=105470&aid=643005&group_id=5470
try:
socket.inet_aton("255.255.255.255")
@ -1545,6 +1556,10 @@ class ShortField(Field):
def __init__(self, name, default):
Field.__init__(self, name, default, "H")
class LEShortField(Field):
def __init__(self, name, default):
Field.__init__(self, name, default, "@H")
class XShortField(ShortField):
def i2repr(self, pkt, x):
if x is None:
@ -2218,6 +2233,9 @@ class Packet(Gen):
def extract_padding(self, s):
return s,None
def post_dissect(self, s):
return s
def do_dissect(self, s):
flist = self.fields_desc[:]
flist.reverse()
@ -2225,6 +2243,9 @@ class Packet(Gen):
f = flist.pop()
s,fval = f.getfield(self, s)
self.fields[f] = fval
s = self.post_dissect(s)
payl,pad = self.extract_padding(s)
self.do_dissect_payload(payl)
if pad and conf.padding:
@ -3092,11 +3113,17 @@ class Dot11(Packet):
MACField("addr1", ETHER_ANY),
Dot11Addr2MACField("addr2", ETHER_ANY),
Dot11Addr3MACField("addr3", ETHER_ANY),
ShortField("SC", 0),
LEShortField("SC", 0),
Dot11Addr4MACField("addr4", ETHER_ANY)
]
def mysummary(self):
return self.sprintf("802.11 %Dot11.type% %Dot11.subtype% %Dot11.addr1%")
def guess_payload_class(self):
if self.FCfield & 0x40:
return Dot11WEP
else:
return Packet.guess_payload_class(self)
capability_list = [ "res8", "res9", "short-slot", "res11",
"res12", "DSSS-OFDM", "res14", "res15",
@ -3178,6 +3205,26 @@ class Dot11Deauth(Packet):
fields_desc = [ ShortEnumField("reason", 1, reason_code) ]
class Dot11WEP(Packet):
name = "802.11 WEP packet"
fields_desc = [ StrFixedLenField("iv", "", 3),
ByteField("key", 0),
StrField("wepdata",""),
IntField("icv",0) ]
def post_dissect(self, s):
self.icv, = struct.unpack("!I",self.wepdata[-4:])
self.wepdata=self.wepdata[:-4]
self.decrypt()
def decrypt(self):
if conf.wepkey:
c = ARC4.new(self.iv+conf.wepkey)
self.add_payload(LLC(c.decrypt(self.wepdata[:-4])))
class PrismHeader(Packet):
""" iwpriv wlan0 monitor 3 """
fields_desc = [ LEIntField("msgcode",68),
@ -5454,7 +5501,7 @@ for am in AM_classes:
## Testing stuff ##
###################
ss
def merge(x,y):
if len(x) > len(y):
@ -5468,21 +5515,21 @@ def merge(x,y):
# return "".join(map(str.__add__, x, y))
# FIFO="/tmp/conv1.%i.%%i" % os.getpid()
# FIFO1=FIFO % 1
# FIFO2=FIFO % 2
#
# os.mkfifo(FIFO1)
# os.mkfifo(FIFO2)
# os.system("strace -o /tmp/sss soxmix -t .ul %s -t .ul %s -t ossdsp /dev/dsp &" % (FIFO1,FIFO2))
#
# c1=open(FIFO1,"w", 4096)
# c2=open(FIFO2,"w", 4096)
# fcntl.fcntl(c1.fileno(),fcntl.F_SETFL, os.O_NONBLOCK)
# fcntl.fcntl(c2.fileno(),fcntl.F_SETFL, os.O_NONBLOCK)
def voip_play(s1,**kargs):
dsp,rd = os.popen2("sox -t .ul -c 2 - -t ossdsp /dev/dsp")
FIFO="/tmp/conv1.%i.%%i" % os.getpid()
FIFO1=FIFO % 1
FIFO2=FIFO % 2
os.mkfifo(FIFO1)
os.mkfifo(FIFO2)
os.system("strace -o /tmp/sss soxmix -t .ul %s -t .ul %s -t ossdsp /dev/dsp &" % (FIFO1,FIFO2))
c1=open(FIFO1,"w", 4096)
c2=open(FIFO2,"w", 4096)
fcntl.fcntl(c1.fileno(),fcntl.F_SETFL, os.O_NONBLOCK)
fcntl.fcntl(c2.fileno(),fcntl.F_SETFL, os.O_NONBLOCK)
# dsp,rd = os.popen2("sox -t .ul -c 2 - -t ossdsp /dev/dsp")
def play(pkt,last=[]):
if not pkt:
return
@ -5494,20 +5541,20 @@ def voip_play(s1,**kargs):
last.append(pkt)
return
load=last.pop()
x1 = load.load[12:]
# c1.write(load.load[12:])
# x1 = load.load[12:]
c1.write(load.load[12:])
if load.getlayer(IP).src == ip.src:
x2 = ""
# c2.write("\x00"*len(load.load[12:]))
# x2 = ""
c2.write("\x00"*len(load.load[12:]))
last.append(pkt)
else:
x2 = pkt.load[:12]
# c2.write(pkt.load[12:])
dsp.write(merge(x1,x2))
# x2 = pkt.load[:12]
c2.write(pkt.load[12:])
# dsp.write(merge(x1,x2))
sniff(store=0, prn=play, **kargs)
# os.unlink(FIFO1)
# os.unlink(FIFO2)
os.unlink(FIFO1)
os.unlink(FIFO2)
def IPID_count(lst, funcID=lambda x:x[1].id, funcpres=lambda x:x[1].summary()):
@ -5777,6 +5824,7 @@ route : holds the Scapy routing table and provides methods to manipulate it
except_filter = ""
debug_match = 0
route = Route()
wepkey = ""
conf=Conf()