/scapy/modules/voip.py
https://github.com/levigross/Scapy · Python · 150 lines · 111 code · 20 blank · 19 comment · 37 complexity · f3df0d1d5986041b39e1c4d2b7b542fa MD5 · raw file
- ## 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
- """
- VoIP (Voice over IP) related functions
- """
- import os
- ###################
- ## Testing stuff ##
- ###################
- from fcntl import fcntl
- from scapy.sendrecv import sniff
- from scapy.packet import Raw
- from scapy.layers.inet import IP,UDP
- from scapy.layers.rtp import RTP
- from scapy.utils import get_temp_file
- def merge(x,y,sample_size=2):
- if len(x) > len(y):
- y += "\x00"*(len(x)-len(y))
- elif len(x) < len(y):
- x += "\x00"*(len(y)-len(x))
- m = ""
- ss=sample_size
- for i in range(len(x)/ss):
- m += x[ss*i:ss*(i+1)]+y[ss*i:ss*(i+1)]
- return m
- # return "".join(map(str.__add__, x, y))
- def voip_play(s1,list=None,**kargs):
- FIFO=get_temp_file()
- FIFO1=FIFO % 1
- FIFO2=FIFO % 2
-
- os.mkfifo(FIFO1)
- os.mkfifo(FIFO2)
- try:
- os.system("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
- if not pkt.haslayer(UDP):
- return
- ip=pkt.getlayer(IP)
- if s1 in [ip.src, ip.dst]:
- if not last:
- last.append(pkt)
- return
- load=last.pop()
- # x1 = load.load[12:]
- c1.write(load.load[12:])
- if load.getlayer(IP).src == ip.src:
- # 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))
-
- if list is None:
- sniff(store=0, prn=play, **kargs)
- else:
- for p in list:
- play(p)
- finally:
- os.unlink(FIFO1)
- os.unlink(FIFO2)
- def voip_play1(s1,list=None,**kargs):
-
- dsp,rd = os.popen2("sox -t .ul - -t ossdsp /dev/dsp")
- def play(pkt):
- if not pkt:
- return
- if not pkt.haslayer(UDP):
- return
- ip=pkt.getlayer(IP)
- if s1 in [ip.src, ip.dst]:
- dsp.write(pkt.getlayer(Raw).load[12:])
- try:
- if list is None:
- sniff(store=0, prn=play, **kargs)
- else:
- for p in list:
- play(p)
- finally:
- dsp.close()
- rd.close()
- def voip_play2(s1,**kargs):
- dsp,rd = os.popen2("sox -t .ul -c 2 - -t ossdsp /dev/dsp")
- def play(pkt,last=[]):
- if not pkt:
- return
- if not pkt.haslayer(UDP):
- return
- ip=pkt.getlayer(IP)
- if s1 in [ip.src, ip.dst]:
- if not last:
- last.append(pkt)
- return
- load=last.pop()
- x1 = load.load[12:]
- # c1.write(load.load[12:])
- if load.getlayer(IP).src == ip.src:
- 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))
-
- sniff(store=0, prn=play, **kargs)
- def voip_play3(lst=None,**kargs):
- dsp,rd = os.popen2("sox -t .ul - -t ossdsp /dev/dsp")
- try:
- def play(pkt, dsp=dsp):
- if pkt and pkt.haslayer(UDP) and pkt.haslayer(Raw):
- dsp.write(pkt.getlayer(RTP).load)
- if lst is None:
- sniff(store=0, prn=play, **kargs)
- else:
- for p in lst:
- play(p)
- finally:
- try:
- dsp.close()
- rd.close()
- except:
- pass