
    hcV                     B   d Z ddlmZm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 ddlmZmZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZm Z m!Z! ddl"m#Z#m$Z$ ddlm%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.  G d de/          Z0dZ1dZ2dZ3dZ4 G d dej5                  Z6 G d de0          Z7es G d de7          Z8 G d de8          Z9 G d de7          Z: G d  d!e:          Z; G d" d#e;          Z< G d$ d%e7          Z= G d& d'e7          Z>dS )(z
SuperSocket.
    )selecterrorN)conf)DARWINWINDOWS)MTUETH_P_IP
ETH_P_IPV6
SOL_PACKETSO_TIMESTAMPNS)raw)warninglog_runtime)network_name)Packet	NoPayload)
PacketList
SndRcvList_PacketIterable)
PcapReadertcpdump)_GlobInterfaceType)AnyDictIteratorListOptionalTupleTypecastc                       e Zd ZdZd ZdS )_SuperSocket_metaclassNc                 J    | j         d| j        d| j         dS d| j        z  S )N<z: >z<%s>)desc__name__selfs    U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/supersocket.py__repr__z_SuperSocket_metaclass.__repr__8   s1    9  !%			::DM))    )r'   
__module____qualname__r&   r+    r,   r*   r"   r"   5   s(        D* * * * *r,   r"      i      @   c                       e Zd Zdej        fdej        fdej        fdej        fdej        fdej        fdej        fgZdS )	tpacket_auxdata	tp_statustp_len
tp_snaplentp_mactp_nettp_vlan_tcitp_vlan_tpidN)r'   r-   r.   ctypesc_uintc_ushort_fields_r/   r,   r*   r4   r4   G   s[        	fm$	6=!	v}%	6?#	6?#	(	)HHHr,   r4   c                       e Zd ZdZdZdZej        ej        ddfdZ	d Z
erd Znd ZefdZefd	Zd
 Zd Zd Zd Zd Zd Zd Zeej        fd            Zd Zd Zd ZdS )SuperSocketFr   Nc                     t          j         |||          | _        | j        | _        t          j        | _        |pt          j        | _        d S N)socketinsoutsr   sniff_promiscpromisciface)r)   familytypeprotorI   kwargss         r*   __init__zSuperSocket.__init__Z   s>     =u55H	)(dj


r,   c                     t          |          }	 t          j                    |_        n# t          $ r Y nw xY w| j        r| j                            |          S dS )z|Sends a `Packet` object

        :param x: `Packet` to be send
        :return: Number of bytes that have been sent
        r   )r   time	sent_timeAttributeErrorrF   send)r)   xsxs      r*   rS   zSuperSocket.sendg   sh     VV	)++AKK 	 	 	D	 9 	9>>"%%%1s   * 
77c                 <    |                     |          \  }}||dfS )zInternal function to receive a Packet.

            :param sock: Socket object from which data are received
            :param x: Number of bytes to be received
            :return: Received bytes, address information and no timestamp
            N)recvfrom)r)   sockrT   pktsa_lls        r*   	_recv_rawzSuperSocket._recv_rawz   s&     q))JCt##r,   c                 ^   d}| j         s|                    |          \  }}}}|||fS t          j        d          }|                    ||          \  }}}	}|s|||fS |D ]G\  }
}}|
t          k    r|t
          k    r	 t                              |          }n# t          $ r
 |||fcY c S w xY w|j	        dk    s|j
        t          z  rPt          }|j
        t          z  r|j        }t          j        d||j	                  }|dd         |z   |dd         z   }|
t          j        k    r||t$          k    rqt'          |          }|dk    rt          j        d|          }n2|dk    rt          j        d	|          }nt+          j        d
           3|d         |d         dz  z   }I|||fS )a(  Internal function to receive a Packet,
            and process ancillary data.

            :param sock: Socket object from which data are received
            :param x: Number of bytes to be received
            :return: Received bytes, address information and an optional timestamp
            Ni   r   z!HH   r1   llr0   iizUnknown timespec format.. ?!   g&.>)auxdata_availablerecvmsgrD   CMSG_LENr   PACKET_AUXDATAr4   from_buffer_copy
