a
    kÄ#dmI  ã                   @   sÌ  d dl mZ d dlZd dlZd dlmZ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 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„ deƒZ G dd„ deƒZ!G dd„ deƒZ"G dd„ de"ƒZ#G dd„ deƒZ$G dd„ de$ƒZ%G dd„ deƒZ&G dd„ deƒZ'G dd„ deƒZ(G dd „ d e(ƒZ)G d!d"„ d"e(ƒZ*G d#d$„ d$e)ƒZ+G d%d&„ d&eƒZ,G d'd(„ d(eƒZ-G d)d*„ d*eƒZ.G d+d,„ d,eƒZ/G d-d.„ d.eƒZ0dS )/é    )Úprint_functionN)ÚQueueÚEmpty)Ú
ObjectPipe)Úconf)Úraw)Ú_GlobInterfaceType)ÚPacket)ÚSourceÚDrainÚSink)ÚContextManagerSubprocessÚ
PcapReaderÚ
PcapWriter)ÚSuperSocket)ÚAnyÚCallableÚListÚOptionalÚcastc                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zd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                 C   s>   t j| |d� |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   © r    úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/scapypipes.pyr   2   s    zSniffSource.__init__c                 C   s   | j stj| j| jd�| _ d S )N)r   r   )r   r   ZL2listenr   r   ©r   r    r    r!   ÚstartC   s    zSniffSource.startc                 C   s   | j r| j  ¡  d S ©N©r   Úcloser"   r    r    r!   ÚstopH   s    zSniffSource.stopc                 C   s
   | j  ¡ S r$   )r   Úfilenor"   r    r    r!   r(   M   s    zSniffSource.filenoc                 C   s>   z | j  ¡ }|d ur|  |¡ W n ty8   d| _Y n0 d S ©NT)r   ÚrecvÚ_sendÚEOFErrorÚis_exhausted)r   Zpktr    r    r!   ÚdeliverQ   s    
zSniffSource.deliver)NNNN©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r'   r(   r.   r    r    r    r!   r      s       ü
r   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚRdpcapSourcez¼Read packets from a PCAP file send them to low exit.

    .. code::

         +----------+
      >>-|          |->>
         |          |
       >-|  [pcap]--|->
         +----------+
    Nc                 C   s$   t j| |d� || _t| jƒ| _d S ©Nr   )r
   r   Úfnamer   Úf)r   r6   r   r    r    r!   r   g   s    zRdpcapSource.__init__c                 C   s   t | jƒ| _d| _d S ©NF)r   r6   r7   r-   r"   r    r    r!   r#   m   s    zRdpcapSource.startc                 C   s   | j  ¡  d S r$   )r7   r&   r"   r    r    r!   r'   r   s    zRdpcapSource.stopc                 C   s
   | j  ¡ S r$   )r7   r(   r"   r    r    r!   r(   v   s    zRdpcapSource.filenoc                 C   s6   z| j  ¡ }|  |¡ W n ty0   d| _Y n0 d S r)   )r7   r*   r+   r,   r-   )r   Úpr    r    r!   r.   z   s
    
zRdpcapSource.deliver)Nr/   r    r    r    r!   r4   [   s   
r4   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )Ú
InjectSinkzÇPackets received on low input are injected to an interface

    .. code::

         +-----------+
      >>-|           |->>
         |           |
       >-|--[iface]  |->
         +-----------+
    Nc                 C   s&   t j| |d� |d u rtj}|| _d S r5   )r   r   r   r   )r   r   r   r    r    r!   r   �   s    zInjectSink.__init__c                 C   s   t j| jd�| _d S ©N)r   )r   ZL2socketr   r   r"   r    r    r!   r#   –   s    zInjectSink.startc                 C   s   | j  ¡  d S r$   r%   r"   r    r    r!   r'   š   s    zInjectSink.stopc                 C   s   | j  |¡ d S r$   )r   Úsend©r   Úmsgr    r    r!   Úpushž   s    zInjectSink.push)NN©r0   r1   r2   r3   r   r#   r'   r?   r    r    r    r!   r:   ƒ   s
   
r:   c                   @   s   e Zd Zdd„ ZdS )ÚInject3Sinkc                 C   s   t j| jd�| _d S r;   )r   ZL3socketr   r   r"   r    r    r!   r#   ¤   s    zInject3Sink.startN)r0   r1   r2   r#   r    r    r    r!   rA   £   s   rA   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	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                 C   s$   t j| |d� || _d | _|| _d S r5   )r   r   r6   r7   Úlinktype)r   r6   r   rC   r    r    r!   r   Ï   s    zWrpcapSink.__init__c                 C   s   t | j| jd�| _d S )N)rC   )r   r6   rC   r7   r"   r    r    r!   r#   Ö   s    zWrpcapSink.startc                 C   s   | j r| j  ¡  | j  ¡  d S r$   )r7   Úflushr&   r"   r    r    r!   r'   Ú   s    
zWrpcapSink.stopc                 C   s   |r| j r| j  |¡ d S r$   )r7   Úwriter=   r    r    r!   r?   à   s    
zWrpcapSink.push)NNr@   r    r    r    r!   rB   ©   s
   %
