原本有人分析过viber的聊天报文,是两个字节开头,而后加上标准rtp流的,不知道新的viber是不是依旧这样,粗略从流量上看是的,但是不靠谱啊,怎么办呢,写个工具,把前面两个字节的头剥了,看看后面的能不能解析成rtp之后播放。
语言选择:python3.6 已有环境 anaconda3
先下载
pip install scapy-python3
这里下载完之后用不了,错误信息大概就是不支持我这个版本的python吧,看了下换了个下载:
pip3 install kamene
成功了。而后进行读取后删除应用层数据前两个字节吧。
初始代码如下:
from kamene.all import *
with PcapReader('vibervoip.pcap') as pcap_reader:
writers = PcapWriter('test.pcap')
Raw = b'\x80'
for pkt in pcap_reader:
if 'UDP' in pkt:
if pkt.haslayer('Raw'): #读取应用层数据
Raw = bytes(pkt['Raw'])
Raw2 = Raw[2:] #分片的方式删除前两个字节
pkt['Raw'] = Raw2
writers.write(pkt)
writers.flush()
writers.close()
结果切出来的有问题,打开之后发现是由于单纯的修改了应用层长度,其他相应的也要修改,如图:
再把另外两个地方的数据改了试试。
from kamene.all import *
with PcapReader('vibervoip.pcap') as pcap_reader:
#writers = PcapWriter('test.pcap')
writers2 = PcapWriter('test2.pcap')
for pkt in pcap_reader:
if 'UDP' in pkt:
if pkt.haslayer('Raw'):
Raw = bytes(pkt['Raw'])
Raw2 = Raw[2:]
temp = b'\xb2\x04\x80'
Rawtemp = Raw[:3]
if Rawtemp == temp:
pkt['Raw'] = Raw2
UDPtemp = bytes(pkt['UDP'])
UDPtemp2 = bytearray(UDPtemp)
UDPtemp2[5] = UDPtemp2[5] - 2
UDPtemp3 = bytes(UDPtemp2)
pkt['UDP'] = UDPtemp3
Iptemp = bytes(pkt['IP'])
Iptemp2 = bytearray(Iptemp)
Iptemp2[3] = Iptemp2[3] - 2
Iptemp3 = bytes(Iptemp2)
pkt['IP'] = Iptemp3
writers2.write(pkt)
writers2.flush()
writers2.close()
这里用的时候遇到一个问题,应该是库写的不完善吧,修改原来的包的时候,只能从下层往上层的顺序修改,如 raw-> UDP -> IP的顺序,否则会找不到层。后面具体再分析为什么吧有时间的话。