Python scapy嗅探和解码直径

Python scapy嗅探和解码直径,python,decode,scapy,Python,Decode,Scapy,我正在尝试对Diameter消息执行scapy/python嗅探器,并解析Diameter部分以从Raw.load获取AVP。 在一些失败之后,我回到基本python/scapy脚本,如下所示: 从斯卡皮来的,都是进口货* def pkt_diam(pkt): raw = pkt.getlayer(Raw).load print raw # pkt.show() sniff(iface="eth0", filter="port 3868", store=0, prn=p

我正在尝试对Diameter消息执行scapy/python嗅探器,并解析Diameter部分以从Raw.load获取AVP。 在一些失败之后,我回到基本python/scapy脚本,如下所示: 从斯卡皮来的,都是进口货*

def pkt_diam(pkt):
    raw = pkt.getlayer(Raw).load
    print raw
    # pkt.show()

sniff(iface="eth0", filter="port 3868", store=0, prn=pkt_diam)
通过打印raw.load,我只收到了一些AVP,但非常不可读。如果我使用 pkt.show() 我收到了整个数据包、以太网、IP、TCP和原始部分,但原始加载几乎无法使用

###[ Raw ]###
        load      = '\x01\x00\x00\xec@\x00\x01/\x01\x00\x00\x00\x07K\x12\xca\x07K\x12\xca\x00\x00\x01\x07@\x00\x00 00000001;000001;61de2650\x00\x00\x01\x04@\x00\x00 \x00\x00\x01\n@\x00\x00\x0c\x00\x00(\xaf\x00\x00\x01\x02@\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x01\x15@\x00\x00\x0c\x00\x00\x00\x01\x00\x00\x01\x08@\x00\x00\x1dtest.a-server.org\x00\x00\x00\x00\x00\x01(@\x00\x00\x14a-server.org\x00\x00\x01)@\x00\x00 \x00\x00\x01\n@\x00\x00\x0c\x00\x00(\xaf\x00\x00\x01*@\x00\x00\x0c\x00\x00\x13\x89\x00\x00\x02t\x80\x00\x008\x00\x00(\xaf\x00\x00\x01\n@\x00\x00\x0c\x00\x00(\xaf\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x02v\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x05'
我需要一些帮助来解析和解码Diameter Raw.load消息。
Thx提前

最好的方法是,按照我刚才给你的链接,这是主要Scapy文档的一部分,详细介绍了如何构建自己的协议类型(标题)的分步指南

一旦正确定义了Diameter()头,解析Diameter数据包将变得轻而易举


关于Diameter数据包头,似乎是一个非常好的参考。

作为当前Scapy pull请求的一部分,number#109为Diameter层提供了支持(解析和生成)

下载最新的Scapy源代码和diameter.py文件,该文件应放在“贡献”目录中(此文件在当前的2.3.1 Scapy版本中无法完全使用)

Scapy非常有用

from scapy.all import *

packets = rdpcap('/path/to/rx.pcap')

def generatePacket(): 
 '''
   Generate a packet.
 '''
 IP()/TCP()/DiamG()

def dissectPacket():
 '''
   dissect a packet.
 '''
 packet[0][DiamG]
以上就是这个想法。您可以使用
打印(repr(packet[0][DiamG]))
查看结果。当然,为了检查数据包是否为直径数据包,您可能希望首先检查如下:

x = packet[0]
while x.payload:
    x = x.payload
    if x.name == 'Diameter' # it has diameter message.
        # dissect it like above.
以及如何集成和发送直径数据包,可以检查:

我自己定义直径标题就足以看到直径消息了?我曾尝试按照您的建议定义直径标题,但没有成功。我猜我做错了,我无法用“ls()”看到scapy shell中的直径。我应该发布一个新问题还是将我的定义粘贴到这里?@user1627588我认为最好更新您的问题,以表明您已经尝试自己实现标题。请务必显示定义Diameter header()的Python代码。如果执行pkt=Ether()/IP()/TCP()/Diameter(),然后执行pkt.show(),它是否显示与真实Diameter数据包类似的数据包?这应该只是一个问题,得到正确定义的领域,一个接一个。再次thx人。我当然要自己试试。我正在通过链接,你给我的第一个答案,我到目前为止取得了一些进展似乎对我来说。如果我有库存,我会用代码更新我的问题,当然看起来很有希望,你能显示样本输出吗(你的答案没有说你链接的补丁是否会提供比OP得到的更可读的输出)?正确。请记住从scapy.contrib.diameter import*加载\u contrib(“直径”)或
以导入直径模块。另外,在x中使用
DiamG
然后
x[DiamG]
比使用while循环更干净)