
    h}I                        d dl mZmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dl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 d d
lmZ d dlmZmZmZmZmZ  G d de          Z G d de          Z  G d de          Z! G d de!          Z" G d de          Z# G d de#          Z$ G d de          Z% G d de          Z& G d de          Z' G d de'          Z( G d  d!e'          Z) G d" d#e(          Z* G d$ d%e          Z+ G d& d'e          Z, G d( d)e          Z- G d* d+e          Z. G d, d-e          Z/dS ).    )QueueEmptyN)
ObjectPipe)conf)raw)_GlobInterfaceType)Packet)SourceDrainSink)ContextManagerSubprocess
PcapReader
PcapWriter)SuperSocket)AnyCallableListOptionalcastc                   :    e Zd ZdZ	 	 	 	 ddZd Zd Zd Zd ZdS )	SniffSourcea  Read packets from an interface and send them to low exit.

    .. code::

             +-----------+
          >>-|           |->>
             |           |
           >-|  [iface]--|->
             +-----------+

    If neither of the ``iface`` or ``socket`` parameters are specified, then
    Scapy will capture from the first network interface.

    :param iface: A layer 2 interface to sniff packets from. Mutually
                  exclusive with the ``socket`` parameter.
    :param filter: Packet filter to use while capturing. See ``L2listen``.
                   Not used with ``socket`` parameter.
    :param socket: A ``SuperSocket`` to sniff packets from.
    Nc                     t          j        | |           |s|r|rt          d          t          t          |          | _        || _        || _        d S )Nnamez;iface and filter options are mutually exclusive with socket)r
   __init__
ValueErrorr   r   sifacefilter)selfr   r   socketr   s        T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/scapypipes.pyr   zSniffSource.__init__1   sk     	4(((( 	,V 	, 	, + , , , k6**
    c                 b    | j         s't          j        | j        | j                  | _         d S d S )N)r   r   )r   r   L2listenr   r   r    s    r"   startzSniffSource.startB   s7    v 	I]DKHHHDFFF	I 	Ir#   c                 J    | j         r| j                                          d S d S Nr   closer&   s    r"   stopzSniffSource.stopG   s)    6 	FLLNNNNN	 	r#   c                 4    | j                                         S r)   )r   filenor&   s    r"   r.   zSniffSource.filenoL       v}}r#   c                     	 | j                                         }||                     |           d S d S # t          $ r d| _        Y d S w xY wNT)r   recv_sendEOFErroris_exhausted)r    pkts     r"   deliverzSniffSource.deliverP   sa    	%&++--C

3  	% 	% 	% $D	%s   06 A
A)NNNN	__name__
__module____qualname____doc__r   r'   r,   r.   r7    r#   r"   r   r      s         * 	   "I I I
  
  % % % % %r#   r   c                   2    e Zd ZdZddZd Zd Zd Zd ZdS )	RdpcapSourcezRead packets from a PCAP file send them to low exit.

    .. code::

         +----------+
      >>-|          |->>
         |          |
       >-|  [pcap]--|->
         +----------+
    Nc                 r    t          j        | |           || _        t          | j                  | _        d S Nr   )r
   r   fnamer   f)r    rB   r   s      r"   r   zRdpcapSource.__init__f   s3    4((((
DJ''r#   c                 F    t          | j                  | _        d| _        d S NF)r   rB   rC   r5   r&   s    r"   r'   zRdpcapSource.startl   s!    DJ''!r#   c                 8    | j                                          d S r)   )rC   r+   r&   s    r"   r,   zRdpcapSource.stopq       r#   c                 4    | j                                         S r)   )rC   r.   r&   s    r"   r.   zRdpcapSource.filenou   r/   r#   c                     	 | j                                         }|                     |           d S # t          $ r d| _        Y d S w xY wr1   )rC   r2   r3   r4   r5   )r    ps     r"   r7   zRdpcapSource.delivery   sU    	%AJJqMMMMM 	% 	% 	% $D	%s   .2 AAr)   r8   r=   r#   r"   r?   r?   Z   sn        	 	( ( ( (" " "
    % % % % %r#   r?   c                   ,    e Zd ZdZddZd Zd Zd ZdS )
InjectSinkzPackets received on low input are injected to an interface

    .. code::

         +-----------+
      >>-|           |->>
         |           |
       >-|--[iface]  |->
         +-----------+
    Nc                 \    t          j        | |           |t          j        }|| _        d S rA   )r   r   r   r   )r    r   r   s      r"   r   zInjectSink.__init__   s.    d&&&&=JE