ValueErrorr:   r5   TP_STATUS_VLAN_VALIDETH_P_8021QTP_STATUS_VLAN_TPID_VALIDr;   structpack
SOL_SOCKETr   lenunpackr   r   )r)   rX   rT   	timestamprY   _rZ   	flags_lenancdataflagscmsg_lvl	cmsg_type	cmsg_dataauxdatatpidtaglengthtmps                     r*   r[   zSuperSocket._recv_raw   s    I) -#'<<?? Q5E9,,--I)-a)C)C&C% -E9,,29 "7 "7.)Y
**yN/J/J5"1"B"B9"M"M% 5 5 5
  #E94444445 *a//#-0DD 0  +",/HH 8#*#7D$k! #/ 
 "#2#hns233x7!222!^33 ^^F||$mD)<<1$mD)<<#+,JKKK  #AQ$ 6Iy((s   ?BB.-B.c                 P    t           j        | j                            |          dfS )zReturns a tuple containing (cls, pkt_data, time)


        :param x: Maximum number of bytes to be received, defaults to MTU
        :return: A tuple, consisting of a Packet type, the received data,
                 and a timestamp
        N)r   	raw_layerrE   recvr)   rT   s     r*   recv_rawzSuperSocket.recv_raw   s!     ~tx}}Q//55r,   c                     |                      |          \  }}}|r|sdS 	  ||fi |}nJ# t          $ r  t          $ r3 t          j        rddlm} ||f|_         t          j        |          }Y nw xY w|r||_	        |S )zReceive a Packet according to the `basecls` of this socket

        :param x: Maximum number of bytes to be received, defaults to MTU
        :return: The received `Packet` object, or None
        Nr   )debug)
r   KeyboardInterrupt	Exceptionr   debug_dissectorscapy.sendrecvr   
crashed_onr}   rP   )r)   rT   rM   clsvaltsrY   r   s           r*   r~   zSuperSocket.recv   s     }}Q''S" 	# 	4		&#c$$V$$CC  	 	 	 	& 	& 	&# 000000$': .%%CCC	&  	CH
s   	+ AA21A2c                 4    | j                                         S rC   )rE   filenor(   s    r*   r   zSuperSocket.fileno   s    x   r,   c                    | j         rdS d| _         t          | dd          rWt          | dd          | j        k    r=| j        r6| j                                        dk    r| j                                         t          | dd          r8| j                                        dk    r| j                                         dS dS dS )z%Gracefully close this socket
        NTrF   rE   )closedgetattrrF   r   closerE   r(   s    r*   r   zSuperSocket.close   s     ; 	F4&& 	&tUD))TY669 &!1!1!3!3r!9!9IOO%%%4%% 	!x  B&&     	! 	!&&r,   c                 0    ddl m}  |j        | g|R i |S )z*Send and Receive multiple packets
        r   sendrecv)scapyr   sndrcvr)   argskargsr   s       r*   srzSuperSocket.sr   s8     	#"""""xt4d444e444r,   c                     ddl m}  |j        | g|R i |d         }t          |          dk    r|d         d         }|S dS )z/Send one packet and receive one answer
        r   r   r`   N)r   r   r   rm   )r)   r   r   r   ansrY   s         r*   sr1zSuperSocket.sr1   sb     	#"""""hod3T333U33A6s88a<<a&)CJ4r,   c                 ,    ddl m}  |j        |d| i|S Nr   r   opened_socket)r   r   sniffr   s       r*   r   zSuperSocket.sniff  s0    """"""x~4ADA5AAAr,   c                 0    ddl m}  |j        |d| i| d S r   )r   r   tsharkr   s       r*   r   zSuperSocket.tshark	  s6    """"""T;d;U;;;;;r,   c                      ||| | d|S )z
        Creates an AnsweringMachine associated with this socket.

        :param cls: A subclass of AnsweringMachine to instantiate
        )r   rD   r/   )r)   r   r   rM   s       r*   amzSuperSocket.am  s      sDTDDVDDDr,   c                     	 t          | g g |          \  }}}nA# t          t          f$ r-}|j        r|j        d         t          j        k    r Y d}~nd}~ww xY w|S )a0  This function is called during sendrecv() routine to select
        the available sockets.

        :param sockets: an array of sockets that need to be selected
        :returns: an array of sockets that were selected and
            the function to be called next to get the packets (i.g. recv)
        r   N)r   IOErrorselect_errorr   errnoEINTR)socketsremaininprp   excs        r*   r   zSuperSocket.select  s}    	wB77ICAA& 	 	 	8 sx{ek99  :9999	 
s    A#AAc                 .    |                                   dS zClose the socketNr   r(   s    r*   __del__zSuperSocket.__del__.       	

r,   c                     | S rC   r/   r(   s    r*   	__enter__zSuperSocket.__enter__3  s    r,   c                 .    |                                   dS r   r   )r)   exc_type	exc_value	tracebacks       r*   __exit__zSuperSocket.__exit__7  r   r,   )r'   r-   r.   r   nonblocking_socketra   rD   AF_INETSOCK_STREAMrN   rS   r   r[   r   r   r~   r   r   r   r   r   r   r   staticmethodr   recv_poll_rater   r   r   r   r/   r,   r*   rA   rA   U   s~       F (	) ) ) )  $  @)		$ 		$ 		$ 		$4	) 4	) 4	)l  	6 	6 	6 	6     0! ! !! ! !5 5 5
 
 
B B B
< < <E E E #2    \"  
      r,   rA   )	metaclassc                   4    e Zd ZdZeddddfdZefdZd ZdS )L3RawSocketz,Layer 3 using Raw sockets (PF_INET/SOCK_RAW)Nr   c                    t          j         t           j        t           j        t           j                  | _        | j                            t           j        t           j        d           t          j         t           j        t           j        t          j	        |                    | _
        |3t          |          }|| _        | j
                            ||f           nd| _        	 | j
                            t          t          d           | j
                            t           j        t"          d           d| _        d S # t&          $ r d}t)          j        |           Y d S w xY w)Nr`   anyTz2Your Linux Kernel does not support Auxiliary Data!)rD   r   SOCK_RAWIPPROTO_RAWrF   
