
    hO                    ^   d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( dd	l)m*Z*m+Z+m,Z,m-Z-m.Z. dd
l/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL ddlMmNZNmOZOmPZPmQZQ ddlRmSZSmTZTmUZUmVZVmWZW ddlXmYZYmZZZ ddl[m\Z\m]Z]m^Z^ ddl_m`Z`maZa ddlbmcZcmdZd ddlemfZf ddlgZh G d dei          Zji ddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?	Zk G d@ dAeN          Zl G dB dCeN          Zm G dD dEem          Zn G dF dGem          Zo G dH dIem          Zp G dJ dKem          Zq G dL dMeq          Zr G dN dOeq          Zs G dP dQem          Zt G dR dSem          Zu G dT dUeu          Zv G dV dWem          Zw G dX dYem          Zx G dZ d[em          Zy G d\ d]em          Zz G d^ d_em          Z{d`dadbdcdddedfdgdhdidjdkdldmdnddddddd$d0d2dodpdqdrdsdtfZ| G du dveN          Z}dw Z~ G dx dyeW          Z G dz d{eG          Z G d| d}e>          Z G d~ de<e7          Z G d deNej          Zd Zd Zd Zd Zd Zd Z G d deN          Z G d deN          ZdddddZ G d deN          Z G d de          Z G d deN          Z G d deJ          Z G d deJ          Zd Zi ddddddddd$dd&dd(dd*dd,dd.dd0dd2dd4ddddddd7dddddddddddd	ZddddddddddddddddɜdddddΜdddќdddќdddddddڜdۜZg dܢZg dݢZ G dބ deN          Z G d de          Z G d de          Z G d de          Z G d de          Z eOe#ed            eOe!ed            eOe$ed            eOe&ed            ePe%ed            eOe%eej                    eOeedd            eOeedd            eOeedd             eOeedd            eOeedd            eOeedd            eOeedd             eOeedd            eOee$dd            eOee$d           e0j                            ee           e0j                            ee           e0j                            ee           e0j                            ee           e0j                            ee           d Ze0j                            e#ee           e0j                            e"ee           e0j        j        dd            Ze0j        j        dd            Z G d de          Zd Zd ZddZe0j        j        d             Ze0j        j        d             Zd Zee\_         G d de^          Ze0j        j        ddd eS            ddddfd             Ze0j        j        d             Z G d de`          Ze0j        j        d             Ze0j        j        d d fd            Ze0j        j        dd
            Ze0j        j        dd            Ze0j        j         G d d                      Z G d de          Ze0xj        eeegz  c_        e0xj        eeegz  c_        e0j        rddlZhdS dS (  z
IPv4 (Internet Protocol v4).
    N)defaultdict)checksumdo_graphincremental_labellinehexdumpstrxorwhoiscolgen)AnsweringMachine)GenNet	_ScopedIP)ETH_P_IP	ETH_P_ALLDLT_RAWDLT_RAW_ALTDLT_IPV4	IP_PROTOSTCP_SERVICESUDP_SERVICES)CookedLinuxDot3EtherGRELoopbackSNAParpcachepoison
getmacbyip)rawchborbbytes_encodeOptional)conf)BitEnumFieldBitFieldByteEnumField	ByteFieldConditionalField	DestFieldEmphFieldLenFieldFieldListField
FlagsFieldIPFieldIP6FieldIntFieldMayEndMultiEnumFieldMultipleTypeFieldPacketFieldPacketListFieldShortEnumField
ShortFieldSourceIPFieldStrFieldStrFixedLenFieldStrLenFieldTrailerField
XByteFieldXShortField)Packetbind_layersbind_bottom_up	NoPayload)	RandShortRandIntRandBinRandNumVolatileValue)srsr1)_PacketList
PacketList
SndRcvList)	AutomatonATMT)log_runtimewarning)	inet_ptonc                   .    e Zd ZdZg Zd Zd Zd Zd ZdS )IPToolsz3Add more powers to a class with an "src" attribute.c                 p    t          t          | j                                      dd                     dS )z%whois the source and print the outpututf8ignoreN)printr	   srcdecodeselfs    U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/inet.pyr	   zIPTools.whoisT   s.    eDHoo$$VX6677777    c                 f    t          | t          j        j        j                  r| j        n| j        S )z0Returns ttl or hlim, depending on the IP version)
isinstancescapylayersinet6IPv6hlimttlr[   s    r]   _ttlzIPTools._ttlX   s'    &tU\-?-DEEStyy48Sr^   c                     t          g d|                                 gz             }||                    |                                           dz            S )N)    @            )sortedrg   index)r\   ts     r]   ottlzIPTools.ottl\   sI    %%%566%%)**r^   c                 T    |                                  |                                 z
  S N)rq   rg   r[   s    r]   hopszIPTools.hops`   s    yy{{TYY[[((r^   N)	__name__
__module____qualname____doc__	__slots__r	   rg   rq   rt    r^   r]   rT   rT   P   s^        ==I8 8 8T T T+ + +) ) ) ) )r^   rT   end_of_listrm   nop   security   loose_source_route   	timestamp   extended_security   commercial_security   record_route   	stream_id	   strict_source_route
   experimental_measurement   	mtu_probe   	mtu_reply   flow_control   access_control   encode   imi_traffic_descriptorextended_IP
tracerouteaddress_extensionrouter_alert!selective_directed_broadcast_modedynamic_packet_stateupstream_multicast_packetquick_startrfc4727_experiment)	                           c            	       d    e Zd Z eddd           edddddd           ed	dd
e          gZdS )_IPOption_HDR	copy_flagr   rm   optclassr}   controldebug)r   r}   optionr   N)ru   rv   rw   r&   r%   _ip_options_namesfields_descrz   r^   r]   r   r      sV        8KA..<
AqiG2L2LMM<!Q0ABBDKKKr^   r   c                       e Zd ZdZe eddddd            eddd	 
          gZd Zi Z	e
d             Ze
dd            ZdS )IPOptionz	IP OptionlengthNBvaluec                     |dz   S Nr}   rz   pktls     r]   <lambda>zIPOption.<lambda>   s
    Q r^   fmt	length_ofadjust c                     | j         dz
  S r   r   r   s    r]   r   zIPOption.<lambda>   s    3:PQ> r^   length_fromc                 
    d|fS )Nr^   rz   )r\   ps     r]   extract_paddingzIPOption.extract_padding   s    Avr^   c                 .    | | j         | j        j        <   d S rs   )registered_ip_optionsr   defaultclss    r]   register_variantzIPOption.register_variant   s    8;!#*"4555r^   c                 f    |r.t          |d                   dz  }|| j        v r| j        |         S | S )Nr      )r!   r   )r   r   argskargsopts        r]   dispatch_hookzIPOption.dispatch_hook   s?     	6c!f++$Cc///055
r^   rs   )ru   rv   rw   namer   r,   r<   r   r   r   classmethodr   r   rz   r^   r]   r   r      s        D  =4S+2;N;NP P P;w8Q8QRRRTK
   < < [<    [  r^   r   c                       e Zd ZdZdZegZdS )IPOption_EOLzIP Option End of Options Listr   Nru   rv   rw   r   r   r   r   rz   r^   r]   r   r      s        *DF /KKKr^   r   c                       e Zd ZdZdZegZdS )IPOption_NOPzIP Option No Operationrm   Nr   rz   r^   r]   r   r      s        #DF /KKKr^   r   c            
           e Zd ZdZdZdZe edd           edd           edd           ed	d           e	d
dd          gZ
dS )IPOption_SecurityzIP Option Securityrm   r}   r   r   r~   r   compartmenthandling_restrictionstransmission_control_codexxxr   N)ru   rv   rw   r   r   r   r   r(   r8   r;   r   rz   r^   r]   r   r      sw        DIF 9Xr**:j!,,:mQ//:5q99##$?JJKKKr^   r   c                       e Zd ZdZdZe eddddd            ed	d
           edg  e	dd          d           gZ
d ZdS )IPOption_RRzIP Option Record Router   r   Nr   routersc                     |dz   S Nr   rz   r   s     r]   r   zIPOption_RR.<lambda>   s
    1q5 r^   r   pointerr   r   0.0.0.0c                     | j         dz
  S r   r   r   s    r]   r   zIPOption_RR.<lambda>       a r^   r   c                 2    | j         | j        dz  dz
           S )Nr   rm   )r   r   r[   s    r]   get_current_routerzIPOption_RR.get_current_router   s    |DLA-122r^   )ru   rv   rw   r   r   r   r,   r(   r-   r/   r   r   rz   r^   r]   r   r      s        #DF  =4S+4=P=PR R R9Y**!>)RY1G1G.G.GI I I	K3 3 3 3 3r^   r   c                       e Zd ZdZdZdZdS )IPOption_LSRRz'IP Option Loose Source and Record Routerm   r   Nru   rv   rw   r   r   r   rz   r^   r]   r   r      s        4DIFFFr^   r   c                       e Zd ZdZdZdZdS )IPOption_SSRRz(IP Option Strict Source and Record Routerm   r   Nr   rz   r^   r]   r   r      s        5DIFFFr^   r   c                   L    e Zd ZdZdZdZe edd           edd          gZ	dS )	IPOption_Stream_IdzIP Option Stream IDrm   r   r   r   r~   r   N)
ru   rv   rw   r   r   r   r   r(   r8   r   rz   r^   r]   r   r      sE         DIF 9Xq)):j!,,0KKKr^   r   c                   H    e Zd ZdZdZe edd           edd          gZdS )IPOption_MTU_ProbezIP Option MTU Prober   r   r   mtur   N)	ru   rv   rw   r   r   r   r(   r8   r   rz   r^   r]   r   r      s@         DF 9Xq)):eQ''+KKKr^   r   c                       e Zd ZdZdZdS )IPOption_MTU_ReplyzIP Option MTU Replyr   N)ru   rv   rw   r   r   rz   r^   r]   r   r      s         DFFFr^   r   c            	           e Zd ZdZdZe edd           edd           edd           edd           ed	d
          gZ	dS )IPOption_TraceroutezIP Option Tracerouter   r   r   idr   outbound_hopsreturn_hopsoriginator_ipr   N)
ru   rv   rw   r   r   r   r(   r8   r/   r   rz   r^   r]   r   r      sm        !DF 9Xr**:dA&&:oq11:mQ//7?I668KKKr^   r   c                       e Zd ZdZdZdZe edd           edd           edd	d           e	d
dddddd           e
 edd          d            edd	          gZd ZdS )IPOption_TimestampzIP Option Timestampr}   r   r   Nr   r   oflwr   flgrm   timestamp_onlytimestamp_and_ip_addrprespecified_ip_addr)r   rm   r   internet_addressr   c                     | j         dk    S Nr   )r  r   s    r]   r   zIPOption_Timestamp.<lambda>  s    1 r^   r   c                     | j         8|d d         t          j        dt          |                    z   |dd          z   }||z   S )Nrm   !Br}   )r   structpacklen)r\   r   pays      r]   
post_buildzIPOption_Timestamp.post_build  sD    ;"1"D#a&&111AabbE9A3wr^   )ru   rv   rw   r   r   r   r   r(   r&   r%   r)   r/   r1   r   r  rz   r^   r]   r  r     s         DHF 9Xt,,9Y**8FAq))<q!$4$;$:!< !<= = $#GG,>	$J$J$<$<> >8K++
-K    r^   r  c                   b    e Zd ZdZdZdZe edd           edd           edd          gZ	d	S )
IPOption_Address_ExtensionzIP Option Address Extensionrm   r   r   r   src_extr   dst_extN)
ru   rv   rw   r   r   r   r   r(   r/   r   rz   r^   r]   r  r    sT        (DIF 9Xr**79i0079i002KKKr^   r  c                   R    e Zd ZdZdZdZe edd           eddddi          gZ	d	S )
IPOption_Router_AlertzIP Option Router Alertrm   r   r   r   alertr   router_shall_examine_packetN)
ru   rv   rw   r   r   r   r   r(   r7   r   rz   r^   r]   r  r    sN        #DIF 9Xq))!>'1q2O.PQQUKKKr^   r  c            
       r    e Zd ZdZdZdZe eddddd 	           edg  e	d
d          d           gZ
dS )IPOption_SDBMz+IP Option Selective Directed Broadcast Moderm   r   r   Nr   	addressesc                     |dz   S r   rz   r   s     r]   r   zIPOption_SDBM.<lambda>$  s    QQRU r^   r   r   r   c                     | j         dz
  S r   r   r   s    r]   r   zIPOption_SDBM.<lambda>&  r   r^   r   )ru   rv   rw   r   r   r   r   r,   r-   r/   r   rz   r^   r]   r  r    s|        8DIF  =4S+6?R?RT T T!>+r772y3I3I.G.GI I IKKKr^   r  EOLNNOPN)MSS!H)WScaler  )SAckOKN)SAck!)	Timestamp!II)	AltChkSumz!BH)AltChkSumOptN)MD516s)Moodz!p)UTOr'  )AON)TFOr-  )r   rm   r}   r   r   r   r   r   r   r   r         "   r   r   r6  r7  r8  )r#  r%  r&  r(  r)  r*  r,  r.  r/  r0  r2  r3  r4  r5  c                   ^    e Zd ZdZ edd           edd           eddd           gZdS )	
TCPAOValuezValue of TCP-AO optionkeyidN
rnextkeyidmacr   c                 0    t          | j                  dz
  S r   )r  originalr   s    r]   r   zTCPAOValue.<lambda>S  s    C
OOa4G r^   r   )ru   rv   rw   rx   r(   r<   r   rz   r^   r]   r:  r:  N  sQ          	'4  	,%%E2+G+GHHHKKKr^   r:  c                 4    | j         D ]\  }}|dk    r|c S dS )z%Get the TCP-AO option from the headerr4  N)options)tcphdroptidoptvals      r]   	get_tcpaorF  W  s5        vD==MMM 4r^   c                   "    e Zd ZddZd Zd ZdS )RandTCPOptionsNc                 8    |t          dd          }|| _        d S )Nrm   r   )rG   size)r\   rJ  s     r]   __init__zRandTCPOptions.__init__a  s    <1a==D			r^   c           	         d t          | j                  D             }g }|D ]\  }}||                    |df           t          j        d|          }g }|D ]}d|z   }d|v sd|v r/t          t          t          j        |                              }n2t          j        |          }	t          j
        ddd	|	z  z  d
z
            }|                    |           |                    |t          |          f           |S )Nc           	          g | ]J}t          j        t          d  t          d                                         D                                 KS )c              3   0   K   | ]\  }}|d k    ||fV  dS r"  rz   ).0r   r   s      r]   	<genexpr>z1RandTCPOptions._fix.<locals>.<listcomp>.<genexpr>j  s<        'sC%<< c
<<< r^   r   )randomchoicelist
TCPOptionsvalues)rO  _s     r]   
<listcomp>z'RandTCPOptions._fix.<locals>.<listcomp>i  sn     
 
 

 	 M$  +5a=+?+?+A+A      
 
 
r^   r^   z!?([bBhHiIlLqQfdpP]|\d+[spx])r+  sr   r   r}   r   rm   )rangerJ  appendrefindallbytesrF   r  calcsizerQ  randinttuple)
r\   rand_patterns	rand_valsonamer   structsrvalstruv_sizes
             r]   _fixzRandTCPOptions._fixf  s0   
 

 49%%
 
 
 	' 	7 	7JE3{  %.... *%EsKK# # #D:Dd{{cTkk!'&/$*?*?"@"@AA & 5 5"N1aAI.>.BCCKKNNNN  %t!56666r^   c                 ^    t                               d d |                                           S rs   )TCPOptionsFieldi2mri  r[   s    r]   	__bytes__zRandTCPOptions.__bytes__  s"    ""4tyy{{;;;r^   rs   )ru   rv   rw   rK  ri  rm  rz   r^   r]   rH  rH  `  sF           
  :< < < < <r^   rH  c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )rk  rm   c                     |j         dz
  dz  }|dk     rt          j        d|j                    d}||d          |                     ||d |                   fS )Nr   r   r   z$bad dataofs (%i). Assuming dataofs=5)dataofsrP   infom2i)r\   r   rX  opszs       r]   getfieldzTCPOptionsField.getfield  sg    a1$!886   Dx#q$x0000r^   c                 6   g }|rt          |d                   }|dk    r|                    d           na|dk    r |                    d           |dd          }[	 t          |d                   }n# t          $ r d}Y nw xY w|dk     rt          j        d|           d}|d|         }|t
          d         v rt
          d         |         \  }}|dk    r|dt          |          d	z  z  z  }|d
