
    h:              	       x   d Z ddl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
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mZmZmZ dd	lmZ erdd
lmZ  G d de          Z G d de          Z G d de          Z dee         dee!ee"ef         ee"ef         gee         f         fdZ# G d de          Z$dS )z0
Sessions: decode flow of packets when sniffing
    )defaultdictNorb)conf)	NoPayloadPacket)	inet_pton)AnyCallableDefaultDictDictIteratorListOptionalTupleTypecastTYPE_CHECKING)Self)SuperSocketc                   d    e Zd ZdZddee         fdZdedee         fdZdd	de	e         fd
Z
dS )DefaultSessionz#Default session: no stream decodingNsupersessionc                 V    |rt          |t                    s
 |            }|| _        d S N)
isinstancer   r   )selfr   s     R/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/sessions.py__init__zDefaultSession.__init__(   s4     	*
< H H 	*'<>>L(    pktreturnc                 H    | j         r| j                             |          S |S )z2
        Called to pre-process the packet
        )r   process)r   r!   s     r   r$   zDefaultSession.process-   s+    
  	2$,,S111
r    sockr   c              #   t   K   |                                 }|sdS |                     |          }|r|V  dS dS )?
        Will be called by sniff() to ask for a packet
        N)recvr$   r   r%   r!   s      r   r(   zDefaultSession.recv6   sR       iikk 	Fll3 	IIIII	 	r    r   )__name__
__module____qualname____doc__r   r   r   r   r$   r   r(    r    r   r   r   %   s        --) )Xd^ ) ) ) )
6 hv&6    	 	8F+; 	 	 	 	 	 	r    r   c                   4    e Zd ZdZd Zdedee         fdZdS )	IPSessionzVDefragment IP packets 'on-the-flow'.

    Usage:
    >>> sniff(session=IPSession)
    c                 b    t          j        | g|R i | t          t                    | _        d S r   )r   r   r   list	fragments)r   argskwargss      r   r   zIPSession.__init__I   s6    6t666v666$T**r    packetr"   c                 T    ddl m}m} |sd S ||vr|S  ||| j                  d         S )Nr   )IP_defrag_ip_pkt   )scapy.layers.inetr8   r9   r3   )r   r6   r8   r9   s       r   r$   zIPSession.processN   sP    88888888 	4VM~fdn55a88r    N)r*   r+   r,   r-   r   r   r   r$   r.   r    r   r0   r0   B   sT         + + +
9f 9&)9 9 9 9 9 9 9r    r0   c                   r    e Zd ZdZd Zddedee         ddfdZdeddfd	Z	d
 Z
d Zd ZeZd Zd Zd ZdS )StringBufferaW  StringBuffer is an object used to re-order data received during
    a TCP transmission.

    Each TCP fragment contains a sequence number, which marks
    (relatively to the first sequence number) the index of the data contained
    in the fragment.

    If a TCP fragment is missed, this class will fill the missing space with
    zeros.
    c                 X    t          d          | _        d| _        d| _        g | _        d S )Nr    r   )	bytearraycontentcontent_lennoff
incompleter   s    r   r   zStringBuffer.__init__c   s)     ~~	r    Ndataseqr"   c                    |sd S t          |          }|| j        }|dz
  | j        z
  }|dk     rCt          d| z            | j        z   | _        | xj        | z  c_        | xj        |z  c_        d}||z   | j        k    rG| xj        d|| j        z
  |z   z  z  c_        ||z   | _        t          | j                  | j        k    sJ |t          | j                  |||z   <   d S )Nr:   r       )lenrA   rB   r?   r@   
memoryview)r   rE   rF   data_lens       r   appendzStringBuffer.appendj   s    	Ft99;"CAg	!77 %W%566EDL#&IIIIC>D,,,LLGsT-='='HIILL  #X~Dt|$$(88888
 8<
