a
    kÄ#dJ  ã                   @   sÖ  d Z ddlmZ ddlmZm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mZ ddlmZmZmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlm  mZ ddlm Z  ddlZ!ddl"m#Z#m$Z$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/m0Z0m1Z1 G dd„ de1ƒZ2dZ3dZ4dZ5dZ6G dd„ dej7ƒZ8e 9e2¡G dd„ dƒƒZ:e�s‚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@dS )&z
SuperSocket.
é    )Úabsolute_import)ÚselectÚerrorN)Úconf)ÚDARWINÚWINDOWS)ÚMTUÚETH_P_IPÚ
SOL_PACKETÚSO_TIMESTAMPNS)Úraw)ÚwarningÚlog_runtime)Únetwork_name)ÚPacket)Ú
PacketListÚ
SndRcvListÚ_PacketIterable)Ú
PcapReaderÚtcpdump)Ú_GlobInterfaceType)ÚAnyÚIteratorÚListÚOptionalÚTupleÚTypeÚcastÚ_Generic_metaclassc                   @   s   e Zd ZdZdd„ ZdS )Ú_SuperSocket_metaclassNc                 C   s(   | j d urd| j| j f S d| j S d S )Nz<%s: %s>z<%s>)ÚdescÚ__name__©Úself© r$   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/supersocket.pyÚ__repr__5   s    
z_SuperSocket_metaclass.__repr__)r!   Ú
__module__Ú__qualname__r    r&   r$   r$   r$   r%   r   2   s   r   é   i �  é   é@   c                   @   sH   e Zd ZdejfdejfdejfdejfdejfdejfdejfgZdS )	Útpacket_auxdataÚ	tp_statusZtp_lenZ
tp_snaplenZtp_macZtp_netÚtp_vlan_tciÚtp_vlan_tpidN)r!   r'   r(   ÚctypesZc_uintZc_ushortZ_fields_r$   r$   r$   r%   r,   D   s   ùr,   c                   @   sÌ   e Zd ZdZdZdZejejddfdd„Z	dd„ Z
ejs<erFdd	„ Znd
d	„ Zefdd„Zefdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zeejfdd„ƒZdd „ Zd!d"„ Zd#d$„ ZdS )%ÚSuperSocketFr   Nc                 K   s0   t   |||¡| _| j| _tj| _|p(tj| _d S ©N)ÚsocketÚinsÚoutsr   Úsniff_promiscÚpromiscÚiface)r#   ÚfamilyÚtypeÚprotor8   Úkwargsr$   r$   r%   Ú__init__X   s    zSuperSocket.__init__c                 C   sD   t |ƒ}zt ¡ |_W n ty(   Y n0 | jr<| j |¡S dS d S )Nr   )r   ÚtimeÚ	sent_timeÚAttributeErrorr5   Úsend)r#   ÚxÚsxr$   r$   r%   rA   e   s    zSuperSocket.sendc                 C   s   |  |¡\}}||dfS )z%Internal function to receive a PacketN)Úrecvfrom)r#   ÚsockrB   ÚpktÚsa_llr$   r$   r%   Ú	_recv_raws   s    zSuperSocket._recv_rawc              	   C   sn  d}| j s&| |¡\}}}}|||fS t d¡}| ||¡\}}}	}|sR|||fS |D �]
\}
}}|
tkrø|tkrøzt |¡}W n  ty    |||f Y   S 0 |j	dks¶|j
t@ röt}|j
t@ rÊ|j}t d||j	¡}|dd… | |dd…  }qV|
tjkrV|tkrVt|ƒ}|dk�r*t d|¡}n$|dk�rBt d	|¡}nt d
¡ qV|d |d d  }qV|||fS )z[Internal function to receive a Packet,
            and process ancillary data.
            Ni   r   z!HHé   r*   Úllr)   ÚiizUnknown timespec format.. ?!é   g•Ö&è.>)Úauxdata_availableÚrecvmsgr3   ÚCMSG_LENr
   ÚPACKET_AUXDATAr,   Zfrom_buffer_copyÚ
ValueErrorr.   r-   ÚTP_STATUS_VLAN_VALIDÚETH_P_8021QÚTP_STATUS_VLAN_TPID_VALIDr/   ÚstructÚpackÚ
SOL_SOCKETr   ÚlenÚunpackr   r   )r#   rE   rB   Ú	timestamprF   Ú_rG   Z	flags_lenÚancdataÚflagsZcmsg_lvlÚ	cmsg_typeÚ	cmsg_dataZauxdataZtpidÚtagÚlengthÚtmpr$   r$   r%   rH   y   sL    



ÿ
ý
ÿ


