Python:scapy中的有效负载到底是什么?

Python:scapy中的有效负载到底是什么?,python,frame,scapy,Python,Frame,Scapy,我试图理解一个分析信标帧的Python脚本。但我被一种叫做有效载荷的东西困住了。查看Python文档并进行研究对我没有帮助。我发现有效载荷是帧携带的数据 def insert_ap(pkt): ## Done in the lfilter param # if Dot11Beacon not in pkt and Dot11ProbeResp not in pkt: # return bssid = pkt[Dot11].addr3 if bssi

我试图理解一个分析信标帧的Python脚本。但我被一种叫做有效载荷的东西困住了。查看Python文档并进行研究对我没有帮助。我发现有效载荷是帧携带的数据

def insert_ap(pkt):
    ## Done in the lfilter param
    # if Dot11Beacon not in pkt and Dot11ProbeResp not in pkt:
    #     return
    bssid = pkt[Dot11].addr3
    if bssid in aps:
        return
    p = pkt[Dot11Elt]
    cap = pkt.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}"
                      "{Dot11ProbeResp:%Dot11ProbeResp.cap%}").split('+')
    ssid, channel = None, None
    crypto = set()
    while isinstance(p, Dot11Elt):
        if p.ID == 0:
            ssid = p.info
        elif p.ID == 3:
            channel = ord(p.info)
        elif p.ID == 48:
            crypto.add("WPA2")
        elif p.ID == 221 and p.info.startswith('\x00P\xf2\x01\x01\x00'):
            crypto.add("WPA")
        p = p.payload # HERE IT IS
    if not crypto:
        if 'privacy' in cap:
            crypto.add("WEP")
        else:
            crypto.add("OPN")
    print "NEW AP: %r [%s], channed %d, %s" % (ssid, bssid, channel,
                                               ' / '.join(crypto))
    aps[bssid] = (ssid, channel, crypto)

aps = {}
sniff(iface='mon0', prn=insert_ap, store=False,
      lfilter=lambda p: (Dot11Beacon in p or Dot11ProbeResp in p))
有效负载函数写在while循环中。只要数据包是Dot11Elt实例,循环就处于活动状态。但是有效载荷做了什么,它不再是Dot11Elt(?)


谢谢大家!

packet.payload只是指向下一层的指针

请看下面的图片

例如,如果pkt是这样构造的:

pkt = Dot11()/foo()/IP()/TCP()
在您的示例中,
p
最初设置为
pkt[Dot11]
。因此,
p.payload
pkt[Dot11]。payload
,它指向
foo
对象。在循环结束时,
p
前进到
p.payload
。只要
p
是Dot11Elt类型,循环将继续运行


如果我们假设
Dot11
foo
都是Dot11Elt类型,那么循环将一直运行,直到
p
指向IP层。

我对您正在使用的协议一无所知,但这行代码显然将
p
的值替换为
p.payload
。也就是说,它没有对
p
的内容“做”任何事情;它为变量赋值。