k    rt          |          }|rUt          j	        |          t          |          k    r0t          j
        ||          }t          |          dk    r|d         }|                    ||f           n|                    ||f           ||d          }||S )Nr   r"  rm   r$  r}   z-Malformed TCP option (announced length is %i)r   %iIr   r7  )r!   rZ  
IndexErrorrP   rq  rT  r  r:  r  r^  unpack)	r\   r   xr   onumolenovalrc  ofmts	            r]   rr  zTCPOptionsField.m2i  s     	qt99Dqyy

=)))qyy

=)))abbE1Q4yy   axx CT   QtV9Dz!}$$(mD1t199ESYY!^44D2::%d++D 'FOD11SYY>>!=t44D4yyA~~#Aw

E4=))))

D$<((($%%AA   	B 
s   A5 5BBc                     |sg S |S rs   rz   r\   r   ry  s      r]   i2hzTCPOptionsField.i2h  s     	Ir^   c           	         d}|D ]\  }}ddd                     ||          }t          |t                    r|dk    r|dz  }@|dk    r|dz  }L|t          d         v rt          d         |         }t          d         |         d         }|d	k    r|d
t	          |          z  z  }t          |t
          t          f           }|0|sd|v r*t          |t                    s|f}t          j        |g|R  }|dk    rt          |          }nmt          d|           |}t          |t                    st          d|z             Dt          |t
          t          f          st          d|z             tt          |t                    rt          |          }|t          |          t          dt	          |          z             z   |z   z  }|ddt	          |          dz   dz  z
  z  z   S )Nr^   r#  r%  r   rm          rm   r   r   rv  rX  r7  zOption [%s] unknown. Skipped.zInvalid option number [%i]zOption [%i] is not bytes.r}   r   r   )getr`   strrT  r  r]  r`  r  r  rQ   intr"   r    )	r\   r   ry  r   rc  r|  rz  r}  _test_isinstances	            r]   rl  zTCPOptionsField.i2m  s    #	9 #	9KE4%((,,UE::E%%% E>>7NCe^^7NCjm++%a=/D%a=.q1DqyyD		 11+5dUCL+I+I'I$'-=')$66 +$(7D%{47$777rzz$T{{;UCCC!$,, 84?@@@!$55 7$>???$$$ *#D))3t99s1s4yy=111D88CCWc#hhla%7 8999r^   c                     t                      S rs   )rH  r[   s    r]   randvalzTCPOptionsField.randval  s    r^   N)	ru   rv   rw   islistrt  rr  r  rl  r  rz   r^   r]   rk  rk    sf        F1 1 1# # #J  
&: &: &:P         r^   rk  c                   :    e Zd Z ej        d          Zd Zd ZdS )ICMPTimeStampFieldzM([0-2]?[0-9])[Hh:](([0-5]?[0-9])([Mm:]([0-5]?[0-9])([sS:.]([0-9]{0,3}))?)?)?$c                     |dS t          |d          \  }}t          |d          \  }}t          |d          \  }}d|||t          |          fz  S )Nz--  <   z%d:%d:%d.%d)divmodr  )r\   r   valsecmilliminhours          r]   i2reprzICMPTimeStampField.i2repr  s[    ;4T**JCc2HCsBID# D#sCJJ#???r^   c                    t          |t                    r| j                            |          }|rx|                                \  }}}}}}}t          |pddz   d d                   }t          |          dz  t          |pd          z   dz  t          |pd          z   dz  |z   }n+d}n(|&t          t          j                    dz  dz            }|S )Nr   000r   r  r   r  iQ )r`   r  re_hmsmmatchgroupsr  time)	r\   r   r  hmsmshrV  mrX  mss	            r]   any2izICMPTimeStampField.any2i  s    c3 		=L&&s++E ',||~~$1aAq"28u,bqb122Ac!&qkk1R7#af1++EMPRR[ty{{l3t;<<C
r^   N)ru   rv   rw   r[  compiler  r  r  rz   r^   r]   r  r    sG        bjhiiG@ @ @    r^   r  c                   $    e Zd Zi Zd Zd Zd ZdS )DestIPFieldc                 ^    t          j        | |d            t          j        | ||           d S rs   )r/   rK  r*   )r\   r   r   s      r]   rK  zDestIPField.__init__  s2    tT***4w/////r^   c                 \    ||                      |          }t          j        | ||          S rs   )dst_from_pktr/   rl  r  s      r]   rl  zDestIPField.i2m
  .    9!!#&&A{4a(((r^   c                 \    ||                      |          }t          j        | ||          S rs   )r  r/   r  r  s      r]   r  zDestIPField.i2h  r  r^   N)ru   rv   rw   bindingsrK  rl  r  rz   r^   r]   r  r    sF        H0 0 0) ) )
) ) ) ) )r^   r  c                      e Zd Zd Z eddd           eddd           edd           edd           edd	           ed
ddg d           eddd           edd           e	dde
           edd           e ed                     e edd                     edg ed           gZd Zd Zd Zd Zd Zd Zd!d ZdS )"IPversionr   ihlNtosr   r  r   rm   flagsr   )MFDFevilfragr   rf   rj   protochksumrY   dstz	127.0.0.1rB  c                     | j         dz  dz
  S )Nr   r   )r  r@  s    r]   r   zIP.<lambda>$  s    QRQVYZQZ]_Q_ r^   r   c                    | j         }|dt          |           dz  z  z  }|=t          |          dz  }t          | j        dz  dz  |dz  z            |dd          z   }| j        Jt          |          t          |          z   }|d d         t	          j        d|          z   |dd          z   }| j        Jt          |          }|d d         t          |dz	            z   t          |d	z            z   |d
d          z   }||z   S )Nr  r   r   rm   r}   r'  r   r   rl   r   )r  r  r    r  r  r  r  r   )r\   r   r  r  tmp_lencks         r]   r  zIP.post_build&  s   h	UAw!m$$;a&&A+CdlS(Q.#*<==!""EA8!ffs3xx'G"1"D'222QqrrU:A;!B#2#R1W%BI6233?A3wr^   c                 b    | j         | j        dz  z
  }|dk     r|dfS |d |         ||d          fS )Nr}   r   r^   )r  r  r\   rX  r  s      r]   r   zIP.extract_padding4  sA    (dh!m,Q;;c6M'{AghhK''r^   c                 ,   | j         }d }t          |t          t          f          r|j        }t          |t
          t          f          rt          t          |                    }t          j
        dd l}t          j
        
                    ||          S )Nr   )dev)r  r`   r   r   scoper   rS  nextiterr$   routescapy.route)r\   r  r  ra   s       r]   r  zIP.route:  s    hcC+,, 	IEcC;'' 	"tCyy//C:z///r^   c                 (   | j         t          j        k    rFt          | j        t
                    r,| j        j        dv r| j        j                                        S t          j	        s"| j         dv r| j                                        S | j
        dk    r4t          j        d| j                   | j                                        z   S t          j        rt          j        rt          t!          t          j        | j                  t!          t          j        | j
                            t          j        d| j                   z   | j                                        z   S t          j        d| j                   | j                                        z   S )Nr   r   r   r   r   r   )   224.0.0.251r   )r  socketIPPROTO_ICMPr`   payloadICMPtypehashretr$   checkIPinIPr  r  r  
checkIPsrccheckIPaddrr   rR   AF_INETrY   r[   s    r]   r  z
IP.hashretF  sO   Z6...d++ /"&777<'//111 	*DJ'$9$9<'')))8}$$;sDJ//$,2F2F2H2HHH? 	Kt/ 	K9V^TX>>$V^TX>>@ @KTZ00137<3G3G3I3IJ K {3
++dl.B.B.D.DDDr^   c                    t           j        s| j        dv r| j                            |          S t          |t                    r#|j        dv r|                     |j                  S t           j        rGt          |t          j	        j
        j                  r#|j        dv r|                     |j                  S t          |t                    sdS t           j        rG|j        dk    r*| j        dk    r| j                            |j                  S | j        |j        k    rdS | j        t           j        k    rGt          | j        t$                    r-| j        j        dv r| j        j                            |          S t           j        r| j        |j        k    s| j        |j        k    rdS | j                            |j                  S )Nr  r   r  r  )r$   r  r  r  answersr`   r  ipv6_enabledra   rb   rc   rd   nhr  r  rY   r  r  r  r  r\   others     r]   r  z