c                 C   s   t j| j |¡dfS )z0Returns a tuple containing (cls, pkt_data, time)N)r   Ú	raw_layerr4   Úrecv©r#   rB   r$   r$   r%   Úrecv_raw«   s    zSuperSocket.recv_rawc                 C   s„   |   |¡\}}}|r|sd S z||ƒ}W nL ty<   ‚ Y n: tyt   tjrfddlm} ||f|_‚ t |¡}Y n0 |r€||_	|S )Nr   )Údebug)
rf   ÚKeyboardInterruptÚ	Exceptionr   Údebug_dissectorZscapy.sendrecvrg   Z
crashed_onrc   r>   )r#   rB   ÚclsÚvalÚtsrF   rg   r$   r$   r%   rd   °   s     
zSuperSocket.recvc                 C   s
   | j  ¡ S r2   )r4   Úfilenor"   r$   r$   r%   rn   Ã   s    zSuperSocket.filenoc                 C   st   | j r
d S d| _ t| dd ƒrLt| dd ƒ| jkrL| jrL| j ¡ dkrL| j ¡  t| dd ƒrp| j ¡ dkrp| j ¡  d S )NTr5   r4   éÿÿÿÿ)ÚclosedÚgetattrr5   rn   Úcloser4   r"   r$   r$   r%   rr   Ç   s    
zSuperSocket.closec                 O   s0   ddl m} |j| g|¢R i |¤Ž\}}||fS )Nr   ©Úsendrecv)Úscapyrt   Úsndrcv)r#   ÚargsÚkargsrt   ÚansZunansr$   r$   r%   ÚsrÔ   s    zSuperSocket.src                 O   sL   ddl m} |j| g|¢R i |¤Žd }t|ƒdkrD|d d }|S d S d S )Nr   rs   rL   )ru   rt   rv   rX   )r#   rw   rx   rt   ry   rF   r$   r$   r%   Úsr1Ú   s    zSuperSocket.sr1c                 O   s$   ddl m} |j|d| i|¤Ž}|S ©Nr   rs   Úopened_socket)ru   rt   Úsniff)r#   rw   rx   rt   Zpktsr$   r$   r%   r~   ä   s    zSuperSocket.sniffc                 O   s$   ddl m} |j|d| i|¤Ž d S r|   )ru   rt   Útshark)r#   rw   rx   rt   r$   r$   r%   r   ê   s    zSuperSocket.tsharkc                 O   s   ||| | dœ|¤ŽS )z�
        Creates an AnsweringMachine associated with this socket.

        :param cls: A subclass of AnsweringMachine to instantiate
        )r}   r3   r$   )r#   rk   rw   r<   r$   r$   r%   Úamð   s    zSuperSocket.amc              
   C   s^   zt | g g |ƒ\}}}W n@ ttfyX } z$|jrB|jd tjkrD‚ W Y d}~n
d}~0 0 |S )a0  This function is called during sendrecv() routine to select
        the available sockets.

        :param sockets: an array of sockets that need to be selected
        :returns: an array of sockets that were selected and
            the function to be called next to get the packets (i.g. recv)
        r   N)r   ÚIOErrorÚselect_errorrw   ÚerrnoZEINTR)ÚsocketsÚremainÚinpr[   Úexcr$   r$   r%   r   ý   s    
zSuperSocket.selectc                 C   s   |   ¡  dS ©zClose the socketN©rr   r"   r$   r$   r%   Ú__del__  s    zSuperSocket.__del__c                 C   s   | S r2   r$   r"   r$   r$   r%   Ú	__enter__  s    zSuperSocket.__enter__c                 C   s   |   ¡  dS rˆ   r‰   )r#   Úexc_typeÚ	exc_valueÚ	tracebackr$   r$   r%   Ú__exit__  s    zSuperSocket.__exit__) r!   r'   r(   rp   Únonblocking_socketrM   r3   ÚAF_INETÚSOCK_STREAMr=   rA   ÚsixÚPY2r   rH   r   rf   rd   rn   rr   rz   r{   r~   r   r€   Ústaticmethodr   Zrecv_poll_rater   rŠ   r‹   r�   r$   r$   r$   r%   r1   R   s4   ü


2
r1   c                   @   s8   e Zd ZdZeddddfdd„Zefdd„Zdd	„ ZdS )
ÚL3RawSocketz,Layer 3 using Raw sockets (PF_INET/SOCK_RAW)Nr   c                 C   sÊ   t   t jt jt j¡| _| j t jt jd¡ t   t jt jt  	|¡¡| _
|d urlt|ƒ}|| _| j
 ||f¡ nd| _tjsÆz,| j
 ttd¡ | j
 t jtd¡ d| _W n  tyÄ   d}t |¡ Y n0 d S )NrL   ÚanyTz2Your Linux Kernel does not support Auxiliary Data!)r3   r‘   ÚSOCK_RAWÚIPPROTO_RAWr5   Ú
