
    h$                     H   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mZ ddlm	Z	 ddl
mZmZmZ ddl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  ed	ee          Z G d
 de          Z G d dee         e          Z G d dee                   Z  G d de           Z!dS )z
Answering machines.
    N)get_if_addr)conf)sendpsniffAsyncSniffer)Packet)
PacketList)	AnyCallableDictGenericOptionalTupleTypeTypeVarcast_Tc                        e Zd Z fdZ xZS )ReferenceAMc           	         t          dt          t          |                               | |||                    }	 dd l}|                    |j                  |_        n# t          t          f$ r Y nw xY w|j
        rd|fd}|j
        x|_        |_        |j        p|j        j        |_        	 |j        |_        n# t          $ r Y nw xY w|t                      |j
        <   |S )NzType[AnsweringMachine[_T]]r   c                 "      | |i |            S N )objargskargss      T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/ansmachine.py<lambda>z%ReferenceAM.__new__.<locals>.<lambda>:   s    3F333F3F3F3H3H     )r   superr   __new__inspect	signatureparse_options__signature__ImportErrorAttributeErrorfunction_name__name____qualname____doc__globals)clsnamebasesdctr   r"   func	__class__s          r   r!   zReferenceAM.__new__*   s    /c**223eSIIK K	NNN ' 1 1!! !C ^, 	 	 	D	 		0!HHHD030AADMD-;C#*;*CDL%(%6"""   +/GIIc'(
s#   #A   A43A4/B< <
C	C	)r)   
__module__r*   r!   __classcell__)r2   s   @r   r   r   )   s8                r   r   c                       e Zd ZdZdZddiZg dZddiZg dZ e	e
          Zd Zd	 Zd
 Zd Zd Zd Zej        d             ZddZd ZddZd Zd Zd Zd Zd ZdS )AnsweringMachine Nstorer   )	r8   ifacecountpromiscfiltertypeprnstop_filteropened_socketverbose)r9   interlooprA   socketc                 8   d| _         |                    dt          j        dk              | _        | j        r|                    d| j                   |                    d| j                   i | _        i | _	        i | _
        |                     d|          \  }}| j                                        | _        | j                            |           | j                                        | _        | j                            |           i | _        i | _        d S )Nr   rA   r<   r>      )modegetr   verbrA   r<   
setdefaultreplyoptam1optam2optam0parse_all_optionssend_optionscopy
defoptsendupdatesniff_optionsdefoptsniffoptsendoptsniff)selfr   doptsend	doptsniffs       r   __init__zAnsweringMachine.__init__P   s    	yyDIN;;; 	4Xt{333
+++"44Q>>)+0022x(((-2244	***r   c                 ^    | j         | j        fD ]}||v r
||         c S t          |          r   )rM   rL   r'   )rX   attrr0   s      r   __getattr__zAnsweringMachine.__getattr__b   sF    K- 	! 	!Cs{{4y    T"""r   c                     | j                             dd          }|dk    r|| j         |<   d S || j        | j        g|dz
           |<   d S )NrG   r   rF   )__dict__rH   rL   rM   )rX   r]   valrG   s       r   __setattr__zAnsweringMachine.__setattr__i   sV    }  ++199"%DM$9<T[$+&tax0666r   c                     d S r   r   rX   s    r   r$   zAnsweringMachine.parse_optionsq       r   c                    i }i }t          |          D ]>}|| j        v r||         ||<   || j        v r||         ||<   || j        | j        z   v r||= ?|dk    s|r|dk    r|| _        nE|dk    r?|r=| j                                        }|                    |            | j        di | |}| j                            dd          }|| j        d<    | j        di | || j        d<   ||fS )N   rF   rG   r   r   )	listsniff_options_listsend_options_listrN   rQ   rS   r$   r`   rH   )rX   rG   r   sniffoptsendoptkomodes          r   rO   z"AnsweringMachine.parse_all_optionsu   s4   e 	 	AD+++#AhD***"1X
D+d.DDDD!H1999qyy#uK$$&&""''Q'''M%%fa00E$(DM&!D'''''$)DM&!  r   c                     dS )NrF   r   rX   reqs     r   
is_requestzAnsweringMachine.is_request   s    qr   c                     d S r   r   rp   s     r   
make_replyzAnsweringMachine.make_reply   s	     	r   c                 J    |r ||           d S  | j         |fi | j         d S r   )send_functionrV   )rX   rK   rv   s      r   
send_replyzAnsweringMachine.send_reply   sC     	6M%     Du5555555r   c                    t          |t                    r2t          |                                dd |D                        d S t          |                                d|                                           d S )Nz ==> c                 6    g | ]}|                                 S r   )summary).0ress     r   
<listcomp>z0AnsweringMachine.print_reply.<locals>.<listcomp>   s     !A!A!AC#++--!A!A!Ar   )
isinstancer	   printrz   )rX   rq   rK   s      r   print_replyzAnsweringMachine.print_reply   s    eZ(( 	B!A!A5!A!A!A!AC D D D D D @AAAAAr   c                 6   |                      |          sd S |r|                     ||          }n|                     |          }|sd S |r|                     ||           n|                     |           | j        r|                     ||           d S d S )N)address)rv   )rr   rt   rw   rA   r   )rX   pktrv   r   rK   s        r   rK   zAnsweringMachine.reply   s    s## 	F 	)OOCO99EEOOC((E 	F 	#OOEO???? OOE"""< 	)S%(((((	) 	)r   c                 J    t          j        dt                      | |i | d S )Nz5run() method deprecated. The instance is now callable)warningswarnDeprecationWarning)rX   r   r   s      r   runzAnsweringMachine.run   s9    C	
 	
 	
 	der   c                 L    |                     dd            | |i | | j        S )NbgT)rJ   sniffer)rX   r   kwargss      r   r   zAnsweringMachine.bg   s5    $%%%df|r   c                    |                     dd          }|                     d|          \  }}| j                                        | _        | j                            |           | j                                        | _        | j                            |           |r|                                  d S 	 | 	                                 d S # t          $ r t          d           Y d S w xY w)Nr   Frg   zInterrupted by user)poprO   rR   rQ   rV   rS   rU   rW   sniff_bgr   KeyboardInterruptr   )rX   r   r   r   rV   rW   s         r   __call__zAnsweringMachine.__call__   s    YYtU## 221e<<++--G$$$(--//X&&& 	-MMOOOOO-

