2017-03-29 4 views
0

ビーコンフレームを解析するPythonスクリプトを理解しようとしています。しかし私は.payloadと呼ばれるものに詰まっています。 Pythonのドキュメンテーションを見て、研究をしても私を助けませんでした。ペイロードがフレームによって運ばれるデータであることを知りました。Python:scapyで正確に.payloadは何ですか?

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のインスタンスである限り、ループはアクティブです。しかし、何が.payloadはもはやDot11Elt(?)

ありがとう!

+0

私はあなたが作業しているプロトコルについては何も知らないが、その行は 'p'の値を' p.payload'の値に置き換えていることは明らかです。つまり、 'p'の内容に対して何もしていないのです。変数に新しい値を代入しています。 – larsks

答えて

0

packet.payloadは、次のレイヤーへのポインタに過ぎません。

Scapy documentationをご覧ください。 PKTは、このように構成された場合例えば

は、:あなたの例では

pkt = Dot11()/foo()/IP()/TCP() 

pは、最初pkt[Dot11]に設定されています。したがって、p.payloadはオブジェクトを指すpkt[Dot11].payloadです。ループの最後にpp.payloadに進みます。 pがタイプDot11Eltの場合、ループは実行され続けます。我々は両方の​​、およびfooはタイプDot11Eltであると仮定した場合pは、IP層を指しているまで

は、その後、ループが実行されます。

関連する問題