r#   c                 D    t          j        | j                  | _        d S N)r   )r   L2socketr   r   r&   s    r"   r'   zInjectSink.start       TZ000r#   c                 8    | j                                          d S r)   r*   r&   s    r"   r,   zInjectSink.stop   rG   r#   c                 :    | j                             |           d S r)   )r   sendr    msgs     r"   pushzInjectSink.push   s    Cr#   NNr9   r:   r;   r<   r   r'   r,   rW   r=   r#   r"   rL   rL      s_        	 	   1 1 1      r#   rL   c                       e Zd Zd ZdS )Inject3Sinkc                 D    t          j        | j                  | _        d S rO   )r   L3socketr   r   r&   s    r"   r'   zInject3Sink.start   rQ   r#   N)r9   r:   r;   r'   r=   r#   r"   r[   r[      s#        1 1 1 1 1r#   r[   c                   ,    e Zd ZdZddZd Zd Zd ZdS )
WrpcapSinka2  
    Writes :py:class:`Packet` on the low entry to a ``pcap`` file.
    Ignores all messages on the high entry.

    .. note::

        Due to limitations of the ``pcap`` format, all packets **must** be of
        the same link type. This class will not mutate packets to conform with
        the expected link type.

    .. code::

         +----------+
      >>-|          |->>
         |          |
       >-|--[pcap]  |->
         +----------+

    :param fname: Filename to write packets to.
    :type fname: str
    :param linktype: See :py:attr:`linktype`.
    :type linktype: None or int

    .. py:attribute:: linktype

        Set an explicit link-type (``DLT_``) for packets.  This must be an
        ``int`` or ``None``.

        This is the same as the :py:func:`wrpcap` ``linktype`` parameter.

        If ``None`` (the default), the linktype will be auto-detected on the
        first packet. This field will *not* be updated with the result of this
        auto-detection.

        This attribute has no effect after calling :py:meth:`PipeEngine.start`.
    Nc                 j    t          j        | |           || _        d | _        || _        || _        d S rA   )r   r   rB   rC   linktypekwargs)r    rB   r   ra   rb   s        r"   r   zWrpcapSink.__init__   s7    d&&&&
 r#   c                 L    t          | j        fd| j        i| j        | _        d S )Nra   )r   rB   ra   rb   rC   r&   s    r"   r'   zWrpcapSink.start   s(    DJNNN$+NNr#   c                 |    | j         r4| j                                          | j                                          d S d S r)   )rC   flushr+   r&   s    r"   r,   zWrpcapSink.stop   s8    6 	FLLNNNFLLNNNNN	 	r#   c                 T    |r#| j         r| j                             |           d S d S d S r)   )rC   writerU   s     r"   rW   zWrpcapSink.push   sA     	46 	FLL	 	 	 	r#   rX   rY   r=   r#   r"   r_   r_      sc        # #J   O O O      r#   r_   c                        e Zd ZdZddZd ZdS )WiresharkSinka  
    Streams :py:class:`Packet` from the low entry to Wireshark.

    Packets are written into a ``pcap`` stream (like :py:class:`WrpcapSink`),
    and streamed to a new Wireshark process on its ``stdin``.

    Wireshark is run with the ``-ki -`` arguments, which cause it to treat
    ``stdin`` as a capture device.  Arguments in :py:attr:`args` will be
    appended after this.

    Extends :py:mod:`WrpcapSink`.

    .. code::

         +----------+
      >>-|          |->>
         |          |
       >-|--[pcap]  |->
         +----------+

    :param linktype: See :py:attr:`WrpcapSink.linktype`.
    :type linktype: None or int
    :param args: See :py:attr:`args`.
    :type args: None or list[str]

    .. py:attribute:: args

        Additional arguments for the Wireshark process.

        This must be either ``None`` (the default), or a ``list`` of ``str``.

        This attribute has no effect after calling :py:meth:`PipeEngine.start`.

        See :manpage:`wireshark(1)` for more details.
    Nc                 P    t                               | d||           || _        d S )N )rB   r   ra   )r_   r   args)r    r   ra   rl   s       r"   r   zWiresharkSink.__init__  s*    DIII			r#   c                 l   t          t          j        j                  5  t          j        j        ddg}| j        r|                    | j                   t          j        |t          j        d d           }d d d            n# 1 swxY w Y   |j	        | _
        t                              |            d S )Nz-Slki-)stdinstdoutstderr)r   r   prog	wiresharkrl   extend