IP.answersU  s    	3zW$$|++E222%$$ 3)?)?||EM222  3eU\%7%<==38w&&||EM222%$$ 	1 	yM))dh-.G.G|++EM:::(ei''qZ6...d++ /"&777<'//666 ! tx59'<'<Z5;..q<''666r^   c                 X    |                      d          }| j        r|d| j        z  z  }|S )Nz%IP.src% > %IP.dst% %IP.proto%z frag:%i)sprintfr  )r\   rX  s     r]   	mysummaryzIP.mysummaryr  s4    LL9::9 	(di''Ar^     c                 $    t          | |          S )zFragment IP datagrams)fragsize)fragment)r\   r  s     r]   r  zIP.fragmentx  s    x0000r^   r  )ru   rv   rw   r   r&   r>   r8   r.   r(   r'   r   r?   r+   r9   r  r6   r   r   r  r   r  r  r  r  r  rz   r^   r]   r  r    s       D8Iq!,,8E4++:eQ'':eT**:dA&&:gq!-A-A-ABB8FAr**9UB'' =!Y77;x..4e,,--4E;7788"?9b(H_H_```bK  ( ( (
0 
0 
0E E E7 7 7:  1 1 1 1 1 1r^   r  c                    |                                 }|j        [|j        1t          d |j        D                       }d|dz  z   |dz  rdndz   }n|j        }t          |j        d|z  z
  d          }n|}d |j        D             }t          |          }|dk    r3t          |d         j                  r|d         j        d         |_        n|dk    rd	}|d
z  }t          ||           t          j
        dt          t          j        |j                  t          t          j        |j                  | |          S )zIPv4 Pseudo Header as defined in RFC793 as bytes

    :param proto: value of upper layer protocol
    :param u: IP layer instance
    :param plen: the length of the upper layer and payload
    Nc              3   4   K   | ]}t          |          V  d S rs   r  rO  ry  s     r]   rP  z#in4_pseudoheader.<locals>.<genexpr>  s(      11!s1vv111111r^   r   r   rm   r   c                 f    g | ].}t          |t                    st          |t                    ,|/S rz   )r`   r   r   )rO  r   s     r]   rW  z$in4_pseudoheader.<locals>.<listcomp>  sG     2 2 2#jm.L.L 2S-002# 2 2 2r^   z!Found %d Source Routing Options! z0Falling back to IP.dst for checksum computation.z!4s4sHH)copyr  r  sumrB  maxr   r  rQ   r  r  rR   r  r  rY   )	r  uplenr{  r  ln
sr_optionslen_sr_optionsmessages	            r]   in4_pseudoheaderr  }  sO    	
Au5=11qy11111Ddai-q#711a8CC%CS!$$2 2 2 2 2J__Ns:a=#899 1%b)	!		5EE(((;y 77 77	  r^   c                     t          |t                    st          d           dS t          | |t	          |                    }t          ||z             S )zIPv4 Pseudo Header checksum as defined in RFC793

    :param proto: value of upper layer protocol
    :param u: upper layer instance
    :param p: the payload of the upper layer provided as a string
    3No IP underlayer to compute checksum. Leaving null.r   )r`   r  rQ   r  r  r   )r  r  r   psdhdrs       r]   
in4_chksumr    sS     a EFFFqeQA//FFQJr^   c                     t          | t          j        j        j                  p#t          | t          j        j        j                  S rs   )r`   ra   rb   rc   rd   _IPv6ExtHdrr@  s    r]   _is_ipv6_layerr    s6    q%,,122 :q%,,899;r^   c                    t          | j        t                    r<t          t	          |                     }t          t          j        | j        |          S t          j	        rrt          | j                  r^t          t	          |                     }t          t          j        j                            t          j        | j        |                    S t!          d          )z[Pseudoheader of a TCP packet as bytes

    Requires underlayer to be either IP or IPv6
    z.TCP packet does not have IP or IPv6 underlayer)r`   
underlayerr  r  r]  r  r  IPPROTO_TCPr$   r  r  r   ra   rb   rc   in6_pseudoheader
ValueError)tcpr  s     r]   tcp_pseudoheaderr     s     #."%% K5:: 2CNDIII		 K~cn== K5::5<%666 6 7 7 	7 IJJJr^   c                    ddl }|                                }t          |           }|                    t	          |                      |                    |dd                    |                    d           |                    |dd                    |                    |           |                                S )z>Calculate TCP-MD5 hash from packet and return a 16-byte stringr   Nr   s     r   )hashlibmd5r]  updater   digest)r  keyr  r  	tcp_bytess        r]   calc_tcp_md5_hashr    s     NNNAc

IHHc""###HHYss^HH[HHYrss^HHSMMM88::r^   c                 J    t          | |          }| j        d|fgz   | _        dS )z&Append TCP-MD5 signature to tcp packetr0  N)r  rB  )r  r  sigs      r]   sign_tcp_md5r    s+     C
%
%C+%.CKKKr^   c                   ,   e Zd Zd Z edde           edde           edd           edd           edd	d
           eddd           edddd           e	dd           e
dd	           e	dd           edd          gZd Zd Zd Zd Zd	S )TCPsportr   dportP   seqr   ackrp  Nr   reservedr   r  r}   r   	FSRPAUECNwindowi    r  urgptrrB  r   c                    ||z  }| j         }|t          |                     d                              | | j                            }d|dz   dz  z   }|dz  t          |d                   dz  z  }|d d         t          |dz            z   |dd          z   }| j        9t          | j	        t                    rLt          t          j        | j	        |          }|d d	         t          j        d
|          z   |dd          z   }nt           j        r)t          | j	        t$          j        j        j                  s)t          | j	        t$          j        j        j                  rat$          j        j                            t          j        | j	        |          }|d d	         t          j        d
|          z   |dd          z   }nt1          j        d           |S )NrB  r   r   r   r   r   rl   r   r   r'  r   r  )rp  r  	get_fieldrl  rB  r!   r    r  r`   r  r  r  r  r  r  r  r$   r  ra   rb   rc   rd   r  
in6_chksumrP   rq  )r\   r   r  rp  opt_lenr  s         r]   r  zTCP.post_build  s   	S,?$..3377dlKKLLGGaKA-.G!|s1R5zzD'88G#2#Wt^,,,qv5A;$/2.. 	 2DOQGGcrcFV[r222QrssV;" z$/5<CUCZ'['[ _ijnjy  |A  |H  |N  |Z  `[  `[ \'2263EtXYZZcrcFV[r222QrssV; I   r^   c                     t           j        r<t          j        d| j        | j        z            | j                                        z   S | j                                        S )NH)r$   r  r  r  r  r  r  r  r[   s    r]   r  zTCP.hashret  sN    ? 	*;sDJ$;<<t|?S?S?U?UUU<'')))r^   c                    t          |t                    sdS |j        j        rdS | j        j        r| j        j        sdS |j        j        sdS t          j        r"| j        |j	        k    r| j	        |j        k    sdS |j        j        r|j        j        r"t          |j        | j        z
            dk    rdS | j        j        r| j        j        sdS t          |j        | j        z
            dt          |j                  z   k    rdS dS )Nr   r}   rm   )r`   r  r  RSAr$   r  r  r  absr  r  r  r  r  s     r]   r  zTCP.answers
  s   %%% 	1;= 	1 :< 	:< q;= q? 	Z5;..Z5;..q 	ekm 	59tx'((1,,1:< 	
 	1uy48#$$q3u}+=+='===1qr^   c                 2   t          | j        t                    r| j                            d          S t          j        rCt          | j        t          j        j        j	                  r| j                            d          S |                     d          S )Nz;TCP %IP.src%:%TCP.sport% > %IP.dst%:%TCP.dport% %TCP.flags%z?TCP %IPv6.src%:%TCP.sport% > %IPv6.dst%:%TCP.dport% %TCP.flags%z)TCP %TCP.sport% > %TCP.dport% %TCP.flags%)
r`   r  r  r  r$   r  ra   rb   rc   rd   r[   s    r]   r  zTCP.mysummary)  s    dor** 	M?**+hiii 	M:dou|?Q?V#W#W 	M?**+lmmm<< KLLLr^   )ru   rv   rw   r   r7   r   r1   r&   r.   r8   r?   rk  r   r  r  r  r  rz   r^   r]   r  r    s       D!>'2|<<!>'2|<<8E1%%8E1%%8ItQ//8J1--:gsA{;;:h--;x..:h**"?9b11
3K  ** * *  >M M M M Mr^   r  c                       e Zd Zd Z edde           edde           edd           edd          gZd Z	d Z
d	 Zd
 Zd ZdS )UDPr  5   r  r  Nr  c                     ||z  }| j         }|:t          |          }|d d         t          j        d|          z   |dd          z   }| j        =t	          | j        t                    rTt          t          j	        | j        |          }|dk    rd}|d d         t          j        d|          z   |dd          z   }nt	          | j        t          j        j        j                  s)t	          | j        t          j        j        j                  rit          j        j                            t          j	        | j        |          }|dk    rd}|d d         t          j        d|          z   |dd          z   }nt!          j        d           |S )Nr   r'  r   r   i  r   r  )r  r  r  r  r`   r  r  r  r  IPPROTO_UDPra   rb   rc   rd   r  r  rP   rq  )r\   r   r  r  r  s        r]   r  zUDP.post_build9  s}   	S(?!ffG"1"D'222QqrrU:A;$/2..  2DOQGG77BbqbEFKb111AabbE9DOU\-?-DEE 	TXTcejeqew  fD  JE  JE 	\'2263EtXYZZ77BbqbEFKb111AabbE9 I   r^   c                 >    | j         dz
  }|d |         ||d          fS )Nr   r  r  s      r]   r   zUDP.extract_paddingR  s(    (Q,'{AghhK''r^   c                 4    | j                                         S rs   )r  r  r[   s    r]   r  zUDP.hashretV  s    |##%%%r^   c                     t          |t                    sdS t          j        r| j        |j        k    rdS | j                            |j                  S r  )r`   r$  r$   r  r  r  r  r  r  s     r]   r  zUDP.answersY  sO    %%% 	1? 	zU[((q|##EM222r^   c                    t          | j        t                    r| j                            d          S t          | j        t          j        j        j                  r| j                            d          S |                     d          S )Nz/UDP %IP.src%:%UDP.sport% > %IP.dst%:%UDP.dport%z3UDP %IPv6.src%:%UDP.sport% > %IPv6.dst%:%UDP.dport%zUDP %UDP.sport% > %UDP.dport%)r`   r  r  r  ra   rb   rc   rd   r[   s    r]   r  zUDP.mysummarya  su    dor** 	A?**+\]]]);)@AA 	A?**+`aaa<< ?@@@r^   )ru   rv   rw   r   r7   r   r8   r?   r   r  r   r  r  r  rz   r^   r]   r$  r$  2  s        D!>'2|<<!>'2|<<:eT**;x..2K
  2( ( (& & &3 3 3A A A A Ar^   r$  MPLSzInterface InformationzInterface IdentificationzExtended Information)rm   r}   r   r   c                       e Zd ZdZdZ edd           edde           edd          gZ	d Z
i Zed             Zed
d	            ZdS )ICMPExtension_ObjectzICMP Extension Objectr   r  Nclassnum	classtypec                     | j         ?t          |          t          |          z   }t          j        d|          |dd          z   }||z   S )Nr'  r}   )r  r  r  )r\   r   r  r  s       r]   r  zICMPExtension_Object.post_build}  sG    8!ffs3xx'GD'**QqrrU2A3wr^   c                 .    | | j         | j        j        <   d S rs   )registered_icmp_extsr/  r   r   s    r]   r   z%ICMPExtension_Object.register_variant  s    9< !5666r^   c                 l    |r1t          |          dk    r|d         }|| j        v r| j        |         S | S )Nr   r}   )r  r3  )r   _pktr   r   r/  s        r]   r   z"ICMPExtension_Object.dispatch_hook  sB     	:CIINNAwH3333/99
r^   rs   )ru   rv   rw   r   show_indentr8   r'   _ICMP_classnumsr(   r   r  r3  r   r   r   rz   r^   r]   r.  r.  t  s        "DK
5$j!_55	+q!!K   = = [=    [  r^   r.  c                   F   e Zd ZdZ edd           edde           eddd           eddd           ed	dd
           eddd
           eddd
           eddd
           e e	dd          d            e edd          d            e edd          d            e e
dd          d            e edd          d            e edddd          d            e eddd           d            e e	d d          d!           gZd" ZdS )#"ICMPExtension_InterfaceInformationz>ICMP Extension Object - Interface Information Object (RFC5837)r  Nr/  r}   r0  r   r  has_ifindexrm   
has_ipaddr
has_ifnamehas_mtuifindexc                     | j         dk    S Nrm   )r:  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s    ST@T r^   afic                     | j         dk    S r@  r;  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s    cnPQ>Q r^   	reserved2c                     | j         dk    S r@  rC  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s    STAT r^   ip4c                     | j         dk    S r@  rA  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s    37a< r^   ip6c                     | j         dk    S r   rH  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s    CGqL r^   
ifname_lenr   ifname)r   r   c                     | j         dk    S r@  r<  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>      !+ r^   c                     | j         S rs   )rK  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s     r^   r   c                     | j         dk    S r@  rN  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  rO  r^   r   c                     | j         dk    S r@  )r=  r   s    r]   r   z+ICMPExtension_InterfaceInformation.<lambda>  s    CK1<L r^   c                 n    | j         | j        d| _         n| j        d| _         t          j        | fi |S )Nrm   r}   )rA  rF  rI  r.  
self_build)r\   kwargss     r]   rT  z-ICMPExtension_InterfaceInformation.self_build  sC    8x#%#.t>>v>>>r^   )ru   rv   rw   r   r8   r'   r7  r&   r)   r1   r/   r0   r,   r<   r   rT  rz   r^   r]   r9  r9    s       KD 	
5$j!_55a##Q""1%%q!$$q!$$Aq!!)T224T4TUUE4002Q2QRRK335T5TUU--/G/GHH%..0H0HIIM,#JJJ++	
 	
 	K$4N4NOOO++	
 	
 	%..0L0LMM-K2? ? ? ? ?r^   r9  c                       e Zd ZdZdZdZ eddd           eddd           ed	d
          gZ e	 e
                      Zd Zd Zd