$ - - -+,,,,,,-s   9C C,+C,c                 (    t          di | j         d S Nr   )r   rW   rd   s    r   r   zAnsweringMachine.sniff   s    r   c                 d    t          di | j        | _        | j                                         d S r   )r   rW   r   startrd   s    r   r   zAnsweringMachine.sniff_bg   s3    #44dm44r   r   )NN)r)   r3   r*   r(   r<   rT   ri   rP   rj   staticmethodr   rv   r[   r^   rb   r$   rO   rr   abcabstractmethodrt   rw   r   rK   r   r   r   r   r   r   r   r   r6   r6   F   s^       MFaLMI I Iq>LGGG L''M  $# # #= = =  ! ! !2   	  6 6 6 6B B B) ) ) )&    - - -"      r   r6   )	metaclassc                   P    e Zd ZdZej        Zdej        fdZ	d Z
d Zd Zd	dZdS )
AnsweringMachineTCPzd
    An answering machine that use the classic socket.socket to
    answer multiple TCP clients
    P   c                 "    || _         || _        d S r   )portr-   )rX   r   r-   s      r   r$   z!AnsweringMachineTCP.parse_options   s    	r   c                     d S r   r   rd   s    r   closezAnsweringMachineTCP.close   re   r   c                    ddl m} t          j        t          j        | j                  }	 |                    t          j        t          j        d           n# t          $ r Y nw xY w|	                    t          | j                            dt          j                            | j        f           |                                 g }	 	 |                                \  }}t%          dt'          |          z              ||| j                  }| j                                        }t-          j        | j        |j        |          |d<   |d= t5          d
d	|i|}|                                 |                    ||f           # |D ]?\  }}	 |                                 n# t<          $ r Y nw xY w|                                 @|                                  |                                 w xY w)Nr   )StreamSocketrF   r9   Tz%s connected)rv   r   r>   r@   r   ) scapy.supersocketr   rD   AF_INETTYPE
setsockopt
SOL_SOCKETSO_REUSEADDROSErrorbindr   rW   rH   r   r9   r   listenacceptr   reprr-   rQ   	functoolspartialrK   sendr   r   appendstop	Exceptionr   )	rX   r   ssocksniffersclientsocketr   sockrW   r   s	            r   r   zAnsweringMachineTCP.sniff   s   222222fndi88	V.0CQGGGG 	 	 	D	

**7DJ??@@$)L	N 	N 	N	1(-%gntG}}4555#|L$(;;=--//"+"3DJBF)<C#E #E #E W%&FFTFXFF$0001 $,  $LLNNNN    D

JJLLLKKMMMMsC   +A 
A%$A%CF G9F+*G9+
F8	5G97F8	8AG9c                 v    t          j        | j                  | _        | j                                         d S )N)target)	threadingThreadr   r   r   rd   s    r   r   zAnsweringMachineTCP.sniff_bg  s3     'tz:::r   Nc                     |S r   r   )rX   rq   r   s      r   rt   zAnsweringMachineTCP.make_reply  s    
r   r   )r)   r3   r*   r+   rD   SOCK_STREAMr   r   	raw_layerr$   r   r   r   rt   r   r   r   r   r      s          D!#    
  ! ! !F  
     r   r   c                        e Zd ZdZej        ZdS )AnsweringMachineUDPzd
    An answering machine that use the classic socket.socket to
    answer multiple UDP clients
    N)r)   r3   r*   r+   rD   
SOCK_DGRAMr   r   r   r   r   r     s"          DDDr   r   )"r+   r   r   r   rD   r   
scapy.archr   scapy.configr   scapy.sendrecvr   r   r   scapy.packetr   scapy.plistr	   typingr
   r   r   r   r   r   r   r   r   r   r=   r   r6   r   r   r   r   r   <module>r      s    


           " " " " " "       5 5 5 5 5 5 5 5 5 5       " " " " " "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 WT6:&&    $   :Y Y Y Y Ywr{k Y Y Y Yx: : : : :*62 : : :z    -     r   