rB   c                   @   s"   e Zd ZdZddd„Zd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                 C   s   t j| d||d� || _d S )NÚ )r6   r   rC   )rB   r   Úargs)r   r   rC   rH   r    r    r!   r     s    zWiresharkSink.__init__c                 C   sv   t tjjƒ�D tjjddg}| jr.| | j¡ tj|tjd d d�}W d   ƒ n1 sV0    Y  |j	| _
t | ¡ d S )Nz-Slkiú-)ÚstdinÚstdoutÚstderr)r   r   ÚprogZ	wiresharkrH   ÚextendÚ
subprocessÚPopenÚPIPErJ   r6   rB   r#   )r   rH   Úprocr    r    r!   r#     s    ü$zWiresharkSink.start)NNN)r0   r1   r2   r3   r   r#   r    r    r    r!   rF   æ   s   $
rF   c                   @   s*   e Zd ZdZddd„Zdd„ Zdd	„ Zd
S )ÚUDPDrainzÌUDP payloads received on high entry are sent over UDP

    .. code::

         +-------------+
      >>-|--[payload]--|->>
         |      X      |
       >-|----[UDP]----|->
         +-------------+
    ú	127.0.0.1éÒ  c                 C   s   t  | ¡ || _|| _d S r$   )r   r   ÚipÚport)r   rV   rW   r    r    r!   r   0  s    
zUDPDrain.__init__c                 C   sJ   ddl m}m} ||v rF|| jdkrF||v rF|| j}|  t|ƒ¡ d S )Nr   ©ÚIPÚUDPé   )Úscapy.layers.inetrY   rZ   ÚprotoÚpayloadÚ
_high_sendr   )r   r>   rY   rZ   r^   r    r    r!   r?   6  s    
zUDPDrain.pushc                 C   s<   ddl m}m} || jd�|d| jd� | }|  |¡ d S )Nr   rX   )ÚdstrU   )ZsportÚdport)r\   rY   rZ   rV   rW   r+   )r   r>   rY   rZ   r9   r    r    r!   Ú	high_push=  s    zUDPDrain.high_pushN)rT   rU   ©r0   r1   r2   r3   r   r?   rb   r    r    r    r!   rS   $  s   
rS   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚFDSourceSinkz¿Use a file descriptor as source and sink

    .. code::

         +-------------+
      >>-|             |->>
         |             |
       >-|-[file desc]-|->
         +-------------+
    Nc                 C   s   t j| |d� || _d S r5   )r
   r   Úfd)r   re   r   r    r    r!   r   P  s    zFDSourceSink.__init__c                 C   s   | j  |¡ d S r$   )re   rE   r=   r    r    r!   r?   U  s    zFDSourceSink.pushc                 C   s
   | j  ¡ S r$   ©re   r(   r"   r    r    r!   r(   Y  s    zFDSourceSink.filenoc                 C   s   |   | j ¡ ¡ d S r$   )r+   re   Úreadr"   r    r    r!   r.   ]  s    zFDSourceSink.deliver)N)r0   r1   r2   r3   r   r?   r(   r.   r    r    r    r!   rd   D  s
   
rd   c                   @   sF   e Zd ZdZdZddd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTCPConnectPipezÍTCP connect to addr:port and use it as source and sink

    .. code::

         +-------------+
      >>-|             |->>
         |             |
       >-|-[addr:port]-|->
         +-------------+
    TrG   r   Nc                 C   s,   t j| |d� || _|| _ttjd ƒ| _d S r5   )r
   r   ÚaddrrW   r   r   re   ©r   ri   rW   r   r    r    r!   r   o  s    zTCPConnectPipe.__init__c                 C   s"   t   ¡ | _| j | j| jf¡ d S r$   )r   re   Úconnectri   rW   r"   r    r    r!   r#   v  s    
zTCPConnectPipe.startc                 C   s   | j r| j  ¡  d S r$   )re   r&   r"   r    r    r!   r'   {  s    zTCPConnectPipe.stopc                 C   s   | j  |¡ d S r$   ©re   r<   r=   r    r    r!   r?   €  s    zTCPConnectPipe.pushc                 C   s
   | j  ¡ S r$   rf   r"   r    r    r!   r(   „  s    zTCPConnectPipe.filenoc                 C   sB   z| j  d¡}W n tjy.   |  ¡  ‚ Y n0 |r>|  |¡ d S ©Né   )re   r*   r   Úerrorr'   r+   r=   r    r    r!   r.   ˆ  s    zTCPConnectPipe.deliver)rG   r   N)r0   r1   r2   r3   Ú__selectable_force_select__r   r#   r'   r?   r(   r.   r    r    r    r!   rh   b  s   