S )ICMPExtension_Headeraa  
    ICMP Extension per RFC4884.

    Example::

        pkt = IP(dst="127.0.0.1", src="127.0.0.1") / ICMP(
            type="time-exceeded",
            code="ttl-zero-during-transit",
            ext=ICMPExtension_Header() / ICMPExtension_InterfaceInformation(
                has_ifindex=1,
                has_ipaddr=1,
                has_ifname=1,
                ip4="10.10.10.10",
                ifname="hey",
            )
        ) / IPerror(src="12.4.4.4", dst="12.1.1.1") / \
            UDPerror(sport=42315, dport=33440) /  \
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    zICMP Extension Header (RFC4884)r   r  r}   r   r  r   r  Nc                     ||z  }| j         Jt          |          }|d d         t          |dz	            z   t          |dz            z   |dd          z   }|S Nr}   r   rl   r   r  r   r    r\   r   r  r  s       r]   r  zICMPExtension_Header.post_build  [    	S;!B"1"B!G$s29~~5!""=Ar^   c                 j    t          |          | j        k     rt          j        | |          S t          S rs   )r  _min_ieo_lenr@   guess_payload_classr.  r\   r  s     r]   r_  z(ICMPExtension_Header.guess_payload_class  s/    w<<$+++-dG<<<##r^   )ru   rv   rw   rx   r   r6  r&   r?   r   r  r.  r^  r  r_  rz   r^   r]   rW  rW    s         ( -DKAq!!Q##Hd##K 3++--..L  $ $ $ $ $r^   rW  c                   .     e Zd Z fdZd Z fdZ xZS )_ICMPExtensionFieldc                     t          t          |                               t          dd t                               d S )Next)superrb  rK  r5   rW  r\   	__class__s    r]   rK  z_ICMPExtensionField.__init__  sF    !4((11$ 	
 	
 	
 	
 	
r^   c                    t          |j                  dk     r|d fS dt          |          z   t          |j                  z
  }||d          }t          |          |dd         k    r|d fS |d |         t          |          fS )N      r   r   )r  r?  r   rW  )r\   r   rX  offsetdatas        r]   rt  z_ICMPExtensionField.getfield  s     s|s""d7Ns1vvCL 1 11zD>>T!A#Y&&d7N&z/5555r^   c                    ||S t          |          }dt          |j                  z
  t          |          z
  }|dk     rt          d           |S t	          t
          |                               ||d|z  |z             S )Nrj  r   z6ICMPExtension_Header is after the 136th octet of ICMP.r  )r]  r  r  rQ   re  rb  addfield)r\   r   rX  r  rl  padrg  s         r]   rn  z_ICMPExtensionField.addfield  s    ;HSzzC$$$s1vv-77LMMMK($//88a3QUAUVVVr^   )ru   rv   rw   rK  rt  rn  __classcell__rg  s   @r]   rb  rb    si        
 
 
 
 
6 6 6	W 	W 	W 	W 	W 	W 	W 	W 	Wr^   rb  c                   $     e Zd Z fdZd Z xZS )_ICMPExtensionPadFieldc                 x    t          t          |                               t          ddd                     d S )Nextpadr   r   r   )re  rs  rK  r;   rf  s    r]   rK  z_ICMPExtensionPadField.__init__	  sB    $d++44Xr!444	
 	
 	
 	
 	
r^   c                     |r(|dt          |          z  k    rdt          |          z  S | j                            ||          S )Nr  zb'' (%s octets))r  fldr  )r\   r   rX  s      r]   r  z_ICMPExtensionPadField.i2repr  sF     	.gA&&&$s1vv--xsA&&&r^   )ru   rv   rw   rK  r  rp  rq  s   @r]   rs  rs    sG        
 
 
 
 

' ' ' ' ' ' 'r^   rs  c                     |j         rU|                                }t          |t          j                  r)|j                                         |j        |_        d S d S d S rs   )	rd  	lastlayerr`   r$   padding_layerr  remove_payloadloadru  )r\   r   ro  s      r]   _ICMP_extpad_post_dissectionr}    sc    
w "mmooc4-.. 	"N))+++CJJJ	" "	" 	"r^   z
echo-replyzdest-unreachzsource-quenchredirectzecho-requestzrouter-advertisementzrouter-solicitationztime-exceededzparameter-problemztimestamp-requestztimestamp-replyzinformation-requestzinformation-responser   zaddress-mask-requestr   zaddress-mask-replyr   r   zdatagram-conversion-errorzmobile-host-redirectzipv6-where-are-youzipv6-i-am-herezmobile-registration-requestzmobile-registration-replyzdomain-name-requestzdomain-name-replyskipphoturis)	ri   !   r8  #   $   %   &   '   (   znetwork-unreachablezhost-unreachablezprotocol-unreachablezport-unreachablezfragmentation-neededzsource-route-failedznetwork-unknownzhost-unknownznetwork-prohibitedzhost-prohibitedzTOS-network-unreachablezTOS-host-unreachablezcommunication-prohibitedzhost-precedence-violationzprecedence-cutoff)r   rm   r}   r   r   r   r   r   r   r   r   r   r   r   r   znetwork-redirectzhost-redirectzTOS-network-redirectzTOS-host-redirect)r   rm   r}   r   zttl-zero-during-transitzttl-zero-during-reassemblyr  zip-header-badzrequired-option-missingzbad-spizauthentication-failedzdecompression-failedzdecryption-failedzneed-authentificationzneed-authorization)r   rm   r}   r   r   r   )r   r   r   r   r  ))r   r   r   r   )r   r   r   r   )r  r8  )r  r  )r  r  )
r   r   r   r   r   r   r   r   r  r  c                       e Zd Zd Z edde           edded d           edd	           e	 ed
d          d            e	 edd          d            e	 e
dd	          d            e	 e
dd	          d            e	 e
dd	          d            e	 edd          d            e	 edd          d            e	 edd          d            e	 edd          d            e	 edd          d            e	 edd          d             e ed!d          d" f ed!d          d# fg ed!d$d%                     e	 e            d&            e	 e            d'           gZeZd( Zd) Zd* Zd+ Zd, Zd	S )-r  r  r   coder   c                     | j         S rs   r  r   s    r]   r   zICMP.<lambda>j  s    SX r^   r   )
depends_onr   r  Nr   c                     | j         t          v S rs   r  icmp_id_seq_typesr   s    r]   r   zICMP.<lambda>n      $55 r^   r  c                     | j         t          v S rs   r  r   s    r]   r   zICMP.<lambda>r  r  r^   ts_oric                     | j         dv S Nr  r  r   s    r]   r   zICMP.<lambda>w      H, r^   ts_rxc                     | j         dv S r  r  r   s    r]   r   zICMP.<lambda>|  r  r^   ts_txc                     | j         dv S r  r  r   s    r]   r   zICMP.<lambda>  r  r^   gwr   c                     | j         dk    S )Nr   r  r   s    r]   r   zICMP.<lambda>      A r^   ptrc                     | j         dk    S )Nr   r  r   s    r]   r   zICMP.<lambda>  s    B r^   r  c                     | j         dv S )N)r   r   r  r   s    r]   r   zICMP.<lambda>  s    G+ r^   r   c                     | j         dv S N)r   r   r   r  r   s    r]   r   zICMP.<lambda>      K/ r^   	addr_maskc                     | j         dv S )Nr  r  r   s    r]   r   zICMP.<lambda>  r  r^   
nexthopmtuc                     | j         dk    S r   r  r   s    r]   r   zICMP.<lambda>  r  r^   unusedc                     | j         dv S )N)r   r   r  r   s    r]   r   zICMP.<lambda>  s    sx83 r^   c                     | j         dvS )N)r   r   r   r   r   r   r   r   r   r   r   r   r  r   s    r]   r   zICMP.<lambda>  s    sx 04  4 r^   r   r   c                     | j         dv S r  r  r   s    r]   r   zICMP.<lambda>  r  r^   c                     | j         dv S r  r  r   s    r]   r   zICMP.<lambda>  r  r^   c                     ||z  }| j         Jt          |          }|d d         t          |dz	            z   t          |dz            z   |dd          z   }|S rY  rZ  r[  s       r]   r  zICMP.post_build  r\  r^   c                     | j         t          v r:t          j        d| j        | j                  | j                                        z   S | j                                        S )NHH)r  r  r  r  r   r  r  r  r[   s    r]   r  zICMP.hashret  sO    9)));tTWdh77$,:N:N:P:PPP|##%%%r^   c                     t          |t                    sdS |j        | j        ft          v r"| j        |j        k    r| j        |j        k    rdS dS Nr   rm   )r`   r  r  _icmp_answersr   r  r  s     r]   r  zICMP.answers  sU    %&& 	1Z#}44GuxEI%%1qr^   c                 &    | j         dv rt          S d S )Nr  )r  IPerrorr`  s     r]   r_  zICMP.guess_payload_class  s    9)))N4r^   c                     d}| j         r| j         j                            d          }t          | j        t
                    r| j                            d          |z   S |                     d          |z   S )Nr   z ext:%classnum%z0ICMP %IP.src% > %IP.dst% %ICMP.type% %ICMP.code%zICMP %ICMP.type% %ICMP.code%)rd  r  r  r`   r  r  )r\   extras     r]   r  zICMP.mysummary  s    8 	@H$,,->??Edor** 	H?**B   << >??%GGr^   )ru   rv   rw   r   r'   	icmptypesr3   	icmpcodesr?   r)   r  r/   r(   r8   r4   r1   r;   rs  rb  r   r}  post_dissectionr  r  r  r_  r  rz   r^   r]   r  r  e  s       Dfa++vq)"5"53	@ 	@ 	@Hd##Ka  55	
 	
 	Kq!!55	
 	
 	x..,,	
 	

 	w--,,	
 	

 	w--,,	
 	

 	GD)$$%%	
 	

 	IeQ&&	
 	

 	Ij!$$++	
 	
 	Ih""//	
 	
 	GK++,,	
 	
 	J|Q''%%	
 	
 	Ha((335(A&&4 45 Xr!444
	
 
	
 	""$$//	
 	
 	!!//	
 	
MJKZ 3O  & & &
    	H 	H 	H 	H 	Hr^   r  c                       e Zd ZdZd Zd ZdS )r  z
IP in ICMPc                    t          |t                    sdS t          j         p| j        |j        k    }| j        |j        k    }t          j         p| j        |j        k    }|t          j        o!| j        t          j	        |j                  k    z  }| j
        |j
        k    }|r|r|r|sdS | j                            |j                  S r  )r`   r  r$   r  rY   r  	checkIPIDr   r  htonsr  r  r  )r\   r  
