a
    kÄ#d'#  ã                   @   sô   d 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  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 ed	eeƒZG d
d„ deƒZe  e¡G dd„ dee ƒƒZ!G dd„ de!e ƒZ"dS )z
Answering machines.
é    N)Úget_if_addr)Úconf)ÚsendÚsniffÚAsyncSniffer)ÚPacket)Ú
PacketList)
ÚAnyÚCallableÚDictÚGenericÚOptionalÚTupleÚTypeÚTypeVarÚ_Generic_metaclassÚcastÚ_Tc                       s   e Zd Z‡ fdd„Z‡  ZS )ÚReferenceAMc              	      s®   t dtt| ƒ | |||¡ƒ}zdd l}| |j¡|_W n tt	fyL   Y n0 |j
rª|fdd„}|j
 |_|_|jpz|jj|_z|j|_W n t	yœ   Y n0 |tƒ |j
< |S )NzType[AnsweringMachine[_T]]r   c                 _   s   | |i |¤Žƒ S ©N© )ÚobjÚargsÚkargsr   r   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/ansmachine.pyÚ<lambda>;   ó    z%ReferenceAM.__new__.<locals>.<lambda>)r   Úsuperr   Ú__new__ÚinspectÚ	signatureÚparse_optionsÚ__signature__ÚImportErrorÚAttributeErrorÚfunction_nameÚ__name__Ú__qualname__Ú__doc__Úglobals)ÚclsÚnameÚbasesÚdctr   r   Úfunc©Ú	__class__r   r   r   +   s(    ÿÿ
zReferenceAM.__new__)r&   Ú
__module__r'   r   Ú__classcell__r   r   r/   r   r   *   s   r   c                   @   s¸   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d	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd&dd„Zdd„ Zd'dd„Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ ZdS )(ÚAnsweringMachineÚ NÚstorer   )	r5   ÚifaceÚcountZpromiscÚfilterÚtypeÚprnZstop_filterÚopened_socketÚverbose)r6   ÚinterÚloopr<   Úsocketc                 K   sž   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   r<   r8   r:   é   )ÚmodeÚgetr   Úverbr<   r8   Ú
setdefaultÚreplyÚoptam1Úoptam2Úoptam0Úparse_all_optionsÚsend_optionsÚcopyÚ
defoptsendÚupdateÚsniff_optionsÚdefoptsniffÚoptsendÚoptsniff)Úselfr   ZdoptsendZ	doptsniffr   r   r   Ú__init__R   s    zAnsweringMachine.__init__c                 C   s2   | j | jfD ]}||v r||   S qt|ƒ‚d S r   )rG   rF   r$   )rR   Úattrr-   r   r   r   Ú__getattr__d   s    zAnsweringMachine.__getattr__c                 C   s>   | j  dd¡}|dkr"|| j |< n|| j| jg|d  |< d S )NrA   r   r@   )Ú__dict__rB   rF   rG   )rR   rT   ÚvalrA   r   r   r   Ú__setattr__k   s    zAnsweringMachine.__setattr__c                 C   s   d S r   r   ©rR   r   r   r   r!   s   s    zAnsweringMachine.parse_optionsc                 C   sâ   i }i }t |ƒD ]F}|| jv r*|| ||< || jv r@|| ||< || j| j v r||= q|dksd|rÚ|dkrt|| _n4|dkr¨|r¨| j ¡ }| |¡ | jf i |¤Ž |}| j dd¡}|| jd< | jf i |¤Ž || jd< ||fS )Né   r@   rA   r   )	ÚlistÚsniff_options_listÚsend_options_listrH   rK   rM   r!   rV   rB   )rR   rA   r   ZsniffoptZsendoptÚkZomoder   r   r   rI   w   s,    





