2017-03-29 1 views
0

비콘 프레임을 분석하는 Python 스크립트를 이해하려고합니다. 하지만 나는 페이로드라고 불리는 곳에 붙어 있습니다. 파이썬 문서를보고 연구를하는 것은 나를 도와주지 못했다. 페이로드가 프레임에 의해 운반되는 데이터라는 것을 알았습니다.파이썬 : 정확히 .payload in scapy?

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.payloadfoo 개체를 가리키는 pkt[Dot11].payload입니다. 루프가 끝나면 pp.payload으로 진행됩니다. pDot11Elt 인 경우 루프가 계속 실행됩니다. 우리는 모두 Dot11foo 유형 Dot11Elt의 것을 가정하면 p는 IP 계층을 가리키는 될 때까지

는 다음 루프가 실행됩니다.