test_IPsrc
test_IPdst	test_IPidtest_IPprotos         r]   r  zIPerror.answers  s    %$$ 	1 (ADH	,A
X*
 &=$'UX*=	T^I6<3I3I(II	 zU[0 	z 	i 	L 	1|##EM222r^   c                 *    t          j        |           S rs   r@   r  r[   s    r]   r  zIPerror.mysummary      %%%r^   Nru   rv   rw   r   r  r  rz   r^   r]   r  r    s7        D3 3 3(& & & & &r^   r  c                       e Zd ZdZej        dd          eej        d                   gz   ej        dd         z   Zd Zd ZdS )TCPerrorzTCP in ICMPNr}   r   c                    t          |t                    sdS t          j        r"| j        |j        k    r| j        |j        k    sdS t          j        r2| j        | j        |j        k    rdS | j        | j        |j        k    rdS dS r  )	r`   r  r$   r  r  r  check_TCPerror_seqackr  r  r  s     r]   r  zTCPerror.answers  s    %%% 	1? 	Z5;..Z5;..q% 	x#8uy((1x#8uy((1qr^   c                 *    t          j        |           S rs   r  r[   s    r]   r  zTCPerror.mysummary  r  r^   )	ru   rv   rw   r   r  r   r2   r  r  rz   r^   r]   r  r    s{        D	"	#	#$	% 		    & & & & &r^   r  c                       e Zd ZdZd Zd ZdS )UDPerrorzUDP in ICMPc                     t          |t                    sdS t          j        r"| j        |j        k    r| j        |j        k    sdS dS r  )r`   r$  r$   r  r  r  r  s     r]   r  zUDPerror.answers  sK    %%% 	1? 	Z5;..Z5;..qqr^   c                 *    t          j        |           S rs   r  r[   s    r]   r  zUDPerror.mysummary#  r  r^   Nr  rz   r^   r]   r  r    s7        D  & & & & &r^   r  c                       e Zd ZdZd Zd ZdS )	ICMPerrorzICMP in ICMPc                     t          |t                    sdS | j        |j        k    r| j        |j        k    sdS | j        dv r$| j        |j        k    r| j        |j        k    rdS dS dS )Nr   )r   r   r   r   r   r   rm   )r`   r  r  r  r   r  r  s     r]   r  zICMPerror.answers*  sw    %&& 	1ej((ej((19...58##H	))qq1r^   c                 *    t          j        |           S rs   r  r[   s    r]   r  zICMPerror.mysummary9  r  r^   Nr  rz   r^   r]   r  r  '  s7        D  & & & & &r^   r  i   r  )r  )r  )r  r  /   i  r  c                 *    t          |j                  S )zF
    Resolves the default L2 destination address when IP is used.
    )r   r  )l2l3s     r]   inet_register_l3r  V  s     bfr^   r  c                 *   |dk     rt          d           t          |d          }|}||dz  z  }g }| D ]]}t          |t                   j                  }t          |          |z
  |z   dz
  |z  dz   }t          |          D ]}|                                }|t                   `|t                   `|t                   `||dz
  k    r$|t                   xj	        dz  c_	        |dz   |z  }	n||z  |z   }	|t                   xj
        ||z  dz  z  c_
        t          j        |||z  |	                   }
|t                   j        j                                        |
_        |                    |
           |                    |           _|S )zFragment a big IP datagramr   zfragsize cannot be lower than 8rm   )r|  )rQ   r  r   r  r  r  rY  r  r  r  r  r$   	raw_layeroverload_fieldsadd_payloadrZ  )r   r  
lastfragszlstr   rX  nbiqfragendrs              r]   r  r  e  s    !||1222x##J1H
C  "!ffz!H,q0X=Ar 	 	AA"""	BF{{"q q5H,h,3bEJJ!h,!++JJAa(l7&:$;<<<A !" = B B D DAMM!JJqMMMM	 Jr^   c                    ||}|                                  }|t                   `|t                                       |           t	          ||          }|d         t                   xj        dz  c_        |t	          | |          z   S )zBuild overlapping fragments to bypass NIPS

p:                the original packet
overlap:          the overlapping data
fragsize:         the fragment size of the packet
overlap_fragsize: the fragment size of the overlapping packetNr  rm   )r  r  r  r  r  r  )r   overlapr  overlap_fragsizer  qfrags         r]   overlap_fragr    s     #	A	"bEgQ())E	"IbM18Ax((((r^   c                        e Zd Z fdZ xZS )BadFragmentsc                 ~    |                     dd           | _         t          t          |           j        |i | d S )Nfrags)popr  re  r  rK  )r\   r   rU  rg  s      r]   rK  zBadFragments.__init__  s@    ZZ..
*lD!!*D;F;;;;;r^   )ru   rv   rw   rK  rp  rq  s   @r]   r  r    s8        < < < < < < < < <r^   r  c              #      K   d}| D ]Z\  }}}||k    r(||k    rd}nd}t          d||||fz             t          ||z  }t          |t                   j                  V  [dS )z3
    Internal generator used in _defrag_ip_pkt
    r   ><z!Fragment overlap (%i %s %i) on %rN)rQ   r  r]  r  r  )r  rk  r   or   ops         r]   _defrag_iter_and_check_offsetsr    s       F 	% 	%QQ;;zz762q#:NNOOO&CGO$$$$$$	% 	%r^   c                 r   | t                    }| j        dk    s|j        j        r|j        |j        |j        |j        f}|j        |j	        t          |j
                  }n|j        |j	        dz  z
  }||                             | |j        dz  |f           |j        j        st          ||         d           }	 d                    t          |                    }n)# t          $ r ||         }||= t!          |          w xY w|d         d                                         }|t                    j
        j        }	d	|t                    j        _        |t                                                     d|t                    _        d|t                    _        | |	|          z  }||= d
|fS dS d	| fS )z
    Defragment a single IP packet.

    :param pkt: the new pkt
    :param frags: a defaultdict(list) used for storage
    :return: a tuple (fragmented, defragmented_value)
    r   Nr}   r   c                     | d         S r@  rz   ry  s    r]   r   z _defrag_ip_pkt.<locals>.<lambda>  s
    ! r^   )r  r^   )r  FT)TN)r  r  r  r  r   rY   r  r  r  r  r  rZ  rn   joinr  r  r  r  rg  r{  r  )
r   r  ipuidfraglencurfragsrl  badfragsr   	pay_classs
             r]   _defrag_ip_pktr    s    
RB
x1}}}ubfbfbh/6>RV^"*ooGGf!,Gc
31g6777x{ 	eCjnn===H3xx >x H HII 3 3 3 :#J"2222	3 A##%%A"/I"AbEKNbE  """AbEIAbEL4 Ac
7Nz#:s   "C$ $&D
Fc                    t          t                    }g }g }g }t          |           D ]\  }}t          |vr|r|                    |           &	 t          ||          \  }}	nN# t          $ rA}
|r|                    |
j                   n|                    |
j                   Y d}
~
d}
~
ww xY w|r|	r|                    |	           |	r-|r|                    |	           |                    |	           |r.t          | d          rd| j
        z  }nd}t          ||          S t          |          t          |          t          |          fS )z
    Internal function used to defragment a list of packets.
    It contains the logic behind the defrag() and defragment() functions
    NlistnamezDefragmented %sDefragmented)r   )r   rS  	enumerater  rZ  r  r  extendr  hasattrr  rL   )plistcompleter  finalnotfragbadfragr  r   
fragmenteddefragmented_valueexr   s               r]   _defrag_logicr    s   
 EEGGE"" 3 33S== "S!!!
	-;. .*J**  	 	 	 )RX&&&&rx(((HHHH	  	3* 	3LL+,,,, 	3 3/00001222 K5*%% 	"$u~5DD!D%d++++'""Ju$5$5z'7J7JJJs   A%%
B0/7B++B0c                 $    t          | d          S )zpdefrag(plist) -> ([not fragmented], [defragmented],
                  [ [bad fragments], [bad fragments], ... ])Fr  r  r  s    r]   defragr    s     ////r^   c                 $    t          | d          S )z<defragment(plist) -> plist defragmented as much as possible Tr  r  r  s    r]   
defragmentr    s     ....r^   c           
      L    ddl m}m}m}  fd j        D             }fd|D             }g }t          dd          }	|D ]n}
|
                    t                    j        }|D ]J}|d         dk    r<|	                    |
j
        |	                    d|d         d                   f           Ko|st          d	           g S |d         d         |d         d         dfd	fd|D             }|i k    r|} |j        |fi |}|s|                                 |S )zOTries to graph the timeskew between the timestamps and real time for a given ipr   )pltMATPLOTLIB_INLINEDMATPLOTLIB_DEFAULT_PLOT_KARGSc              3   B   K   | ]}                     |          V  d S rs   )_elt2pkt)rO  ry  r\   s     r]   rP  z-_packetlist_timeskew_graph.<locals>.<genexpr>  s/      
.
.4==
.
.
.
.
.
.r^   c              3   l   K   | ].}t           |v |t                    j        k    !t          |v *|V  /d S rs   )r  rY   r  )rO  ry  r  s     r]   rP  z-_packetlist_timeskew_graph.<locals>.<genexpr>   s=      DDq277quyB3!888888DDr^   r   Nr,  rm   z"No timestamps found in packet list  c                 <    | \  }}||z  }|z
  |z
  dz  z
  }||fS )zWrap the list of tuples.g     @@rz   )ts_tuplewrap_secondsctrtXYfirst_creation_timefirst_replied_timestamps         r]   
_wrap_dataz._packetlist_timeskew_graph.<locals>._wrap_data4  s<     B&&B1H,HF+RS!tr^   c                 &    g | ]} |          S rz   rz   )rO  er'  s     r]   rW  z._packetlist_timeskew_graph.<locals>.<listcomp>=  s!    %%%aJJqMM%%%r^   )r  )scapy.libs.matplotr  r  r  resr  getlayerr  rB  rZ  r  r  rQ   plotshow)r\   r  r   r  r  r  tmpbctsfr   optsr  rl  linesr'  r%  r&  s   ``             @@@r]   _packetlist_timeskew_graphr5    s             /
.
.
.TX
.
.
.CDDDDCDDDA 	A
R
&
&C ; ;zz#& 	; 	;At{""!&#))B!Q"8"89:::	;
  4555	 A$q'd1g       &%%%1%%%D {{-CHT##U##E  


Lr^   c                   \    e Zd Zg dZddZd Zd ZddZd	 Zd
 Z	ddZ
ej        dfdZdS )TracerouteResult)graphdefgraphpadding
graphASrespaddinghlocnlocN
Traceroutec                 z    t          j        | |||           d | _        d | _        d| _        d | _        d | _        d S r  )rM   rK  r8  r:  r;  r<  r=  )r\   r+  r   statss       r]   rK  zTracerouteResult.__init__S  s@    D#tU333				r^   c                 .    |                      d           S )Nc                 b    |                      d          | j        |                     d          fS )NzB%IP.dst%:{TCP:tcp%ir,TCP.dport%}{UDP:udp%ir,UDP.dport%}{ICMP:ICMP}z4%-15s,IP.src% {TCP:%TCP.flags%}{ICMP:%ir,ICMP.type%})r  rf   )rX  r  s     r]   r   z'TracerouteResult.show.<locals>.<lambda>\  s.    QYY7{-|-|-.U-.YY7m-n-n-p r^   )
make_tabler[   s    r]   r.  zTracerouteResult.show[  s'      p  p q q 	qr^   c                    i }| j         D ]^\  }}t          |vr|t                   j        }||vri ||<   |t                   j        t          |vf||         |t                   j        <   _|                                D ]Z}	 t          d |                                D                       }n# t          $ r Y ;w xY wt          |          D ]}||k    r||= [|S )Nc              3   0   K   | ]\  }}|d          |V  dS )rm   Nrz   )rO  ry  ys      r]   rP  z-TracerouteResult.get_trace.<locals>.<genexpr>k  s/      88da1Q48888888r^   )r+  r  r  rY   r  rf   rU  r  itemsr  rS  )r\   tracerX  r  dkr  lis           r]   	get_tracezTracerouteResult.get_trace`  s    H 	; 	;DAq{{"	A~~a"#B%)T]":E!HQrUY 	 	A88aggii88888   1gg  66" s    +B,,
B98B9Tc                     ddl }|                    | j                  }|                                 |r|                                 dS dS )a,  Give a 3D representation of the traceroute.
        right button: rotate the scene
        middle button: zoom
        shift-left button: move the scene
        left button on a ball: toggle IP displaying
        double-click button on a ball: scan ports 21,22,23,25,80 and 443 and display the resultr   N)target)multiprocessingProcesstrace3D_notebookstartr  )r\   r  rO  r   s       r]   trace3DzTracerouteResult.trace3Ds  sY     	##4+@#AA				 	FFHHHHH	 	r^   c                 R   |                                  }ddl G fddj                                                  _        d| j        z  j        _        j                            t          j	        ddt          j	        dd	d
                               dj        _
        i }i }|D ]}||         }g ||<   t          dt          |          dz             D ]}||vrg ||<   ||v rl||         ||         vr!||                             ||                    ||                             ||                             ||                              {||                             d           ||                             t          ||                   dz
             Ȍ|D ]@}||         }t          |          }t          |          D ]}||         d         dk    r                    ddd          }	n'||         d         rj        j        }	nj        j        }	                     |dz
                      d|z  j        z  |z            z  |dz
                      d|z  j        z  |z            z  d|z            ||         d         |	          }
|                                D ],}|t          |          k    r||dz
           |k    r|
||dz
  <   -Bt1          dddd          }|                                D ]]} j        t3          |           }	                    ddd          }|D ]*}                    ||j        |z
  |	d           |j        }+^                    d           fd}j                            d|           dS )z7Same than trace3D, used when ran from Jupyter notebooksr   Nc                   B    e Zd Z fdZ fdZd Zd fd	Zd Zd ZdS )	3TracerouteResult.trace3D_notebook.<locals>.IPspherec                      j         j        | fi | || _        d | _        |                     | j                   d | _        d| _         j        | j        j	         | _
        d S NF)sphererK  r  labelsetlabellast_clickedfullveccolorr   savcolor)r\   r  r   vpythons      r]   rK  z<TracerouteResult.trace3D_notebook.<locals>.IPsphere.__init__  sj    ''66666!