subprocessPopenPIPEro   rB   r_   r'   )r    rl   procs      r"   r'   zWiresharkSink.start  s     &di&9:: 
	 
	I'#6Dy 'DI&&&# o	  D
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 Z
s   ABB
B)NNN)r9   r:   r;   r<   r   r'   r=   r#   r"   ri   ri      sB        " "H   
    r#   ri   c                   &    e Zd ZdZddZd Zd ZdS )	UDPDrainzUDP payloads received on high entry are sent over UDP

    .. code::

         +-------------+
      >>-|--[payload]--|->>
         |      X      |
       >-|----[UDP]----|->
         +-------------+
    	127.0.0.1  c                 J    t          j        |            || _        || _        d S r)   )r   r   ipport)r    r~   r   s      r"   r   zUDPDrain.__init__0  s$    t			r#   c                     ddl m}m} ||v rF||         j        dk    r7||v r5||         j        }|                     t          |                     d S d S d S d S )Nr   IPUDP   )scapy.layers.inetr   r   protopayload
_high_sendr   )r    rV   r   r   r   s        r"   rW   zUDPDrain.push6  sv    --------99R",,#h&GOOCLL))))) 9,,r#   c                     ddl m}m}  || j                   |d| j                  z  |z  }|                     |           d S )Nr   r   )dstr|   )sportdport)r   r   r   r~   r   r3   )r    rV   r   r   rJ   s        r"   	high_pushzUDPDrain.high_push=  sY    --------B47OOOccDI>>>>D