setsockoptSOL_IP
IP_HDRINCL	AF_PACKEThtonsrE   r   rI   bindr   rd   rl   r   ra   OSErrorr   info)r)   rK   filterrI   rH   nofiltermsgs          r*   rN   zL3RawSocket.__init__A  s2    fnfovGYZZDII  0A1EEE}V%5vUYHZHZ[[DH $U++"
udm,,,,"
&##JBBB##%"  
 *.&&& & & & K %%%%%%	&s   (AE  E&%E&c                    |                      | j        |          \  }}}|d         t          j        k    rd S |d         t          j        v r t          j        j        |d                  }d}nl|d         t          j        v r t          j        j        |d                  }d}n8t          j        }t          d|d         |d         |d         |j
                   d}	  ||fi |}n;# t          $ r  t          $ r$ t          j        r t	          j        |          }Y nw xY w|dk    r|j        }||ddlm}	  |	| j                  }||_        |S )N      r`   zDUnable to guess type (interface=%s protocol=%#x family=%i). Using %sr   )get_last_packet_timestamp)r[   rE   rD   PACKET_OUTGOINGr   l2types	num2layerl3types
default_l2r   namer   r   r   r}   payloadscapy.arch.linuxr   rP   )
r)   rT   rM   datarZ   r   r   lvlrY   r   s
             r*   r~   zL3RawSocket.recva  s   "nnTXq99OD%Qx6111tQx4<''l,U1X6qT\))l,U1X6o^`efg`hjopqjrtyz{t|  B  G  H  H  H+c$))&))$    + + +' nT**+
 axxk:JJJJJJ2248<<BJs   	C# #5DDc                 :   	 t          |          }| j        r:t          j                    |_        | j                            ||j        df          S nH# t          $ r t          d          t          j	        $ r}t          j	        |           Y d }~nd }~ww xY wdS )Nr   ztMissing 'dst' attribute in the first layer to be sent using a native L3 socket ! (make sure you passed the IP layer))r   rF   rP   rQ   sendtodstrR   rf   rD   r   r   )r)   rT   rU   r   s       r*   rS   zL3RawSocket.send  s    'VV9 "&)++AK9++
   "       
 < ' ' '!#&&&&&&&&'1s   AA 'B:BB)	r'   r-   r.   r&   r	   rN   r   r~   rS   r/   r,   r*   r   r   >  sh        = # !	& 	& 	& 	&@  !	 !	 !	 !	F	 	 	 	 	r,   r   c                   ^    e Zd Zeddddfdedee         dee         dee         deddfd	Z	dS )
L3RawSocket6NFrK   r   rI   rH   r   returnc                 .   t          j         t           j        t           j        t           j                  | _        t          j         t           j        t           j        t          j        |                    | _        t          t          |          | _
        d S rC   )rD   AF_INET6r   r   rF   r   r   rE   r    r   rI   )r)   rK   r   rI   rH   r   s         r*   rN   zL3RawSocket6.__init__  sl     " DI
 } T"" DH
 0%88DJJJr,   )
r'   r-   r.   r
   intr   strr   boolrN   r/   r,   r*   r   r     s        !+-1;?/3&+	9 	9	9%c]	9 %%78	9 'tn		9
  $	9
 15	9 	9 	9 	9 	9 	9r,   r   c                   H    e Zd ZdZdZddZefdZere	dd            Z