dg&&&$(!!	 +TZ-= >r^   c                    d| _                             ddd          | _        t          t	          | j                  t          g dd          z  dd	          \  }}t          |          dk    rd
| j        z  }n*d| j        z  }|D ]\  }}||                    d          z  }| 	                    |d           d S )NTrm   r   r  )r      r   r   r  i  r  )r  r  r}   timeoutverbosez%s:
no resultsz%s:
zh{TCP:%IP.src%:%TCP.sport% %TCP.flags%}{TCPerror:%IPerror.dst%:%TCPerror.dport% %IP.src% %ir,ICMP.type%}
)visible)
r]  r^  r_  rI   r  r  r  r  r  r[  )r\   ar0  txtrX  r  ra  s         r]   	fullinfosz=TracerouteResult.trace3D_notebook.<locals>.IPsphere.fullinfos  s     	$[[Aq11
"///C6O6O6OWZ,[,[,[[efpqrrr1q66Q;;+dg5CC!DG+C ! V V1qyy  *U   V   V  Vc1-----r^   c                 `    | j         | _        d| _        |                     | j                   d S rX  )r`  r_  r]  r[  r  r[   s    r]   unfullz:TracerouteResult.trace3D_notebook.<locals>.IPsphere.unfull  s,    !]
!	dg&&&&&r^   Nc                     | j         || j         j        }d| j         _        n|d}                     || j        | j        dd|          | _         d S )Nr   r   r   )textposspacexoffsetyoffsetrh  )rZ  rh  rp  radius)r\   rj  rh  ra  s      r]   r[  z<TracerouteResult.trace3D_notebook.<locals>.IPsphere.setlabel  s[    :)"&*"4)*DJ&&_G$]]^`jlv}]~~


r^   c                 L   	 | j         s| j        j        s	 t          j                    | _        dS | j        7t          j                    | j        z
  dk     t          j                    | _        S 	 t          j                    | _        dS # t          j                    | _        w xY w)NFg      ?)r]  rZ  rh  r  r\  r[   s    r]   check_double_clickzFTracerouteResult.trace3D_notebook.<locals>.IPsphere.check_double_click  s    4y %
(: %$
 )-	D%%%	 (4 $	d.? ?3F )-	D%% !(,	D%%%	D%3333s   B	 %B	 	B#c                 j    | j         xj        dz  c_        | j        r|                                  d S d S r@  )rZ  rh  r]  rm  r[   s    r]   actionz:TracerouteResult.trace3D_notebook.<locals>.IPsphere.action  s=    
""a'""9 "KKMMMMM" "r^   rs   )	ru   rv   rw   rK  rk  rm  r[  rv  rx  )ra  s   r]   IPsphererV    s        ? ? ? ? ?
. 
. 
. 
. 
.' ' '
     4 4 4" " " " "r^   ry  z!<center><u><b>%s</b></u></center>z\%(.*)\%z"<span style="color: red">\1</span>z\`(.*)\`z&<span style="color: #3399ff">\1</span>a  <u><b>Commands:</b></u>
%Click% to toggle information about a node.
%Double click% to perform a quick web scan on this node.
<u><b>Camera usage:</b></u>
`Right button drag or Ctrl-drag` to rotate "camera" to view scene.
`Shift-drag` to move the object around.
`Middle button or Alt-drag` to drag up or down to zoom in or out.
  On a two-button mouse, `middle is wheel or left + right`.
Touch screen: pinch/extend to zoom, swipe or two-finger rotate.Trm   )unkr  r  g      ?r}   )rp  r  r_  g      ?g      ?g      ?g      ?皙?)rp  axisr_  rt  2   c                    | j         dk    rpj        j        j        }|r_t	          |          rQ|                                r#|j        dk    rd S |                                 d S |                                 d S d S d S d S )Nleftrz  )	pressscenemousepickr`   rv  r  rk  rx  )evr  ry  ra  s     r]   mouse_clickz6TracerouteResult.trace3D_notebook.<locals>.mouse_click  s    x6!!M', #Ax00 #++-- #45=="F




 "!# # # #r^   	mousedown)rL  ra  rY  canvasr  r  titleappend_to_captionr[  subexitrY  r  rZ  ro   r  r^  r_  greenbluecospisinrU  r
   r  cylinderrp  ratebind)r\   rH  ringstr3dr  trrp   r  r  colrX  trlstforecolrR  r  r  ry  ra  s                   @@r]   rQ  z!TracerouteResult.trace3D_notebook  sr     1	" 1	" 1	" 1	" 1	" 1	" 1	"w~ 1	" 1	" 1	"f  ((ADMQ''F5=C  	
 	
 	
& " 	6 	6AqBDG1c"ggk** 	6 	6E>>!E!H77!uE!H,,a1...GNN58>>"Q%#8#89999!HOOK000GNN3uQx==1#45555	6  	- 	-AaA!ffG7^^ - -Q47b==!++dD$77CCqT!W -!--CC!-,CHgkW[[QQXQ[I[^eIe=f=f-fipstitx  yD  yD  EF  IJ  EJ  MT  MW  EW  Za  Ea  yb  yb  ib  de  hi  di  "j  "j !!Q#&( ( ( "[[]] - -ECJJ Q<1,,+,E!a%L-- e44[[]] 	 	E'+tG}}-CKK1a((E    U%sSV WWW 	R		# 		# 		# 		# 		# 		# 	;44444r^   c                    ddl m}m}m} 	 ddl}ddl}n&# t          $ r t          j        d           g cY S w xY wt          j
        st          j        d           g S 	 ddlm} n&# t          $ r t          j        d           g cY S w xY w|st          j        d           g S 	 |j                            t          j
                  }n1# t          $ r$ t          j        dt          j
                   g cY S w xY wi }i }i }	| j        D ]\  }
}d||j        <   |
                    t&                    s|
                    t(                    r|
j        |
j        |
j        |
j        f}nJ|
                    t0                    r|
j        |
j        |
j        |
j        f}n|
j        |
j        |
j        df}|                    |i           }|                    t0                    r|j        d	k    r
||	v rd|	|<   |j        ||
j        <   |||<   i }|D ]}||         }g }t9          t;          |                    D ]r}|                    |d          }|	 |                    |          }n# |j        j         $ r Y Cw xY w|!                    |j"        j#        |j"        j$        f           s|r|||<   |%                    d
           |&                    |'                                          (                                 )                                 *                                 |+                    d           ddl,m-} ddl.m/} ta          |j1                  }g }|2                                D ]\  }tg          |          fdt9          ti                    dz
            D             } ||d|d                   }|!                    |           5                    |           |6                    fdD                        7                                 |s|8                                 9                                 |S )z*Display traceroute results on a world map.r   )r  
MATPLOTLIBr  Nz6Cannot import geoip2. Won't be able to plot the world.zCannot import the geolite2 CITY database.
Download it from http://dev.maxmind.com/geoip/geoip2/geolite2/ then set its path to conf.geoip_cityz_Cannot import cartopy.
More infos on http://scitools.org.uk/cartopy/docs/latest/installing.htmlz=Matplotlib is not installed. Won't be able to plot the world.z!Cannot open geoip2 database at %sr   Scapy)num)
projectionzScapy traceroute results)LineCollection)colorsc                 6    g | ]}|         |d z            fS )rm   rz   )rO  r  trcs     r]   rW  z0TracerouteResult.world_trace.<locals>.<listcomp>  s*    LLL13q63q1u:.LLLr^   rm   r}   )
linewidthsrZ  r_  c                 ,    g | ]} j         |d dS ).)markerr_  )r-  )rO  ry  axr_  s     r]   rW  z0TracerouteResult.world_trace.<locals>.<listcomp>  s,    LLL1'"'1S>>>LLLr^   ):r*  r  r  r  geoip2.databasegeoip2.errorsImportErrorrP   errorr$   
geoip_citycartopy.crscrsdatabaseReader	Exceptionr+  rY   haslayerr  r$  r  r  r  r  r  r  rf   rY  r  cityerrorsAddressNotFoundErrorrZ  location	longitudelatitudefigureaxesPlateCarree
coastlines	stock_img
set_globalr  matplotlib.collectionsr  
matplotlibr  r  BASE_COLORSrG  r  r  add_collectionr  legendr.  remove)r\   r  r  r  geoip2ccrsdbipsr"  
ports_donerX  r  trace_idrH  trtloctracer  r  sresultr  mcolorscolors_cycler4  r  
data_linesline_colr  r_  r  s                             @@@r]   world_tracezTracerouteResult.world_trace  s(   
 	KJJJJJJJJJ	""""      	 	 	H   III		  	8  
 I	&&&&&&& 	 	 	[   III	  	O   I	''88BB 	 	 	3   III	 
H 	! 	!DAqCJzz# 6!**S// 6E15!'17;D!! 6E15!'16:E15!'15FF8R((E::d## ,qv||z))'+
8$5E!%L BxLL  	) 	)HxLEH3u::&& 	Y 	YYYq$'': ggbkkGG}9   H!1!;W=M=V WXXXX ) (H 	

w
XX!1!1!3!3X44


		,---999999000000G/00 		 	N 	NHC&&ELLLLc#hhl8K8KLLLJ%~jQ,/F,13 3 3H LL"""h'''LLLLLLLLLLMMMM 			 " 	HHJJJ 			 sB     ;;!A( ( B
B'$C +C:9C:I,,I>=I>r   c                    || _         || _        i }i }i }i }| j        D ]\  }}|                    t                    p)t
          j        r|t          j        j	        j
                 p|}|                    t                    p)t
          j        r|t          j        j	        j
                 p|}d ||j        <   t          |v r|j        |j        d|j        f}	nSt          |v r|j        |j        d|j        f}	n4t           |v r|j        |j        d|j        f}	n|j        |j        |j        df}	|                    |	i           }
t
          j        rt          j        j	        j
        |v r|j        p|j        }t           |v r|t                    j        dk    st
          j        r1t          j        j	        j
        |v rt          j        j	        j        |v sO|	|v rd ||	<   |                    |j        g           }t          |v rA|                    |                    d                     |                    d          |
|<   nt          |v rA|                    |                    d                     |                    d	          |
|<   nt           |v rA|                    |                    d
                     |                    d          |
|<   n@|                    |                    d                     |                    d          |
|<   |||j        <   n|                    d          |
|<   |
||	<   t3          d          }g }i }|D ]}||         }
t5          |
          }t7          t9          |
          |          D ]}||
vrt;          |          |
|<   ||vr|d         dk    rd|d         |d         fz  }nS|d         dk    rd|d         |d         fz  }n3|d         dk    rd|d         |d         fz  }nd|d         |d         fz  }d ||<   |||d         <   d|z  }||
|dz   <   |                    |           t=          d |D                       }|g }n
 |j        | }i }i }|D ]w\  }}}|	|                    |g           }||v r5||v r|                    |           |                    ||                    n|                    |           |||<   |||<   xtA          dddd          }tA          dddd          }d }|d!z  }|d"z  }|D ]X}|d#|z  z  }t;          |          }|d$|z  z  }|d%|z  z  }|d&z  }|d'|d(||         d)z  }||         D ]
}|d*|z  z  }|d+z  }Y|d,z  }|D ]*}|d-|d.|d/d/!                    ||                   d0z  }+|d1z  }|D ]
}|d2|z  z  }|r|d3z  }i }| j        D ]q\  } }!|!j        |vrc|!"                    t
          j#                  rD|!                    t
          j#                  j$        }|d4tK          |          z  k    r
d ||!j        <   r|D ]
}!|d5|!z  z  }|d!z  }|D ]}|d6tM          |          z  z  }|d7t;          |          z  z  }||         }
t5          |
          }"t7          t9          |
          |"          D ]}|d8|
|         z  z  }|d9|
|"         z  z  }|d:z  }|| _'        d S );Nr   r   rm   r   r   z)<T%ir,TCP.sport%> %TCP.sport% %TCP.flags%z"%r,src%":T%ir,TCP.sport%z<U%ir,UDP.sport%> %UDP.sport%z"%r,src%":U%ir,UDP.sport%z"<I%ir,ICMP.type%> ICMP %ICMP.type%z"%r,src%":I%ir,ICMP.type%z8{IP:<P%ir,proto%> IP %proto%}{IPv6:<P%ir,nh%> IPv6 %nh%}z)"%r,src%":{IP:P%ir,proto%}{IPv6:P%ir,nh%}z	"%r,src%"zunk%ir}   z
%s %i/icmpr   z	%s %i/tcpz	%s %i/udpz%s %i/protoz"%s"c              3   N   K   | ] }|                     d d          d         V  !dS ) rm   r   N)rsplitr  s     r]   rP  z.TracerouteResult.make_graph.<locals>.<genexpr>  s5      >>QQXXc1--a0>>>>>>r^   6086baffa0704020zdigraph trace {
z1
	node [shape=ellipse,color=black,style=solid];

z
#ASN clustering
z	subgraph cluster_%s {
z		color="#%s%s%s";z*		node [fillcolor="#%s%s%s",style=filled];z		fontsize = 10;z		label = "z\n[z]"
z		"%s";
z	}
z#endpoints
z	"z@" [shape=record,color=black,fillcolor=green,style=filled,label="|z"];
z
#Blackholes
z<	%s [shape=octagon,color=black,fillcolor=red,style=filled];
z

#Padding
r  z?	"%s" [shape=triangle,color=black,fillcolor=red,style=filled];
z#---[%s
z		edge [color="#%s%s%s"];
z	%s ->
z	%s;
z}
)(r:  r9  r+  r,  r  r$   r  ra   rb   rc   rd   rY   r  r  r  r$  r  r  r  r  re   rf   ICMPv6TimeExceededrZ  r  r   r  rY  r  r  setresolver
   r  r  rz  r|  r  reprr8  )#r\   ASresr;  r  r"  portsr  rX  r  r  rH  rf   r   unknown_label
blackholesbhiprtk	max_tracenbhASN_query_listASNlistASNsASDsr  asndesciplistbackcolorlistforecolorlistr  ro  sndrcvmaxtraces#                                      r]   
make_graphzTracerouteResult.make_graph  s   #
H "	! "	!DAq

2Y4#4#S5<;M;R9SYXYA

2Y4#4#S5<;M;R9SYXYACJaxxE15!QW5E15"ag6E15!QV4E15!'15FF8R((E#O(:(?1(DOXSTSXCAII!D',""4"4t?P"4UZUaUgUlpqUqUqv{  wC  wI  w\  `a  wa  waz))'+
8$IIaeR((!88HHQYY'RSSTTT!"+F!G!GE#JJAXXHHQYY'FGGHHH!"+F!G!GE#JJQYYHHQYY'KLLMMM!"+F!G!GE#JJHHQYY'abbccc!"+V!W!WE#J aeYY{33c
 BxLL *'22
 	& 	&CsGEE

I3u::y11 3 3E>>#M22E!H*$$q6Q;;%QQ(88BBVq[[$AA'77BBVr\\$AA'77BB&#a&#a&)99BB!SVb[')i!m$!!"%%% >>#>>>>>=GG#em^4G% 	 	NBT{XXc2&&FTzz;;MM"%%%d2h''''b!!!DIDIItT466tT466	DD	"" 
	 
	C,s22A}%%C'#--A?#EEA%%AAT#YYY??A3i ( (]R''LAA	^ 	@ 	@AAfgfgfgijijijloltltuz{|u}l~l~l~l~AA	 	W 	WBQTVVVAA 		_AC H , ,S7%''CLL9K,L,L'T%788=AGc!ff,,,'+CG _ _X[^^^	DD 	- 	-CtCyy((A043F3FFFAsGE5zzH3u::x00 , ,[58++U8_,,AA	U