setsockoptÚSOL_IPÚ
IP_HDRINCLÚ	AF_PACKETÚhtonsr4   r   r8   Úbindr“   r”   r
   rP   rW   r   rM   ÚOSErrorr   Úinfo)r#   r:   Úfilterr8   r7   ÚnofilterÚmsgr$   r$   r%   r=   "  s(    ý
zL3RawSocket.__init__c           	      C   s  |   | j|¡\}}}|d tjkr&d S |d tjv rJtjj|d  }d}nL|d tjv rntjj|d  }d}n(tj}t	d|d |d |d |j
ƒ d}z||ƒ}W n6 ty¶   ‚ Y n$ tyØ   tjrÊ‚ t |¡}Y n0 |dkrè|j}|d u�r|d u �rddlm} || jƒ}||_|S )Né   é   rL   zDUnable to guess type (interface=%s protocol=%#x family=%i). Using %sr   )Úget_last_packet_timestamp)rH   r4   r3   ÚPACKET_OUTGOINGr   Zl2typesZ	num2layerZl3typesZ
default_l2r   Únamerh   ri   rj   rc   ÚpayloadZscapy.arch.linuxr§   r>   )	r#   rB   ÚdatarG   rm   rk   ZlvlrF   r§   r$   r$   r%   rd   C  s8    


zL3RawSocket.recvc              
   C   s€   z2t |ƒ}| jr0t ¡ |_| j ||jdf¡W S W nH tyL   tdƒ‚Y n0 tj	yz } zt
 	|¡ W Y d }~n