rh   c                   @   s6   e Zd ZdZdZddd„Zdd	„ Zd
d„ Zd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]-|->
         +-------------+
    TrG   r   Nc                 C   s"   t  | |||¡ d| _tƒ | _d S r8   )rh   r   Ú	connectedr   Úqrj   r    r    r!   r   ¡  s    zTCPListenPipe.__init__c                 C   sH   d| _ t ¡ | _| j tjtjd¡ | j | j| jf¡ | j 	d¡ d S )NFé   )
rr   r   re   Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindri   rW   Úlistenr"   r    r    r!   r#   §  s
    
zTCPListenPipe.startc                 C   s$   | j r| j |¡ n| j |¡ d S r$   )rr   re   r<   rs   Úputr=   r    r    r!   r?   ¯  s    zTCPListenPipe.pushc                 C   s¶   | j rFz| j d¡}W n tjy4   |  ¡  ‚ Y n0 |r²|  |¡ nl| j ¡ \}}|  |¡ | j 	¡  || _d| _ |  
|¡ z| j | jjdd�¡ W q~ ty®   Y q²Y q~0 q~d S )Nrn   TF©Úblock)rr   re   r*   r   ro   r'   r+   Úacceptr_   r&   Ú_triggerr<   rs   Úgetr   )r   r>   re   Úfrmr    r    r!   r.   ¶  s$    


zTCPListenPipe.deliver)rG   r   N)	r0   r1   r2   r3   rp   r   r#   r?   r.   r    r    r    r!   rq   “  s   
rq   c                   @   s2   e Zd ZdZddd„Zdd„ Zd	d
„ Zd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]-|->
         +-------------+
    rG   r   Nc                 C   s   t  | |||¡ d| _d S r8   )rh   r   rr   rj   r    r    r!   r   Û  s    zUDPClientPipe.__init__c                 C   s0   t   t jt j¡| _| j | j| jf¡ d| _d S r)   )r   ÚAF_INETÚ
SOCK_DGRAMre   rk   ri   rW   rr   r"   r    r    r!   r#   à  s    zUDPClientPipe.startc                 C   s   | j  |¡ d S r$   rl   r=   r    r    r!   r?   æ  s    zUDPClientPipe.pushc                 C   sL   | j s
d S z| j d¡}W n tjy8   |  ¡  ‚ Y n0 |rH|  |¡ d S rm   )rr   re   r*   r   ro   r'   r+   r=   r    r    r!   r.   ê  s    zUDPClientPipe.deliver)rG   r   N©r0   r1   r2   r3   r   r#   r?   r.   r    r    r    r!   r�   Î  s
   
r�   c                   @   s2   e Zd ZdZddd„Zdd„ Zd	d
„ Zd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]-|->
         +-------------+
    rG   r   Nc                 C   s   t  | |||¡ d | _d S r$   )rq   r   Ú_destinationrj   r    r    r!   r     s    zUDPServerPipe.__init__c                 C   s*   t   t jt j¡| _| j | j| jf¡ d S r$   )r   r‚   rƒ   re   rx   ri   rW   r"   r    r    r!   r#   	  s    zUDPServerPipe.startc                 C   s(   | j r| j || j ¡ n| j |¡ d S r$   )r†   re   Úsendtors   rz   r=   r    r    r!   r?     s    zUDPServerPipe.pushc                 C   s¾   | j rFz| j d¡}W n tjy4   |  ¡  ‚ Y n0 |rº|  |¡ nt| j d¡\}}|rd|  |¡ || _ |  |¡ |  	|¡ z"| j
jdd�}| j || j ¡ W q~ ty¶   Y qºY q~0 q~d S )Nrn   Fr{   )r†   re   r*   r   ro   r'   r+   Úrecvfromr~   r_   rs   r   r‡   r   )r   r>   Údestr    r    r!   r.     s&    


zUDPServerPipe.deliver)rG   r   Nr„   r    r    r    r!   r…   ÷  s
   
r…   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚTriggeredMessagezÓSend a preloaded message when triggered and trigger in chain

    .. code::

         +------^------+
      >>-|      | /----|->>
         |      |/     |
       >-|-[ message ]-|->
         +------^------+
    Nc                 C   s   t j| |d� || _d S r5   )r   r   r>   )r   r>   r   r    r    r!   r   :  s    zTriggeredMessage.__init__c                 C   s&   |   | j¡ |  | j¡ |  |¡ d S r$   )r+   r>   r_   r~   )r   Ztrigmsgr    r    r!   Ú