r^   c                     | j         | j        |k    s| j        |k    r|                     ||           t	          | j         fi |S )a  x.graph(ASres=conf.AS_resolver, other args):
        ASres=None          : no AS resolver => no clustering
        ASres=AS_resolver() : default whois AS resolver (riswhois.ripe.net)
        ASres=AS_resolver_cymru(): use whois.cymru.com whois database
        ASres=AS_resolver(server="whois.ra.net")
        type: output type (svg, ps, gif, jpg, etc.), passed to dot's "-T" option  # noqa: E501
        target: filename or redirect. Defaults pipe to Imagemagick's display program  # noqa: E501
        prog: which graphviz program to use)r8  r:  r9  r  r   )r\   r  r;  r   s       r]   graphzTracerouteResult.graph&  sS     M!Ou$$!W,,OOE7+++/////r^   )Nr>  N)Tr  )ru   rv   rw   ry   rK  r.  rL  rS  rQ  r  r  r$   AS_resolverr  rz   r^   r]   r7  r7  O  s          I   q q q
  &   P5 P5 P5dA A AFM M M M^ *A 0 0 0 0 0 0r^   r7  r  c	                    |t           j        }|d}|Rt          t          | t	                      ||f          t          t                      ||          z  f|||d|	\  }
}n7d}t          t          | t	                      ||f          |z  f|||d|	\  }
}t          |
j                  }
|r|
	                                 |
|fS )aH  Instant TCP traceroute

       :param target:  hostnames or IP addresses
       :param dport:   TCP destination port (default is 80)
       :param minttl:  minimum TTL (default is 1)
       :param maxttl:  maximum TTL (default is 30)
       :param sport:   TCP source port (default is random)
       :param l4:      use a Scapy packet instead of TCP
       :param filter:  BPF filter applied to received packets
       :param timeout: time to wait for answers (default is 2s)
       :param verbose: detailed output
       :return: an TracerouteResult, and a list of unanswered packetsNzq(icmp and (icmp[0]=3 or icmp[0]=4 or icmp[0]=5 or icmp[0]=11 or icmp[0]=12)) or (tcp and (tcp[13] & 0x16 > 0x10)))r  r   rf   )r  r  r  )rf  filterrg  r  )
r$   verbrI   r  rD   r  rE   r7  r+  r.  )rN  r  minttlmaxttlr  l4r  rf  rg  r   ri  r0  s               r]   r   r   7  s    )~ E	z"IKKff5EFFFQXQZQZbgotIuIuIuu L!&'L LEJL L11 "IKKff5EFFFK L!&'L LEJL L1 	A 	a4Kr^   c                 |    |                     dd           t          |           d                                         S )zUtil function to call traceroute on multiple targets, then
    show the different paths on a map.

    :param ips: a list of IPs on which traceroute will be called
    :param kargs: (optional) kwargs, passed to traceroute
    rg  r   )