d }~0 0 dS )Nr   ztMissing 'dst' attribute in the first layer to be sent using a native L3 socket ! (make sure you passed the IP layer))r   r5   r>   r?   ÚsendtoÚdstr@   rQ   r3   r   r   )r#   rB   rC   r¤   r$   r$   r%   rA   f  s    
þ
ÿ zL3RawSocket.send)	r!   r'   r(   r    r	   r=   r   rd   rA   r$   r$   r$   r%   r–     s   û
!#r–   c                   @   s   e Zd ZdZdd„ ZdS )ÚSimpleSocketzwrapper around a classic socketc                 C   s   || _ || _d S r2   )r4   r5   )r#   rE   r$   r$   r%   r=   ~  s    zSimpleSocket.__init__N)r!   r'   r(   r    r=   r$   r$   r$   r%   r®   {  s   r®   c                   @   s*   e Zd ZdZdZddd„Zefdd„ZdS )	ÚStreamSocketz)transforms a stream socket into a layer 2TNc                 C   s$   |d u rt j}t | |¡ || _d S r2   )r   rc   r®   r=   Úbasecls©r#   rE   r°   r$   r$   r%   r=   ˆ  s    zStreamSocket.__init__c                 C   s–   | j  |tj¡}t|ƒ}|dkr$d S |  |¡}| tj¡}|d urR|j	d urR|j	`
ddlm} |d ur†t||ƒs†|t|jƒ8 }|j
}q^| j  |¡ |S )Nr   )Ú	NoPayload)r4   rd   r3   ÚMSG_PEEKrX   r°   Úgetlayerr   Úpadding_layerÚ
underlayerrª   Úscapy.packetr²   Ú
isinstanceÚload)r#   rB   r«   rF   Úpadr²   r$   r$   r%   rd   �  s    
zStreamSocket.recv)N)r!   r'   r(   r    r�   r=   r   rd   r$   r$   r$   r%   r¯   „  s   
r¯   c                       s,   e Zd ZdZd‡ fdd„	Zd	dd„Z‡  ZS )
ÚSSLStreamSocketzPsimilar usage than StreamSocket but specialized for handling SSL-wrapped socketsNc                    s   d| _ tt| ƒ ||¡ d S )Nó    )Ú_bufÚsuperr»   r=   r±   ©Ú	__class__r$   r%   r=   ¤  s    zSSLStreamSocket.__init__éÿÿ  c                 C   sè   d }| j dkr2z|  | j ¡}W n ty0   Y n0 |sf| j |¡}t|ƒdkrXt d¡‚|  j |7  _ t| j ƒ}|  | j ¡}|d urä| t	j
¡}|d ur¨|jd ur¨|j`|d urÔt|tjjƒsÔ|t|jƒ8 }|j}q¨| j |d … | _ |S )Nr¼   r   )éd   z"Underlying stream socket tore down)r½   r°   ri   r4   rd   rX   r3   r   r´   r   rµ   r¶   rª   r¸   ru   Úpacketr²   r¹   )r#   rB   rF   Úbufrº   r$   r$   r%   rd   ª  s,    


zSSLStreamSocket.recv)N)rÁ   )r!   r'   r(   r    r=   rd   Ú__classcell__r$   r$   r¿   r%   r»   ¡  s   r»   c                   @   s<   e Zd ZdZddd„Zefdd„Zdd	„ Zedd
d„ƒZ	dS )ÚL2ListenTcpdumpz%read packets at layer 2 using tcpdumpNFc           	      O   sÌ   d | _ g d¢}d| _|d u r0ts$tr0tj | _}|d u r>tj}|d urX| dt|ƒg¡ |sf| d¡ |sŽtj	rŽ|r„d|tj	f }n
dtj	 }|d ur | |¡ t
d ||dd�| _t| jjƒ| _| j| _d S )	N)z-wú-z-sZ65535r—   z-iz-pz(%s) and not (%s)znot (%s)T)Úprogrw   Zgetproc)r5   r8   r   r   r   r6   Úextendr   ÚappendZexcept_filterr   Útcpdump_procr   ÚstdoutÚreaderr4   )	r#   r8   r7   r¢   r£   rÈ   ÚargZkargrw   r$   r$   r%   r=   Ë  s*    



zL2ListenTcpdump.__init__c                 C   s   | j  |¡S r2   )rÍ   rd   re   r$   r$   r%   rd   ì  s    zL2ListenTcpdump.recvc                 C   s   t  | ¡ | j ¡  d S r2   )r1   rr   rË   Úkillr"   r$   r$   r%   rr   ð  s    
zL2ListenTcpdump.closec                 C   s   t str| S tj| |d�S )N)r…   )r   r   r1   r   ©r„   r…   r$   r$   r%   r   õ  s    zL2ListenTcpdump.select)NNNFN)N)
r!   r'   r(   r    r=   r   rd   rr   r•   r   r$   r$   r$   r%   rÆ   È  s        û
!rÆ   c                   @   s:   e Zd ZdZdZdd„ Zeddd„ƒZdd	„ Zd
d„ Z	dS )Ú
IterSocketzwrapper around an iterableTc                 C   s’   |st g ƒ| _ n~t|tƒr$|j | _ njt|tƒrJtt|ƒfdd„}|ƒ | _ nDt|ttfƒr„t|d tƒrrt |ƒ| _ qŽdd„ |D ƒ| _ n
| ¡ | _ d S )Nc                 s   s,   | D ]"\}}|j r|j |_|V  |V  qd S r2   )r?   r>   )ÚobjÚsÚrr$   r$   r%   Ú_iter
  s
    z"IterSocket.__init__.<locals>._iterr   c                 s   s   | ]}|D ]
}|V  q
qd S r2   r$   )Ú.0rB   Úyr$   r$   r%   Ú	<genexpr>  r¼   z&IterSocket.__init__.<locals>.<genexpr>)	Úiterr¸   rÑ   r   r   Úlistr   ÚbytesÚ__iter__)r#   rÒ   rÕ   r$   r$   r%   r=     s    



zIterSocket.__init__Nc                 C   s   | S r2   r$   rÐ   r$   r$   r%   r     s    zIterSocket.selectc                 G   s6   zt | jƒ}| t|ƒ¡W S  ty0   t‚Y n0 d S r2   )ÚnextrÙ   rÀ   rÛ   ÚStopIterationÚEOFError)r#   rw   rF   r$   r$   r%   rd     s
    
zIterSocket.recvc                 C   s   d S r2   r$   r"   r$   r$   r%   rr   '  s    zIterSocket.close)N)
r!   r'   r(   r    r�   r=   r•   r   rd   rr   r$   r$   r$   r%   rÑ   ÿ  s   rÑ   )AÚ__doc__Ú
__future__r   r   r   r‚   r0   rƒ   r3   rU   r>   Zscapy.configr   Zscapy.constsr   r   Z
scapy.datar   r	   r
   r   Zscapy.compatr   Zscapy.errorr   r   Zscapy.interfacesr   Zscapy.libs.sixZlibsr“   r·   r   ru   Zscapy.plistr   r   r   Zscapy.utilsr   r   r   r   r   r   r   r   r   r   r   r   rP   rS   rR   rT   Z	Structurer,   Úadd_metaclassr1   r–   r®   r¯   r»   rÆ   rÑ   r$   r$   r$   r%   Ú<module>   sH   ( L\	'7