dS dS )SimpleSocketzwrapper around a classic socketTNc                 L    || _         || _        |t          j        }|| _        d S rC   )rE   rF   r   r}   basecls)r)   rX   r   s      r*   rN   zSimpleSocket.__init__  s'    	?nGr,   c                 F    | j         | j                            |          d fS rC   )r   rE   r~   r   s     r*   r   zSimpleSocket.recv_raw  s    |TX]]1--t33r,   c                 &    ddl m}  || |          S )Nr   )select_objects)scapy.automatonr   )r   r   r   s      r*   r   zSimpleSocket.select  s(     766666!>'6222r,   rC   )r'   r-   r.   r&   __selectable_force_select__rN   r   r   r   r   r   r/   r,   r*   r   r     s~        ,D"&     4 4 4 4  3		3 	3 	3 
	3 	3 	33 3r,   r   c                   2     e Zd ZdZdZ	 d fd	ZddZ xZS )StreamSocketz
    Wrap a stream socket into a layer 2 SuperSocket

    :param sock: the socket to wrap
    :param basecls: the base class packet to use to dissect the packet
    z)transforms a stream socket into a layer 2Nc                     ddl m}  ||pt          j                  | _        i | _        i | _        d| _        t          t          |           
                    ||           d S )Nr   )	streamclsr,   )r   )scapy.sessionsr   r   r}   rcvclsmetadatastreamsession_bufsuperr   rN   )r)   rX   r   r   	__class__s       r*   rN   zStreamSocket.__init__  sn    
 	-,,,,,i 94>::(*-/	lD!!**4*AAAAAr,   c                    |t           }| j                            |t          j                  }|dk    rt
          t          |          }|                     | j        |z   | j	        | j
                  }|=| xj        | j                            |          z  c_        |                     |          S | j	                                         |                    t          j                  }||j        |j        `|Jt#          |t$                    s5|t          |j                  z  }|j        }|t#          |t$                    5| j                            |           d| _        |S )Nr,   )r   rE   r~   rD   MSG_PEEKEOFErrorrm   r   r   r   r   cleargetlayerr   padding_layer
underlayerr   
isinstancer   load)r)   rT   rM   r   rY   pads         r*   r~   zStreamSocket.recv  s/   9Ax}}Q003;;NIIkk$)d*DM4;MNN;IIq)))II99Q<<ll4-..?s~9&oji&@&@oSXA+C oji&@&@o 	a	
r,   rC   )r'   r-   r.   __doc__r&   rN   r~   __classcell__r   s   @r*   r   r     sm          7D 
B 
B 
B 
B 
B 
B       r,   r   c                   H     e Zd ZdZd fd	ZddZed fd	            Z xZS )SSLStreamSocketzPsimilar usage than StreamSocket but specialized for handling SSL-wrapped socketsNc                     ddl m}  |d          | _        t          t          |                               ||           d S )Nr   )
TCPSessionT)app)r   r  sessr   r  rN   )r)   rX   r   r  r   s       r*   rN   zSSLStreamSocket.__init__  sO    ------J4(((	ot$$--dG<<<<<r,   c                 :   |t           }	 | j                            |          }n# t          $ r t          w xY w	 | j                            || j                  }n# t          j	        $ r d }Y nw xY w|dk    r	|st          |s|                     |          S |S )N)r   r,   )
r   rE   r~   r   r  r  processr   rj   r   )r)   rT   rM   r   rY   s        r*   r~   zSSLStreamSocket.recv  s    9A	8==##DD 	 	 	N		)##Ddl#;;CC| 	 	 	CCC	 3;;s;N 	 99Q<<
s   & 8!A A21A2c                     d | D             }|r|S t          t          t                                        | |          S )Nc                 T    g | ]%}t          |t                    |j        j        #|&S r/   )r  r  r  r   ).0rT   s     r*   
<listcomp>z*SSLStreamSocket.select.<locals>.<listcomp>  sF     
 
 
!_--
 34&+

 
 
r,   r   )r   r  r   )r   r   queuedr   s      r*   r   zSSLStreamSocket.select  sS    
 

 
 

  	M_o66==gf=UUUr,   rC   )	r'   r-   r.   r&   rN   r~   r   r   r
  r  s   @r*   r  r    s        ]D= = = = = =   ( 	V 	V 	V 	V 	V \	V 	V 	V 	V 	Vr,   r  c                   N    e Zd ZdZ	 	 	 	 	 	 ddZefdZd Zed	d            Z	dS )
L2ListenTcpdumpz%read packets at layer 2 using tcpdumpNFc                     d | _         g d}	d| _        |!t          st          rt          j        x| _        }|t          j        }|$|	                    dt          |          g           |s|	                    d           |s1t          j	        r%|rd|dt          j	        d}ndt          j	        z  }||	                    |           t          d ||	d	|
          | _        t          | j        j                  | _        | j        | _        d S )N)z-w-z-s65535r   z-iz-p(z) and not ()znot (%s)T)progr   getprocquiet)rF   rI   r   r   r   rG   extendr   appendexcept_filterr   tcpdump_procr   stdoutreaderrE   )
r)   rI   rH   r   r   r!  r#  argkargr   s
             r*   rN   zL2ListenTcpdump.__init__%  s)    	)))
=g==!%+DJ?(GKK|E223444 	KK 	=! = = =4:FFD<N<N<NOFF'$*<<FKK#t$EC C C !2!9::;r,   c                 (     | j         j        |fi |S rC   )r)  r~   )r)   rT   rM   s      r*   r~   zL2ListenTcpdump.recvH  s    t{,,V,,,r,   c                 l    t                               |            | j                                         d S rC   )rA   r   r'  killr(   s    r*   r   zL2ListenTcpdump.closeL  s1    $     r,   c                 Z    t           st          r| S t                              | |          S )Nr  )r   r   rA   r   r   r   s     r*   r   zL2ListenTcpdump.selectQ  s1      	v 	N!!'&!999r,   )NNNFNFrC   )
r'   r-   r.   r&   rN   r   r~   r   r   r   r/   r,   r*   r  r  "  s        2D ! ! ! !F  - - - -! ! !
 : : : \: : :r,   r  c                   B    e Zd ZdZdZd Zedd            ZddZd Z	dS )	
IterSocketzwrapper around an iterableTc                    |st          g           | _         d S t          |t                    r|j         | _         d S t          |t                    r)t	          t          |          fd} |            | _         d S t          |t
          t          f          rDt          |d         t                    rt          |          | _         d S d |D             | _         d S |                                | _         d S )Nc              3   P   K   | D ] \  }}|j         r|j         |_        |V  |V  !d S rC   )rQ   rP   )objsrs      r*   _iterz"IterSocket.__init__.<locals>._iterf  sJ        DAq{ -!"GGGGGGG	 r,   r   c              3   $   K   | ]}|D ]}|V  d S rC   r/   )r  rT   ys      r*   	<genexpr>z&IterSocket.__init__.<locals>.<genexpr>r  s/      771Q77Q7777777r,   )	iterr  r2  r   r    listr   bytes__iter__)r)   r5  r8  s      r*   rN   zIterSocket.__init___  s     	'RDIIIZ(( 	'DIIIZ(( 	'z3//     DIIIdJ/00 	'#a&%(( 8 II			77777			DIIIr,   Nc                     | S rC   r/   r0  s     r*   r   zIterSocket.selectv  s	     r,   c                     	 t          | j                  } |j        t          |          fi |S # t          $ r t
          w xY wrC   )nextr<  r   r>  StopIterationr  )r)   rT   rM   rY   s       r*   r~   zIterSocket.recv{  sT    	ty//C 3=s66v666 	 	 	N	s	   .1 Ac                     d S rC   r/   r(   s    r*   r   zIterSocket.close  s    r,   rC   )
r'   r-   r.   r&   r   rN   r   r   r~   r   r/   r,   r*   r2  r2  [  sq        'D' ' '.    \       r,   r2  )?r	  r   r   r   r<   r   rD   rj   rP   scapy.configr   scapy.constsr   r   
scapy.datar   r	   r
   r   r   scapy.compatr   scapy.errorr   r   scapy.interfacesr   scapy.packetr   r   scapy.plistr   r   r   scapy.utilsr   r   r   typingr   r   r   r   r   r   r   r    rK   r"   rd   rh   rg   ri   	Structurer4   rA   r   r   r   r   r  r  r2  r/   r,   r*   <module>rP     s    1 0 0 0 0 0 0 0            ( ( ( ( ( ( ( (                    , , , , , , , , ) ) ) ) ) ) * * * * * * * *         
 , + + + + + + + 0 / / / / /	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	* * * * *T * * *  " 	 	 	 	 	f& 	 	 	e e e e e2 e e e eP  m9X X X X Xk X X Xt9 9 9 9 9{ 9 9 9*3 3 3 3 3; 3 3 30- - - - -< - - -`*V *V *V *V *Vl *V *V *VZ4: 4: 4: 4: 4:k 4: 4: 4:r* * * * * * * * * *r,   