1r#   N)r{   r|   r9   r:   r;   r<   r   rW   r   r=   r#   r"   rz   rz   $  sP        	 	   * * *    r#   rz   c                   ,    e Zd ZdZddZd Zd Zd ZdS )FDSourceSinkzUse a file descriptor as source and sink

    .. code::

         +-------------+
      >>-|             |->>
         |             |
       >-|-[file desc]-|->
         +-------------+
    Nc                 @    t          j        | |           || _        d S rA   )r
   r   fd)r    r   r   s      r"   r   zFDSourceSink.__init__P  s"    4((((r#   c                 :    | j                             |           d S r)   )r   rg   rU   s     r"   rW   zFDSourceSink.pushU  s    cr#   c                 4    | j                                         S r)   r   r.   r&   s    r"   r.   zFDSourceSink.filenoY      w~~r#   c                 ^    |                      | j                                                   d S r)   )r3   r   readr&   s    r"   r7   zFDSourceSink.deliver]  s$    

47<<>>"""""r#   r)   )r9   r:   r;   r<   r   rW   r.   r7   r=   r#   r"   r   r   D  s_        	 	   
       # # # # #r#   r   c                   <    e Zd ZdZdZddZd Zd Zd	 Zd
 Z	d Z
dS )TCPConnectPipezTCP connect to addr:port and use it as source and sink

    .. code::

         +-------------+
      >>-|             |->>
         |             |
       >-|-[addr:port]-|->
         +-------------+
    Trk   r   Nc                     t          j        | |           || _        || _        t	          t
          j        d           | _        d S rA   )r
   r   addrr   r   r!   r   r    r   r   r   s       r"   r   zTCPConnectPipe.__init__o  s<    4((((		v}d++r#   c                     t          j                     | _        | j                            | j        | j        f           d S r)   )r!   r   connectr   r   r&   s    r"   r'   zTCPConnectPipe.startv  s2    -//DI./////r#   c                 J    | j         r| j                                          d S d S r)   )r   r+   r&   s    r"   r,   zTCPConnectPipe.stop{  s)    7 	GMMOOOOO	 	r#   c                 :    | j                             |           d S r)   r   rT   rU   s     r"   rW   zTCPConnectPipe.push      Sr#   c                 4    | j                                         S r)   r   r&   s    r"   r.   zTCPConnectPipe.fileno  r   r#   c                     	 | j                             d          }n(# t          j        $ r |                                   w xY w|r|                     |           d S d S N   )r   r2   r!   errorr,   r3   rU   s     r"   r7   zTCPConnectPipe.deliver  sp    	',,u%%CC| 	 	 	IIKKK	  	JJsOOOOO	 	s	    %Ark   r   N)r9   r:   r;   r<   __selectable_force_select__r   r'   r,   rW   r.   r7   r=   r#   r"   r   r   b  s        	 	 #', , , ,0 0 0
  
           r#   r   c                   0    e Zd ZdZdZd
dZd Zd Zd	 ZdS )TCPListenPipea  TCP listen on [addr:]port and use first connection as source and sink;
    send peer address to high output

    .. code::

         +------^------+
      >>-|    +-[peer]-|->>
         |   /         |
       >-|-[addr:port]-|->
         +-------------+
    Trk   r   Nc                 t    t                               | |||           d| _        t                      | _        d S rE   )r   r   	connectedr   qr   s       r"   r   zTCPListenPipe.__init__  s2    dD$777"WWr#   c                 $   d| _         t          j                    | _        | j                            t          j        t          j        d           | j                            | j        | j        f           | j        	                    d           d S )NF   )
r   r!   r   
setsockopt
SOL_SOCKETSO_REUSEADDRbindr   r   listenr&   s    r"   r'   zTCPListenPipe.start  sm    -//6,f.A1EEEdi+,,,qr#   c                     | j         r| j                            |           d S | j                            |           d S r)   )r   r   rT   r   putrU   s     r"   rW   zTCPListenPipe.push  s;    > 	GLLFJJsOOOOOr#   c                 8   | j         r_	 | j                            d          }n(# t          j        $ r |                                   w xY w|r|                     |           d S d S | j                                        \  }}|                     |           | j        	                                 || _        d| _         | 
                    |           	 	 | j                            | j                            d                     n# t          $ r Y d S w xY wGNr   TFblock)r   r   r2   r!   r   r,   r3   acceptr   r+   _triggerrT   r   getr   )r    rV   r   frms       r"   r7   zTCPListenPipe.deliver  s*   > 	gll5))<   		   

3    gnn&&GBOOC   GMMOOODG!DNMM#GLL%!8!89999   EEs   $ %A	3D
 

DDr   )	r9   r:   r;   r<   r   r   r'   rW   r7   r=   r#   r"   r   r     sg        
 
 #'% % % %        r#   r   c                   ,    e Zd ZdZd	dZd Zd Zd ZdS )
UDPClientPipea  UDP send packets to addr:port and use it as source and sink
    Start trying to receive only once a packet has been send

    .. code::

         +-------------+
      >>-|             |->>
         |             |
       >-|-[addr:port]-|->
         +-------------+
    rk   r   Nc                 N    t                               | |||           d| _        d S rE   )r   r   r   r   s       r"   r   zUDPClientPipe.__init__  s'    dD$777r#   c                     t          j         t           j        t           j                  | _        | j                            | j        | j        f           d| _        d S r1   )r!   AF_INET
SOCK_DGRAMr   r   r   r   r   r&   s    r"   r'   zUDPClientPipe.start  sB    -0ABBDI.///r#   c                 :    | j                             |           d S r)   r   rU   s     r"   rW   zUDPClientPipe.push  r   r#   c                     | j         sd S 	 | j                            d          }n(# t          j        $ r |                                   w xY w|r|                     |           d S d S r   )r   r   r2   r!   r   r,   r3   rU   s     r"   r7   zUDPClientPipe.deliver  s    ~ 	F	',,u%%CC| 	 	 	IIKKK	  	JJsOOOOO	 	s	   & %Ar   r9   r:   r;   r<   r   r'   rW   r7   r=   r#   r"   r   r     s_        
 
   
    
 
 
 
 
r#   r   c                   ,    e Zd ZdZd	dZd Zd Zd ZdS )
UDPServerPipea  UDP bind to [addr:]port and use as source and sink
    Use (ip, port) from first received IP packet as destination for all data

    .. code::

         +------^------+
      >>-|    +-[peer]-|->>
         |   /         |
       >-|-[addr:port]-|->
         +-------------+
    rk   r   Nc                 N    t                               | |||           d | _        d S r)   )r   r   _destinationr   s       r"   r   zUDPServerPipe.__init__  s*    tT4666 r#   c                     t          j         t           j        t           j                  | _        | j                            | j        | j        f           d S r)   )r!   r   r   r   r   r   r   r&   s    r"   r'   zUDPServerPipe.start	  s=    -0ABBdi+,,,,,r#   c                     | j         r"| j                            || j                    d S | j                            |           d S r)   )r   r   sendtor   r   rU   s     r"   rW   zUDPServerPipe.push  sA     	GNN3 122222FJJsOOOOOr#   c                 8   | j         r_	 | j                            d          }n(# t          j        $ r |                                   w xY w|r|                     |           d S d S | j                            d          \  }}|r|                     |           || _         |                     |           | 	                    |           	 	 | j
                            d          }| j                            || j                    n# t          $ r Y d S w xY wOr   )r   r   r2   r!   r   r,   r3   recvfromr   r   r   r   r   r   )r    rV   dests      r"   r7   zUDPServerPipe.deliver  s;    	gll5))<   		   

3    ((//IC  

3 $DMM$OOD!!!&**5*11CGNN3(9::::   EE	s   $ %A	;D
 

DDr   r   r=   r#   r"   r   r     s_        
 
! ! ! !
- - -
      r#   r   c                        e Zd ZdZddZd ZdS )TriggeredMessagezSend a preloaded message when triggered and trigger in chain

    .. code::

         +------^------+
      >>-|      | /----|->>
         |      |/     |
       >-|-[ message ]-|->
         +------^------+
    Nc                 @    t          j        | |           || _        d S rA   )r   r   rV   )r    rV   r   s      r"   r   zTriggeredMessage.__init__:  s"    t$''''r#   c                     |                      | j                   |                     | j                   |                     |           d S r)   )r3   rV   r   r   )r    trigmsgs     r"   
on_triggerzTriggeredMessage.on_trigger?  sB    

48!!!gr#   r)   )r9   r:   r;   r<   r   r   r=   r#   r"   r   r   .  sA        	 	   
    r#   r   c                   &    e Zd ZdZddZd Zd ZdS )TriggerDrainzPass messages and trigger when a condition is met

    .. code::

         +------^------+
      >>-|-[condition]-|->>
         |      |      |
       >-|-[condition]-|->
         +-------------+
    Nc                 @    t          j        | |           || _        d S rA   )r   r   rC   )r    rC   r   s      r"   r   zTriggerDrain.__init__R  s"    t$''''r#   c                     |                      |          }|r|                     |           |                     |           d S r)   )rC   r   r3   r    rV   vs      r"   rW   zTriggerDrain.pushW  s>    FF3KK 	MM!

3r#   c                     |                      |          }|r|                     |           |                     |           d S r)   )rC   r   r   r   s      r"   r   zTriggerDrain.high_push^  sC    FF3KK 	MM!r#   r)   r   r=   r#   r"   r   r   F  sP        	 	   
      r#   r   c                   ,    e Zd ZdZddZd Zd Zd ZdS )	TriggeredValvezLet messages alternatively pass or not, changing on trigger

.. code::

         +------^------+
      >>-|-[pass/stop]-|->>
         |      |      |
       >-|-[pass/stop]-|->
         +------^------+
    TNc                 @    t          j        | |           || _        d S rA   )r   r   openedr    start_stater   s      r"   r   zTriggeredValve.__init__r  s"    t$''''!r#   c                 B    | j         r|                     |           d S d S r)   )r   r3   rU   s     r"   rW   zTriggeredValve.pushw  s)    ; 	JJsOOOOO	 	r#   c                 B    | j         r|                     |           d S d S r)   )r   r   rU   s     r"   r   zTriggeredValve.high_push|  s.    ; 	!OOC     	! 	!r#   c                 P    | xj         dz  c_         |                     |           d S r1   )r   r   rU   s     r"   r   zTriggeredValve.on_trigger  s*    tcr#   TNr9   r:   r;   r<   r   rW   r   r   r=   r#   r"   r   r   f  s_        	 	" " " "
  
! ! !
    r#   r   c                   2    e Zd ZdZd	dZd Zd Zd Zd ZdS )
TriggeredQueueingValvezLet messages alternatively pass or queued, changing on trigger

    .. code::

         +------^-------+
      >>-|-[pass/queue]-|->>
         |      |       |
       >-|-[pass/queue]-|->
         +------^-------+
    TNc                 f    t          j        | |           || _        t                      | _        d S rA   )r   r   r   r   r   r   s      r"   r   zTriggeredQueueingValve.__init__  s-    t$''''!"WWr#   c                 ,    t                      | _        d S r)   )r   r   r&   s    r"   r'   zTriggeredQueueingValve.start  s    r#   c                 z    | j         r|                     |           d S | j                            d|f           d S r1   r   r3   r   r   rU   s     r"   rW   zTriggeredQueueingValve.push  s=    ; 	$JJsOOOOOFJJc{#####r#   c                 z    | j         r|                     |           d S | j                            d|f           d S rE   r   rU   s     r"   r   z TriggeredQueueingValve.high_push  s=    ; 	%JJsOOOOOFJJs|$$$$$r#   c                    | xj         dz  c_         |                     |           	 	 | j                            d          \  }}|r|                     |           n'|                     |           n# t          $ r Y d S w xY w_)NTFr   )r   r   r   r   r3   r   r   )r    rV   lows      r"   r   z!TriggeredQueueingValve.on_trigger  s    tc		))6::E:22S  )JJsOOOOOOC((((    		)s   A4 4
BBr   )	r9   r:   r;   r<   r   r'   rW   r   r   r=   r#   r"   r   r     sn        	 	% % % %  $ $ $% % %) ) ) ) )r#   r   c                   *    e Zd ZdZddZd ZeZd ZdS )TriggeredSwitchzLet messages alternatively high or low, changing on trigger

    .. code::

         +------^------+
      >>-|-\    |    /-|->>
         |  [up/down]  |
       >-|-/    |    \-|->
         +------^------+
    TNc                 @    t          j        | |           || _        d S rA   )r   r   r   r   s      r"   r   zTriggeredSwitch.__init__  s"    t$''''r#   c                 l    | j         r|                     |           d S |                     |           d S r)   )r   r3   r   rU   s     r"   rW   zTriggeredSwitch.push  s7    8 	!JJsOOOOOOOC     r#   c                 P    | xj         dz  c_         |                     |           d S r1   )r   r   rU   s     r"   r   zTriggeredSwitch.on_trigger  s*    Dcr#   r   r   r=   r#   r"   r   r     sW        	 	   
! ! ! I    r#   r   )0queuer   r   r!   ru   scapy.automatonr   scapy.configr   scapy.compatr   scapy.interfacesr   scapy.packetr	   scapy.pipetoolr
   r   r   scapy.utilsr   r   r   scapy.supersocketr   typingr   r   r   r   r   r   r?   rL   r[   r_   ri   rz   r   r   r   r   r   r   r   r   r   r   r=   r#   r"   <module>r     s                & & & & & &             / / / / / /       . . . . . . . . . . H H H H H H H H H H ) ) ) ) ) )             ;% ;% ;% ;% ;%& ;% ;% ;%|%% %% %% %% %%6 %% %% %%P       @1 1 1 1 1* 1 1 1; ; ; ; ; ; ; ;|; ; ; ; ;J ; ; ;|    u   @# # # # #6 # # #<. . . . .V . . .b8 8 8 8 8N 8 8 8v& & & & &N & & &R4 4 4 4 4M 4 4 4n    u   0    5   @    U   B1) 1) 1) 1) 1)U 1) 1) 1)h    e     r#   