on_trigger?  s    zTriggeredMessage.on_trigger)N)r0   r1   r2   r3   r   r‹   r    r    r    r!   rŠ   .  s   
rŠ   c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚTriggerDrainzÈPass messages and trigger when a condition is met

    .. code::

         +------^------+
      >>-|-[condition]-|->>
         |      |      |
       >-|-[condition]-|->
         +-------------+
    Nc                 C   s   t j| |d� || _d S r5   )r   r   r7   )r   r7   r   r    r    r!   r   R  s    zTriggerDrain.__init__c                 C   s&   |   |¡}|r|  |¡ |  |¡ d S r$   )r7   r~   r+   ©r   r>   Úvr    r    r!   r?   W  s    

zTriggerDrain.pushc                 C   s&   |   |¡}|r|  |¡ |  |¡ d S r$   )r7   r~   r_   r�   r    r    r!   rb   ^  s    

zTriggerDrain.high_push)Nrc   r    r    r    r!   rŒ   F  s   
rŒ   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚTriggeredValvezÎLet messages alternatively pass or not, changing on trigger

.. code::

         +------^------+
      >>-|-[pass/stop]-|->>
         |      |      |
       >-|-[pass/stop]-|->
         +------^------+
    TNc                 C   s   t j| |d� || _d S r5   )r   r   Úopened©r   Zstart_stater   r    r    r!   r   r  s    zTriggeredValve.__init__c                 C   s   | j r|  |¡ d S r$   )r�   r+   r=   r    r    r!   r?   w  s    zTriggeredValve.pushc                 C   s   | j r|  |¡ d S r$   )r�   r_   r=   r    r    r!   rb   |  s    zTriggeredValve.high_pushc                 C   s   |  j dN  _ |  |¡ d S r)   )r�   r~   r=   r    r    r!   r‹   �  s    zTriggeredValve.on_trigger)TN©r0   r1   r2   r3   r   r?   rb   r‹   r    r    r    r!   r�   f  s
   
r�   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚTriggeredQueueingValvezÚLet messages alternatively pass or queued, changing on trigger

    .. code::

         +------^-------+
      >>-|-[pass/queue]-|->>
         |      |       |
       >-|-[pass/queue]-|->
         +------^-------+
    TNc                 C   s    t j| |d� || _tƒ | _d S r5   )r   r   r�   r   rs   r‘   r    r    r!   r   “  s    zTriggeredQueueingValve.__init__c                 C   s   t ƒ | _d S r$   )r   rs   r"   r    r    r!   r#   ™  s    zTriggeredQueueingValve.startc                 C   s&   | j r|  |¡ n| j d|f¡ d S r)   ©r�   r+   rs   rz   r=   r    r    r!   r?   �  s    zTriggeredQueueingValve.pushc                 C   s&   | j r|  |¡ n| j d|f¡ d S r8   r”   r=   r    r    r!   rb   ¤  s    z TriggeredQueueingValve.high_pushc                 C   sf   |  j dN  _ |  |¡ z| jjdd�\}}W n tyD   Y qbY q0 |rV|  |¡ q|  |¡ qd S )NTFr{   )r�   r~   rs   r   r   r+   r_   )r   r>   Úlowr    r    r!   r‹   «  s    

z!TriggeredQueueingValve.on_trigger)TN)	r0   r1   r2   r3   r   r#   r?   rb   r‹   r    r    r    r!   r“   ‡  s   
r“   c                   @   s.   e Zd ZdZd
dd„Zdd„ ZeZdd	„ ZdS )ÚTriggeredSwitchzÒLet messages alternatively high or low, changing on trigger

    .. code::

         +------^------+
      >>-|-\    |    /-|->>
         |  [up/down]  |
       >-|-/    |    \-|->
         +------^------+
    TNc                 C   s   t j| |d� || _d S r5   )r   r   r•   r‘   r    r    r!   r   Ç  s    zTriggeredSwitch.__init__c                 C   s    | j r|  |¡ n
|  |¡ d S r$   )r•   r+   r_   r=   r    r    r!   r?   Ì  s    zTriggeredSwitch.pushc                 C   s   |  j dN  _ |  |¡ d S r)   )r•   r~   r=   r    r    r!   r‹   Ô  s    zTriggeredSwitch.on_trigger)TNr’   r    r    r    r!   r–   »  s
   
r–   )1Ú
__future__r   r   rO   Zscapy.libs.six.moves.queuer   r   Zscapy.automatonr   Zscapy.configr   Zscapy.compatr   Zscapy.interfacesr   Zscapy.packetr	   Zscapy.pipetoolr
   r   r   Zscapy.utilsr   r   r   Zscapy.supersocketr   r   r   r   r   r   r   r4   r:   rA   rB   rF   rS   rd   rh   rq   r�   r…   rŠ   rŒ   r�   r“   r–   r    r    r    r!   Ú<module>   s:   	>( => 1;)7 !4