z"AnsweringMachine.parse_all_optionsc                 C   s   dS )Nr@   r   ©rR   Úreqr   r   r   Ú
is_request�   s    zAnsweringMachine.is_requestc                 C   s   |S r   r   r_   r   r   r   Ú
make_reply”   s    zAnsweringMachine.make_replyc                 C   s&   |r||ƒ n| j |fi | j¤Ž d S r   )Úsend_functionrP   )rR   rE   rc   r   r   r   Ú
send_reply˜   s    
zAnsweringMachine.send_replyc                 C   sF   t |tƒr*td| ¡ dd„ |D ƒf ƒ ntd| ¡ | ¡ f ƒ d S )Nz	%s ==> %sc                 S   s   g | ]}|  ¡ ‘qS r   )Úsummary)Ú.0Úresr   r   r   Ú
<listcomp>£   r   z0AnsweringMachine.print_reply.<locals>.<listcomp>)Ú
isinstancer   Úprintre   )rR   r`   rE   r   r   r   Úprint_replyŸ   s
    

ÿ
zAnsweringMachine.print_replyc                 C   sh   |   |¡sd S |r"| j||d�}n
|  |¡}|s4d S |rH| j||d� n
|  |¡ | jrd|  ||¡ d S )N)Úaddress)rc   )ra   rb   rd   r<   rk   )rR   Zpktrc   rl   rE   r   r   r   rE   §   s    


zAnsweringMachine.replyc                 O   s   t  dt¡ | |i |¤Ž d S )Nz5run() method deprecated. The instance is now callable)ÚwarningsÚwarnÚDeprecationWarning)rR   r   r   r   r   r   Úrunº   s
    þzAnsweringMachine.runc                 O   s    |  dd¡ | |i |¤Ž | jS )NÚbgT)rD   Úsniffer)rR   r   Úkwargsr   r   r   rq   Â   s    zAnsweringMachine.bgc                 O   s†   |  dd¡}|  d|¡\}}| j ¡ | _| j |¡ | j ¡ | _| j |¡ |rZ|  ¡  n(z|  	¡  W n t
y€   tdƒ Y n0 d S )Nrq   FrZ   zInterrupted by user)ÚpoprI   rL   rK   rP   rM   rO   rQ   Úsniff_bgr   ÚKeyboardInterruptrj   )rR   r   r   rq   rP   rQ   r   r   r   Ú__call__È   s    
zAnsweringMachine.__call__c                 C   s   t f i | j¤Ž d S r   )r   rQ   rY   r   r   r   r   Ù   s    zAnsweringMachine.sniffc                 C   s    t f i | j¤Ž| _| j ¡  d S r   )r   rQ   rr   ÚstartrY   r   r   r   ru   Ý   s    zAnsweringMachine.sniff_bg)N)NN)r&   r1   r'   r%   r8   rN   r\   rJ   r]   Ústaticmethodr   rc   rS   rU   rX   r!   rI   ra   rb   rd   rk   rE   rp   rq   rw   r   ru   r   r   r   r   r3   G   s,   

r3   c                       sB   e Zd ZdZdejfdd„Zdd„ Zdd„ Zd‡ fd
d„	Z	‡  Z
S )ÚAnsweringMachineTCPz`
    An answering machine that use the classic socket.socket to
    answer multiple clients
    éP   c                 C   s   || _ tj| _d S r   )Úportr   Ú	raw_layerr*   )rR   r|   r*   r   r   r   r!   è   s    z!AnsweringMachineTCP.parse_optionsc                 C   s   d S r   r   rY   r   r   r   Úcloseí   s    zAnsweringMachineTCP.closec           	      C   s^  ddl m} t tjtj¡}| t| j dt	j
¡ƒ| jf¡ | ¡  g }zÄ| ¡ \}}tdt|ƒ ƒ ||| jƒ}| j ¡ }tj| j|j|d�|d< |d= tf d|i|¤Ž}| ¡  | ||f¡ qJW |D ]0\}}z| ¡  W n tyð   Y n0 | ¡  qÊ|  ¡  | ¡  nL|D ]4\}}z| ¡  W n t�y:   Y n0 | ¡  �q|  ¡  | ¡  0 d S )Nr   )ÚStreamSocketr6   z%s connected)rc   rl   r:   r;   )Zscapy.supersocketr   r?   ÚAF_INETÚSOCK_STREAMÚbindr   rQ   rB   r   r6   r|   ÚlistenÚacceptrj   Úreprr*   rK   Ú	functoolsÚpartialrE   r   r   rx   ÚappendÚstopÚ	Exceptionr~   )	rR   r   ZssockZsniffersZclientsocketrl   ÚsockrQ   rr   r   r   r   r   ñ   sH    ÿ
þ


ùzAnsweringMachineTCP.sniffNc                    s   t t| ƒ |¡S r   )r   rz   rb   )rR   r`   rl   r/   r   r   rb     s    zAnsweringMachineTCP.make_reply)N)r&   r1   r'   r(   r   r}   r!   r~   r   rb   r2   r   r   r/   r   rz   ã   s
   rz   )#r(   r†   r?   rm   Z
scapy.archr   Zscapy.configr   Zscapy.sendrecvr   r   r   Zscapy.packetr   Zscapy.plistr   Zscapy.libs.sixZlibsÚsixZscapy.compatr	   r
   r   r   r   r   r   r   r   r   r   r   Úadd_metaclassr3   rz   r   r   r   r   Ú<module>   s    0 