setdefaultr   r  )r  r   s     r]   traceroute_mapr  [  s7     
Y"""c??1))+++r^   c                      e Zd ZdZd&dZd Zd Z ej        d          d             Z	 ej                    d	             Z
 ej                    d
             Z ej                    d             Z ej        d          d             Z ej        d          d             Z ej                    d             Z ej        e	          d             Z ej        e          d             Z ej        e
          d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej        edd          d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej        e          d              Z  ej        e           d!             Z! ej        e          d"             Z" ej        e"          d#             Z# ej$        e
d          d$             Z% ej$        ed          d%             Z&dS )'
TCP_clientaw  
    Creates a TCP Client Automaton.
    This automaton will handle TCP 3-way handshake.

    Usage: the easiest usage is to use it as a SuperSocket.
        >>> a = TCP_client.tcplink(HTTP, "www.google.com", 80)
        >>> a.send(HTTPRequest())
        >>> a.recv()

    :param ip: the ip to connect to
    :param port:
    :param src: (optional) use another source IP
    Nc           
         ddl m} t          t          |                    | _        || _        t          j        dd          | _        t          ||          t          | j        | j        dt          j        dd                    z  | _        | j        j        | _        | j        t                   j        | _        d | _         |            | _        d| j        | j        | j        | j        fz  }t#          j        | fd|i| d S )	Nr   )
TCPSessioni   )r  rY   l        )r  r  r  r  z,host %s  and host %s and port %i and port %ir  )scapy.sessionsr	  r  r   r  r  rQ  	randranger  r  r  r  rY   r  sackrel_seqrcvbufrN   
parse_args)r\   r  portsrcipr   r	  bpfs          r]   r  zTCP_client.parse_argsz  s   ------s2ww<<
%a//
'''#*DJ)!U33+
 +
 +
 
 7;GCL$	 jll<@D@D
@D
@L L 	T77#777777r^   c                 ~    | j         j                            t          |t                   j                             dS )z5Transmits a packet from TCPSession to the SuperSocketN)oir  sendr   r  r  r\   r   s     r]   _transmit_packetzTCP_client._transmit_packet  s/    SX-../////r^   c                 &   t           |v o|t                    j        | j        k    o|t                    j        | j        k    ot          |v o|t                   j        | j        k    o|t                   j        | j        k    o| j        t                   j        |t                   j        k    og| j        t                   j        dk    pL| j	        |t                   j        cxk    o-| j        t                   j        |t                   j
        z   k    nc S r  )r  rY   r  r  r  r  r  r  r  r  r  r  s     r]   master_filterzTCP_client.master_filter  s    c	 oBtx'oBtx'o s
o C$*,	o
 C$*,o  CHL0o '#,"a'mTY#c(,-l-l-l-l$'RU,JZ]`ad]e]lJl-l-l-l-l	pr^   rm   )initialc                     d S rs   rz   r[   s    r]   STARTzTCP_client.START      r^   c                     d S rs   rz   r[   s    r]   SYN_SENTzTCP_client.SYN_SENT  r  r^   c                     d S rs   rz   r[   s    r]   ESTABLISHEDzTCP_client.ESTABLISHED  r  r^   c                     d S rs   rz   r[   s    r]   LAST_ACKzTCP_client.LAST_ACK  r  r^   )r  c                     d S rs   rz   r[   s    r]   CLOSEDzTCP_client.CLOSED  r  r^   )stopc                     d S rs   rz   r[   s    r]   STOPzTCP_client.STOP  r  r^   c                     d S rs   rz   r[   s    r]   STOP_SENT_FIN_ACKzTCP_client.STOP_SENT_FIN_ACK  r  r^   c                 *    |                                  rs   )r  r[   s    r]   connectzTCP_client.connect  s    mmoor^   c                     d| j         t                   _        |                     | j                    | j         t                   xj        dz  c_        d S )Nr  rm   r  r  r  r  r  r[   s    r]   send_synzTCP_client.send_syn  sD     		$'Ar^   c                     |t                    j        j        r'|                                                     |          d S rs   )r  r  SAr!  action_parametersr  s     r]   synack_receivedzTCP_client.synack_received  s=    s8> 	<""$$66s;;;	< 	<r^   c                     |t                    j        dz   | j        t                    _        d| j        t                    _        |                     | j                   d S )Nrm   r   )r  r  r  r  r  r  r  s     r]   send_ack_of_synackzTCP_client.send_ack_of_synack  sC    s8<!+ 		$'r^   c                     t          |t                   j        t          t          j        f          s'|                                                     |          d S rs   )r`   r  r  rC   r$   rz  r!  r2  r  s     r]   incoming_data_receivedz!TCP_client.incoming_data_received  sM    #c(*Y8J,KLL 	<""$$66s;;;	< 	<r^   c                     t          |t                   j                  }|r| j        t                   j        |t                   j        k    r| j        t                   j        | _        | j        t                   xj        t          |          z  c_        d| j        t                   _        | 	                    | j                   | j
                            |          }|r|                     |           d S d S d S d S )Nr   )r   r  r  r  r  r  r  r  r  r  r  processr  )r\   r   rl  s      r]   receive_datazTCP_client.receive_data  s    3s8#$$ 		+DGCL$C44(DIGCLD		)!$DGCLIIdg+%%c**C +%%c*****		+ 		+44+ +r^   r  tcplink)r   as_supersocketc                 t    |                                                      |                                          rs   )r!  r2  recv)r\   fds     r]   outgoing_data_receivedz!TCP_client.outgoing_data_received  s*      2227799===r^   c                     d| j         t                   _        |                     | j         |z             | j         t                   xj        t          |          z  c_        d S )NPA)r  r  r  r  r  r  )r\   rI  s     r]   	send_datazTCP_client.send_data  sN    !		$'A+CFF"r^   c                 \    |t                    j        j        r|                                 d S rs   )r  r  r  r%  r  s     r]   reset_receivedzTCP_client.reset_received  +    s8> 	 ++--	  	 r^   c                     |t                    j        j        r'|                                                     |          d S rs   )r  r  Fr#  r2  r  s     r]   fin_receivedzTCP_client.fin_received  s9    s8> 	9--//33C888	9 	9r^   c                     d| j         t                   _        |t                   j        dz   | j         t                   _        |                     | j                    | j         t                   xj        dz  c_        d S NFArm   r  r  r  r  r  r  r  s     r]   send_finackzTCP_client.send_finack  s]    !s8<!+		$'Ar^   c                 \    |t                    j        j        r|                                 d S rs   )r  r  r   r%  r  s     r]   ack_of_fin_receivedzTCP_client.ack_of_fin_received  rF  r^   c                 *    |                                  rs   )r*  r[   s    r]   stop_requestedzTCP_client.stop_requested  s    $$&&&r^   c                     d| j         t                   _        |                     | j                    | j         t                   xj        dz  c_        d S rK  r.  r[   s    r]   stop_send_finackzTCP_client.stop_send_finack	  sD    !		$'Ar^   c                     |t                    j        j        r'|                                                     |          d S rs   )r  r  rH  r%  r2  r  s     r]   stop_fin_receivedzTCP_client.stop_fin_received		  s9    s8> 	7++--11#666	7 	7r^   c                     d| j         t                   _        |t                   j        dz   | j         t                   _        |                     | j                    d S )Nr   rm   rM  r  s     r]   stop_send_ackzTCP_client.stop_send_ack	  sC     s8<!+		$'r^   c                 *    |                                  rs   r%  r[   s    r]   syn_ack_timeoutzTCP_client.syn_ack_timeout	      kkmmr^   c                 *    |                                  rs   rZ  r[   s    r]   stop_ack_timeoutzTCP_client.stop_ack_timeout	  r\  r^   rs   )'ru   rv   rw   rx   r  r  r  rO   stater  r  r!  r#  r%  r(  r*  	conditionr,  rx  r/  receive_conditionr3  r5  r7  r:  ioeventr@  rC  rE  rI  rN  rP  rR  rT  rV  rX  rf  r[  r^  rz   r^   r]   r  r  k  sG        8 8 8 8&0 0 0p p p TZ   TZ\\  \ TZ\\  \ TZ\\  \ TZa   TZQ   TZ\\  \ T^E   T[  
 TH%%< < &%< T[!!  "!
 TK((< < )(< T['((+ + )(+ T\+E)DDD> > ED> T['((# # )(#
 TK((    )(  TK((9 9 )(9 T[   TH%%    &%  T^D' ' ' T[    ! 
 T-..7 7 /.7 T["##  $#
 T\(A   T\#Q''  ('  r^   r  c                 "   t          t          |           t          |          z  d          \  }}d}|D ]G\  }}|                    t                    s(|j        j        dk    r||                    d          z  }H|dz  }|D ]`\  }}|                    t                    r||                    d	          z  }8|j        j        dk    r||                    d
          z  }a|dz  }|D ]}||                    d          z  }|dz  }|S )zPportscan a target and output a LaTeX table
report_ports(target, ports) -> stringrc  r  r   )rf  z \begin{tabular}{|r|l|l|}
\hline
r   z%TCP.sport% & open & SA \\
z\hline
zO%TCPerror.dport% & closed & ICMP type %ICMP.type%/%ICMP.code% from %IP.src% \\
z*%TCP.sport% & closed & TCP %TCP.flags% \\
z %TCP.dport% & ? & unanswered \\
z\hline
\end{tabular}
)rI   r  r  r  r  r  r  r  )rN  r  ansunansreprX  r  r  s           r]   report_portsrg  "	  s@    B6NNNSu%5%5%55qAAAJC
0C C C1zz$ 	Cy$&&qyy!ABBB;C N N1::d 	N199qrrrCCY_$$199LMMMC;C @ @qyy>???&&CJr^   c                     | d         j         S r@  )r   r  s    r]   r   r   :	  s    QqTW r^   c                 6    | d                                          S r@  )summaryr  s    r]   r   r   :	  s    1 r^   c                 x   fd| D             }|                                  |d         g}|d t          |dd         |dd                   D             z  }fd| D             } |                                   t          dt          |          |fz             | D ]\  }}t          d	|z  |           dS )
zIdentify IP id values classes in a list of packets

lst:      a list of packets
funcID:   a function that returns IP id values
funcpres: a function used to summarize packetsc                 &    g | ]} |          S rz   rz   )rO  r)  funcIDs     r]   rW  zIPID_count.<locals>.<listcomp>@	  s!    $$$1VVAYY$$$r^   r   c                 b    g | ],}t          |d          |d         z
            dk    $|d         -S )r   rm   r}  )r!  )rO  rp   s     r]   rW  zIPID_count.<locals>.<listcomp>C	  s:    RRRC!qt<L<Lr<Q<Q!<Q<Q<Qr^   Nr  rm   c                 <    g | ]} |           |          fS rz   rz   )rO  ry  rm  funcpress     r]   rW  zIPID_count.<locals>.<listcomp>D	  s.    
1
1
1FF1IIxx{{#
1
1
1r^   zProbably %i classes: %sz%5i)sortziprX   r  )r  rm  rp  idlstclassesr   prs    ``    r]   
IPID_countrv  9	  s     %$$$$$$E	JJLLLQxjGRRc%*eABBi88RRRRG
1
1
1
1
1S
1
1
1CHHJJJ	
#s7||W&=
=>>>  Bebj" r^   {   r{  c                    d}t          | t                      dd          }|t          ||          |z  z  }t          j                    }d}	i }
	 ||rn|t          |t                    r|dz  }	 |	s|                    |           t          j        |gg g |          d         }|sZ|	                    d          }t          |t                     st          |j
        t                    st          |j
        j
        t                    s|j
        j
        j        | k    r|j        | k    rt          d|j                   |                    t          j                  s|                    t          j                  j        }||
vrd |
|<   t)          ||	           n# t*          $ r |	r d}	Y nw xY w|i|ld S d S # t*          $ r Y d S w xY w)
NXXXXYYYYYYYYYY(                                           rm   )r  r   rB  r  )r  r  r   i@  z	leak fromonlyasc)r  rD   r$  r$   L3socketr`   r  r  selectr>  r  r  r  r  rY   rX   r  rz  r,  r|  r   KeyboardInterrupt)rN  r  r  rf  r|  countr|  r   rX  intrfoundr  rd  leaks                 r]   fragleakr  K	  s
   D
IKKQ
G
G
GC3U%(((4//CADE mum Zs%;%; 
  FF3KKKmQCR99!< ffTll!#r** !#+t44 !#+"5w?? ;&*f447f$$+sw///||D$677 ||D$677<u$$"&E$Kg6666$    5 mummmmm<    s~   !G 37F' *G +*F' G F' 0G 1F' G F' &G '?F' &G (>F' &G 'F96G 8F99	G 
GG皙?c                 P   i }	 ||r|t          |t                    r|dz  }t          | dd          }|dz  }t          ||d          }|sLt          j        |v r1|t          j                 j        }||vrd ||<   t          ||           ||d S d S # t          $ r Y d S w xY w)	Nrm   rz     )r  rB  r  XXXXYYYYYYYYYYYYr   re  r{  )	r`   r  r  rJ   r$   rz  r|  r   r  )rN  rf  r|  r  r  r   r   r  s           r]   	fragleak2r  v	  s    Emum Zs%;%; 
SAAAC%%CC!444A !Q&&+,1u$$"&E$Kg6666 mummmmm    s   BB 
B%$B%c                        e Zd ZdZddZd ZdS )	connect_from_ipa  
    Open a TCP socket to a host:port while spoofing another IP.

    :param host: the host to connect to
    :param port: the port to connect to
    :param srcip: the IP to spoof. the cache of the gateway will
                  be poisonned with this IP.
    :param poison: (optional, default True) ARP poison the gateway (or next hop),
                   so that it answers us (only one packet).
    :param timeout: (optional) the socket timeout.

    Example - Connect to 192.168.0.1:80 spoofing 192.168.0.2::

        from scapy.layers.http import HTTP, HTTPRequest
        client = connect_from_ip("192.168.0.1", 80, "192.168.0.2")
        sock = SSLStreamSocket(client.sock, HTTP)
        resp = sock.sr1(HTTP() / HTTPRequest(Path="/"))

    Example - Connect to 192.168.0.1:443 with TLS wrapping spoofing 192.168.0.2::

        import ssl
        from scapy.layers.http import HTTP, HTTPRequest
        context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
        client = connect_from_ip("192.168.0.1", 443, "192.168.0.2")
        sock = context.wrap_socket(client.sock)
        sock = SSLStreamSocket(client.sock, HTTP)
        resp = sock.sr1(HTTP() / HTTPRequest(Path="/"))
    Trm   r   c                    t          t          |                    }|rPt          j                            |          d         }|dk    r|}t	          |           t          ||ddd           t          j                    \  | _        | _	        | j	        
                    |           t          |||d| j        i|          | _        | j                                         d S )Nr}   r   rm   r   )r  intervalrg  r  )r  external_fdr   )r  r   r$   r  r   r   r  
socketpair_socksock
settimeoutr  clientrunbg)r\   hostr  r  poisonrf  r   gateways           r]   rK  zconnect_from_ip.__init__	  s    3t99~~ 	Kj&&t,,Q/G)##w7EQJJJJ & 1 3 3
DI	W%%% $
+	
 
 
 	r^   c                     | j                                          | j                                          | j                                         | j                                         d S rs   )r  r&  destroyr  closer  r[   s    r]   r  zconnect_from_ip.close	  sV    	
r^   N)Trm   r   )ru   rv   rw   rx   rK  r  rz   r^   r]   r  r  	  sA         >   ,    r^   r  c                   (    e Zd ZdZdZd Zd Zd ZdS )ICMPEcho_amz%Responds to ICMP Echo-Requests (ping)	icmpechodc                     |                     t                    r'|                    t                    }|j        dk    rdS dS )Nr   TF)r  r  r,  r  )r\   reqicmp_reqs      r]   
is_requestzICMPEcho_am.is_request	  s>    << 	||D))H}!!tur^   c                 p    t          d|t                   j        d|t                   j                   d S )Nz	Replying z to )rX   r  r  r\   r  replys      r]   print_replyzICMPEcho_am.print_reply	  s/    U2Y]]]CGKK@AAAAAr^   c                 F   |                                 }d|t                   _        d |t                   _        |                    t
                    rW|t
                   j        |t
                   j        c|t
                   _        |t
                   _        d |t
                   _        |                    t                    r]|t                   j        dk    rd n|t                   j        |t                   j        c|t                   _        |t                   _        |S )Nr   zff:ff:ff:ff:ff:ff)	r  r  r  r  r  r  r  rY   r   r  s      r]   
make_replyzICMPEcho_am.make_reply	  s    

d!d<< 	$+.r7;B(E"IM59=#E"I<< 	E
*===3u:>E
 /E%LeEl. r^   N)ru   rv   rw   rx   function_namer  r  r  rz   r^   r]   r  r  	  sO        //M  B B B    r^   r  r  )r   N)F)rw  rw  r{  r   N)r  r   N)rx   r  r  r[  rQ  r~  r  collectionsr   scapy.utilsr   r   r   r   r   r	   r
   scapy.ansmachiner   scapy.base_classesr   r   r   
scapy.datar   r   r   r   r   r   r   r   scapy.layers.l2r   r   r   r   r   r   r   r   scapy.compatr   r    r!   r"   r#   scapy.configr$   scapy.fieldsr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   scapy.packetr@   rA   rB   rC   scapy.volatilerD   rE   rF   rG   rH   scapy.sendrecvrI   rJ   scapy.plistrK   rL   rM   scapy.automatonrN   rO   scapy.errorrP   rQ   scapy.pton_ntoprR   scapy.as_resolversra   objectrT   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  rT  r:  rF  rH  rk  r  r  r  r  r  r  r   r  r  r  r$  r7  r.  r9  rW  rb  rs  r}  r  r  r  r  r  r  r  r  r  r  l2typesregisterregister_num2layerl3typesr  neighborregister_l3commandsr  r  r  r  r  r  r  r  r  r5  timeskew_graphr7  r   r  r  rg  rv  r  r  r  r  stats_classic_protocolsstats_dot11_protocolsr  scapy.layers.inet6rz   r^   r]   <module>r     s?      				    # # # # # #' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - - - - - 2 2 2 2 2 2 2 2 2 2* * * * * * * * * * * * * * * * * * * *	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ? > > > > > > > > > > > > >                                                               : H G G G G G G G G G G G N N N N N N N N N N N N N N " " " " " " " " ; ; ; ; ; ; ; ; ; ; + + + + + + + + , , , , , , , , % % % % % %    ) ) ) ) )f ) ) )(Q 
 , 	
 + -   - 3    )   1!" '%,'</4&-3   :D D D D DF D D D    v   2" " " " "8 " " "" " " " "8 " " "
 
 
 
 
 
 
 
3 3 3 3 3( 3 3 3    K       K   0 0 0 0 0 0 0 0+ + + + + + + +    +   
8 8 8 8 8( 8 8 8       ,2 2 2 2 2 2 2 2U U U U UH U U U	 	 	 	 	H 	 	 	 								 $  '!
H         $< $< $< $< $<] $< $< $<N_  _  _  _  _ h _  _  _ D       4) ) ) ) )'9 ) ) )$e1 e1 e1 e1 e1 e1 e1 e1P$ $ $N     ; ; ;K K K"   / / /NM NM NM NM NM& NM NM NMb5A 5A 5A 5A 5A& 5A 5A 5Av !     6   <"? "? "? "? "?)= "? "? "?J)$ )$ )$ )$ )$6 )$ )$ )$X"W "W "W "W "W, "W "W "WJ	' 	' 	' 	' 	'\ 	' 	' 	'" " "Q  
 	
 & &  $ $ " & ' ' %   ,!" (%!.,&$3  	8 *)-)-,(%+)1.23+/ / '#*'+ + /15 5$.2 2,+(,)- -/0 0	>   ;:: uH uH uH uH uH6 uH uH uHt& & & & &b & & &6& & & & &s & & &:& & & & &s & & & & & & & & & & &, E2D ! ! ! ! K4 ( ( ( ( C4         D"4         x! $ $ $ $ Hbv~ . . . . GW1A . . . . GYQa 0 0 0 0 GXAQ / / / / GXAR 0 0 0 0 B! $ $ $ $ B1A & & & & B!1 % % % % B!2 & & & & B!2 & & & & CD ! ! ! !   gr " " "   R 0 0 0   h # # #   h # # #   	2 . . .     %%5 6 6 6   $$4 5 5 5    : ) ) ) )&< < < < <: < < <% % %"( ( (V*K *K *K *KZ 0 0 0 / / /4 4 4n 8 e0 e0 e0 e0 e0z e0 e0 e0P "IIKKDY]ghrv        F , , ,o o o o o o o on   , ,,7O7O    " ' ' ' 'T    * : : : : : : : :z    "   >   c4 0 0     sC. .    r^   