2017-12-04 35 views
4

저는 완전히 scapy입니다. LAN을 사용하여 DHCP 모니터를 구축하려고합니다. prn= 매개 변수를 통해 콜백으로 전송 된 패킷을 캡처하려면 sniff을 사용하고 있습니다. 콜백 내에서 패킷에 DHCP 레이어가 있는지 확인한 다음 요청 유형을 확인합니다. 가지 어색한Scapy : 캡처 된 DHCP 패킷의 메시지 유형을 확인하십시오.

def manage(pkt): 
    if pkt.haslayer(DHCP): 
     req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0] 

     # Message type: request 
     if req_type == 3: 
      print ("Request from {}".format(pkt[Ether].src)) 

sniff(prn=manage, count=0, store=0) 

나는 DHCP 층에 options에 접근하고있어 방법입니다,하지만 난 그 작품과 함께 올 한 유일한 사람 :

나는 현재 이런 식으로하고 있어요 . 그러나 나는 dict 또는 뭔가를 통해 더 나은, pythonic 방법이 있어야한다고 생각합니다.

이러한 옵션에 액세스하는 적절한 방법은 무엇입니까?

+1

도움이 될만한 질문이 있으면 궁금합니다. 나는 이제 당신이하고있는 것보다 더 "조직화 된"것을 아무것도 못한다고 말할 수 없습니다. 문제는 DHCP가 bootp 페이로드에 옵션 목록을 던집니다. 특정 옵션이 필요하지 않으며 특별한 주문이 필요하지 않습니다. 동일한 유형 (라우터, DNS 서버 등)의 여러 옵션을 가질 수 있으므로 작동하는 명백한 dict 유형 프레임 워크가 없습니다. 하나 이상의 메시지 유형을 갖는 것이 실제로 의미가 없으며 * 자주 * 먼저 나올 것이지만 아무것도해야한다고 말하지는 않습니다. –

답변

1

나는 이것이 당신이 원하는 것을 할 수있는 가장 효율적인 방법이라고 생각합니다. 나는 next() 사용하는 것이 및 발전기 표현이 아닌 목록, 그것은 필요하지 때 전체 옵션 목록을 구문 분석을 피하기 위해 : 일부이기 때문에, 나는 또한 opt의 유형에 대한 검사를 추가 한

req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type') 

주 문자열 객체.

dict()을 사용할 수 있지만 전체 옵션 목록을 다시 구문 분석해야합니다.

부수적으로, Scapy에서 DHCP 옵션을 처리하는 방법이 조금 오래되었으므로 올바른 방법은 지금은 더 깨끗한 방법으로 PacketListField을 사용하여 옵션에 액세스하는 것입니다.

+0

'다음'을 영리하게 사용합니다. 나는 그때 정착 할 것이다. –