4<  S8^!3444r    ic                 N    | j         |d          | _         | xj        |z  c_        d S r   )r@   rA   )r   rM   s     r   	shiftleftzStringBuffer.shiftleft   s.    |ABB'Ar    c                      t          |           S r   )boolrD   s    r   fullzStringBuffer.full   s     Dzzr    c                 .    |                                   d S r   )r   rD   s    r   clearzStringBuffer.clear   s    r    c                 *    t          | j                  S r   )rQ   rA   rD   s    r   __bool__zStringBuffer.__bool__   s    D$%%%r    c                     | j         S r   )rA   rD   s    r   __len__zStringBuffer.__len__   s    r    c                 *    t          | j                  S r   )bytesr@   rD   s    r   	__bytes__zStringBuffer.__bytes__   s    T\"""r    c                 P    t          t          |                                           S r   )r   strr[   rD   s    r   __str__zStringBuffer.__str__   s    C))***r    r   )r*   r+   r,   r-   r   rZ   r   intrL   rO   rR   rT   rV   __nonzero__rX   r[   r^   r.   r    r   r=   r=   W   s        	 	  < <5 <x} < < < < <63 4        & & & K     # # #+ + + + +r    r=   clsr"   c                 <     t           d          r j        S  fdS )z8
    Wraps a class for use when dissecting streams.
    tcp_reassemblec                     | o
 |           S r   r.   )rE   _ra   s     r   <lambda>zstreamcls.<locals>.<lambda>   s     2T r    )hasattrrc   )ra   s   `r   	streamclsrh      s2     s$%% 3!! 32222r    c                        e Zd ZdZd fd	ZddZdedee         fdZ		 dded	ee
e                  dee         f fd
Zdddee         fdZ xZS )
TCPSessiona  A Session that reconstructs TCP streams.

    NOTE: this has the same effect as wrapping a real socket.socket into StreamSocket,
    but for all concurrent TCP streams (can be used on pcaps or sniffed sessions).

    NOTE: only protocols that implement a ``tcp_reassemble`` function will be processed
    by this session. Other protocols will not be reconstructed.

    DEV: implement a class-function `tcp_reassemble` in your Packet class::

        @classmethod
        def tcp_reassemble(cls, data, metadata, session):
            # data = the reassembled data from the same request/flow
            # metadata = empty dictionary, that can be used to store data
            #            during TCP reassembly
            # session = a dictionary proper to the bidirectional TCP session,
            #           that can be used to store anything
            [...]
            # If the packet is available, return it. Otherwise don't.
            # Whenever you return a packet, the buffer will be discarded.
            return pkt
            # Otherwise, maybe store stuff in metadata, and return None,
            # as you need additional data.
            return None

    For more details and a real example, see:
    https://scapy.readthedocs.io/en/latest/usage.html#how-to-use-tcpsession-to-defragment-tcp-packets

    :param app: Whether the socket is on application layer = has no TCP
                layer. This is identical to StreamSocket so only use this if your
                underlying source of data isn't a socket.socket.
    Fc                     t          t          |           j        |i | || _        |r"t	                      | _        i | _        i | _        n.t          d           | _	        t          t                    | _        ddlm} || _        d S )Nc                  "    t                      i fS r   )r=   r.   r    r   rf   z%TCPSession.__init__.<locals>.<lambda>   s    , r    r   )TCP)superrj   r   appr=   rE   metadatasessionr   	tcp_fragsdicttcp_sessionsr;   rm   stop_dissection_after)r   ro   r4   r5   rm   	__class__s        r   r   zTCPSession.__init__   s    (j$($9&999 	$DIDMDLL ),, DN !,! !D 	*)))))%("""r    c                 h   |d         j         }d|v rt          j        nt          j        }|rt	          ||j                  pd}|rt	          ||j                  pd}|r0d }t          j        d |||          |j	        |j
        z            S ||z   t          j        d|j	        |j
                  z   S )Nrm   IPv6r    c                 P    t          d t          | |          D                       S )Nc              3   Z   K   | ]&\  }}t          |          t          |          z  V  'd S r   r   ).0abs      r   	<genexpr>z5TCPSession._get_ident.<locals>.xor.<locals>.<genexpr>   s6      CCASVVc!ff_CCCCCCr    )rZ   zip)xys     r   xorz"TCPSession._get_ident.<locals>.xor   s'    CCQCCCCCCr    z!4sHz!HH)
underlayersocketAF_INET6AF_INETr	   srcdststructpackdportsport)r   r!   rq   r   afr   r   r   s           r   
_get_identzTCPSession._get_ident   s    Z*
 &#V__6>:Yr:>::Ac:Yr:>::Ac 	HD D D ;vss3}}ci#)6KLLL 9v{5#)SYGGGGr    r!   r"   c                     t          |t          j                  rt          t          |j                  S |                    t          j                  }|(|j        !|j        `t          t          |j                  S dS )zAStrip the packet of any padding, and return the padding.
        N)	r   r   padding_layerr   rZ   loadgetlayerr   payload)r   r!   pads      r   _strip_paddingzTCPSession._strip_padding   sj     c4-.. 	)sx(((ll4-..?s~9&sx(((tr    Nra   c                 t	   d}| j         rd| j                            t          |                     |t	          |t                    s|j        }d| j        v r| j        d         }n|t          |          x| j        d<   }ndS | j                                        r) |t          | j                  | j        | j	                  }|r| 
                    |          }|rY| j                            t          | j                  t          |          z
             t	          |t          j                  rdS n| j                                         | j                                         |S dS t!          t"          |                               |          }|dS |}ddlm}m} |sdS ||vr|S ||         j        }	t	          |	t.          t          j        f          r|S |	j        }
|                     |          }| j        |         \  }}| j        |                     |d                   }||         j        }d|vr||d<   d|v r+||d         k     r|
|d         |z
  d         }
|
sdS |d         }d|vr5||                             |
          x|d<   }t          |          x|d<   }n|d         }|                    d	d          }|
|d
z
  x}|d	<   ||z
  }|                    |
|           ||         j        j         s||         j        j!        rd|d<   ||         j        j"        rd|d<   |                                r$||d<   ||d<    |t          |          ||          }|rMd|v r|d         ||         _        |                                 | 
                    |          }|rn|j#        t          |          z
  }||z   |d	<   |                    |            |t          |          ||          }|r||z  }| 
                    |          }nn|n|                                 | j        |= ||         j        t          |
          z   |d<   t	          |t          j                  rdS |	j$        %                                 ||v rd||         _        d||         _&        ||z  }d|_'        |S dS )zzProcess each packet: matches the TCP seq/ack numbers
        to follow the TCP streams, and orders the fragments.
        Nrc   r   )r8   rm   TrF   next_seq	pay_classrelative_seqr:   tcp_endtcp_pshoriginalident)(ro   rE   rL   rZ   r   rv   rp   rh   rR   rq   r   rO   rI   r   r   rT   rn   rj   r$   r;   r8   rm   r   r   r   r   rr   rt   rF   guess_payload_classgetflagsFRPrA   r   remove_payloadchksumwirelen)r   r!   ra   r6   rc   padding_pktr8   rm   paynew_datar   rE   rp   tcp_sessionrF   r   r   full_length
sub_packetrv   s                       r   r$   zTCPSession.process  s9    8 	IU3ZZ((({:c5#9#9{m4=00!%/?!@CLS>>Q./..ty~~ '$)$$ML 
  --f55 &I''DIW(EFFF!&$*<== $#t$ IOO%%%##%%%4Z&&..s33<4C-------- 	4c>>J#hcIt'9:;; 	J<$$.h'T(B(BC#hl  !HUO!!cHZ,@&@&@ 4s : ; ;<H t:&Ch&&03C0L0LX0V0VVH[!I:CI:N:NNH%&%&67N||ND9969Ag=L8N3L Hc"""s8> 	's3x~/ 	'"&HY s8> 	'"&HY 99;; 	#&HZ  %HW#^d F  '	  'CNN))&11G *".W=+7++E({++++^$KK 

  j(F"11*==GG  *$ 

N5)#&s8<#h--#?HZ &$"455 tN))+++Syy"B!%B,CCKJtr    r%   r   c              #      K   |                     | j                  }| j        r"||                     |          }|r|V  d}|n|                     |          }|r|V  dS )r'   )ru   Nr    )r(   ru   ro   r$   r)   s      r   r(   zTCPSession.recv  s       iid.HiII8 
	/ll3'' IIIC / ,,s##C 			tr    )Fr   )r*   r+   r,   r-   r   r   r   r   rZ   r   r   r$   r   r(   __classcell__)rv   s   @r   rj   rj      s        B) ) ) ) ) )*H H H H 
& 
Xe_ 
 
 
 
 /3M MMd6l+M7?7GM M M M M M^ 8F+;        r    rj   )%r-   collectionsr   r   r   scapy.compatr   scapy.configr   scapy.packetr   r   scapy.pton_ntopr	   typingr
   r   r   r   r   r   r   r   r   r   r   r   scapy.supersocketr   objectr   r0   r=   rZ   r]   rh   rj   r.   r    r   <module>r      sJ  
  $ # # # # #               * * * * * * * * % % % % % %                                .------    V   :9 9 9 9 9 9 9 9*K+ K+ K+ K+ K+6 K+ K+ K+\34< 3H
DcNDcN+V% 3 3 3 3s s s s s s s s s sr    