a
    kÄ#d E  ã                   @   sÞ  d Z ddl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ZddlZddl	Z	ddl
mZ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mZ ddlmZ ddlmZmZmZ ddl m!Z!m"Z" dd	l#m$Z$m%Z% dd
l&m'Z' ddl(m)Z) ddl*m+Z+ e�se�re ,ej-¡Z.ne ,ej/¡Z.eZ0e0�r@G dd„ dej1ƒZ2n,e�rZG dd„ dej1ƒZ2nG dd„ dej1ƒZ2G dd„ dej1ƒZ3e ,e3¡Z4G dd„ de)ƒZ5G dd„ de5ƒZ6G dd„ de6ƒZ7G dd„ de7ƒZ8dd„ Z9ddd„Z:dS ) z)
Scapy *BSD native support - BPF sockets
é    )ÚselectN)Úget_dev_bpfÚattach_filter)Ú	BIOCGBLENÚBIOCGDLTÚ
BIOCGSTATSÚBIOCIMMEDIATEÚBIOCPROMISCÚ	BIOCSBLENÚBIOCSDLTÚ	BIOCSETIFÚBIOCSHDRCMPLTÚBIOCSTSTAMPÚBPF_BUFFER_LENGTHÚBPF_T_NANOTIME)Úconf)ÚDARWINÚFREEBSDÚNETBSD)Ú	ETH_P_ALLÚDLT_IEEE802_11_RADIO)ÚScapy_ExceptionÚwarning)Únetwork_name)ÚSuperSocket)Úrawc                   @   s    e Zd ZdejfdejfgZdS )Úbpf_timevalÚtv_secÚtv_nsecN©Ú__name__Ú
__module__Ú__qualname__ÚctypesZc_ulongÚ_fields_© r%   r%   úQ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/arch/bpf/supersocket.pyr   7   s   ÿr   c                   @   s    e Zd ZdejfdejfgZdS ©r   r   Útv_usecNr   r%   r%   r%   r&   r   <   s   ÿc                   @   s    e Zd ZdejfdejfgZdS r'   )r    r!   r"   r#   Úc_uint32r$   r%   r%   r%   r&   r   @   s   ÿc                   @   s.   e Zd ZdefdejfdejfdejfgZdS )Úbpf_hdrÚ	bh_tstampÚ	bh_caplenÚ
bh_datalenÚ	bh_hdrlenN)r    r!   r"   r   r#   r)   Zc_uint16r$   r%   r%   r%   r&   r*   E   s
   ýr*   c                   @   s’   e Zd ZdZdZdZdeddddfdd„Zd	d
„ Z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efdd„Zed dd„ƒZdS )!Ú_L2bpfSocketz"Generic Scapy BPF Super Socketzread/write packets using BPFTNr   Fc              
   C   s~  |rt dƒ‚d | _d | _|d u r&tj}|| _t|p6tjƒ| _d | _t	ƒ \| _| _
| j| _tršzt | jtt dt¡¡ W n  ty˜   t d| j
 ƒ‚Y n0 zt | jtt dt¡¡ W n  tyÖ   t d| j
 ƒ‚Y n0 z"t | jtt d| j ¡ ¡¡ W n" t�y   t d| j ƒ‚Y n0 | j| _| j�r8|  d¡ t�r|�rzHt ¡ d  d	¡}d
d„ |D ƒ}|d d }||d d |d  7 }W n& ttf�y²   tdƒ t j!}Y n0 |dk �rt dt"¡}	zt | jt#|	¡ W n" t�y    t d| j ƒ‚Y n0 ntdƒ zt | jt$t dd¡¡ W n" t�yJ   t d| j
 ƒ‚Y n0 zt | jt%t dd¡¡ W n" t�yŠ   t d| j
 ƒ‚Y n0 d}
|�stj&�r¾|�r´d|tj&f }n
dtj& }|d u�rzt'| j|| jƒ d}
W n2 t(�y } ztd| ƒ W Y d }~n
d }~0 0 t)�rp|
du �rpd}zt'| j|| jƒ W n2 t(�yn } ztd| ƒ W Y d }~n
d }~0 0 |  *¡ | _+d S )NzaWe do not natively support monitor mode on BPF. Please turn on libpcap using conf.use_pcap = TrueÚIz BIOCSTSTAMP failed on /dev/bpf%izBIOCSBLEN failed on /dev/bpf%iÚ16s16xúBIOCSETIF failed on %sé   r   Ú.c                 S   s   g | ]}t |ƒ‘qS r%   )Úint)Ú.0Únumr%   r%   r&   Ú
<listcomp>˜   ó    z)_L2bpfSocket.__init__.<locals>.<listcomp>i'  éd   é   z'Could not determine your macOS version!i|Œ zCan't set %s into monitor mode!zKScapy won't activate 802.11 monitoring, as it will crash your macOS kernel!z"BIOCIMMEDIATE failed on /dev/bpf%iÚiz"BIOCSHDRCMPLT failed on /dev/bpf%iFz(%s) and not (%s)znot (%s)TzCannot set filter: %sz	greater 0),r   Úfd_flagsÚassigned_interfacer   Zsniff_promiscÚpromiscr   ÚifaceÚinsr   Zdev_bpfÚoutsr   ÚfcntlÚioctlr   ÚstructÚpackr   ÚIOErrorr
   r   r   ÚencodeÚset_promiscr   ÚplatformÚmac_verÚsplitÚ
IndexErrorÚ
ValueErrorr   ÚsysZmaxintr   r   r   r   Zexcept_filterr   ÚImportErrorr   Ú	guess_clsÚguessed_cls)Úselfr@   Útyper?   ÚfilterZnofilterZmonitorZtmp_mac_versionZmacos_versionZdlt_radiotapZfilter_attachedÚexr%   r%   r&   Ú__init__X   s¶    ÿ
þÿ
þÿþ

ÿÿÿ

""z_L2bpfSocket.__init__c                 C   sB   zt  | jtt d|¡¡ W n  ty<   td| j ƒ‚Y n0 dS )z%Set the interface in promiscuous moder<   z.Cannot set promiscuous mode on interface (%s)!N)	rC   rD   rA   r	   rE   rF   rG   r   r@   )rS   Úvaluer%   r%   r&   rI   Ö   s    ÿz_L2bpfSocket.set_promiscc                 C   s   | dur|   ¡  dS )z#Close the file descriptor on deleteN)Úclose©rS   r%   r%   r&   Ú__del__ß   s    z_L2bpfSocket.__del__c                 C   sŽ   z,t  | jtt dd¡¡}t d|¡d }W n( tyT   tj	}t
d|jƒ | Y S 0 ztj| W S  tyˆ   tj	}t
d||jƒ Y n0 dS )z9Guess the packet class that must be used on the interfacer0   r   z1BIOCGDLT failed: unable to guess type. Using %s !z(Unable to guess type (type %i). Using %sN)rC   rD   rA   r   rE   rF   ÚunpackrG   r   Z
default_l2r   ÚnameZl2typesÚKeyError)rS   ÚretÚclsr%   r%   r&   rQ   æ   s    ÿ
z_L2bpfSocket.guess_clsc                 C   sš   | j du r>zt | jtj¡| _ W n ty<   tdƒ Y dS 0 |rP| j tjB }n| j tj @ }zt | jtj|¡ || _ W n t	y”   tdƒ Y n0 dS )z'Set the non blocking flag on the socketNz*Cannot get flags on this file descriptor !z)Can't set flags on this file descriptor !)
r=   rC   rA   ZF_GETFLrG   r   ÚosÚ
O_NONBLOCKZF_SETFLÚ	Exception)rS   Zset_flagZnew_fd_flagsr%   r%   r&   Úset_nonblockú   s    

z_L2bpfSocket.set_nonblockc              	   C   sJ   z(t  | jtt ddd¡¡}t d|¡W S  tyD   tdƒ Y dS 0 dS )z!Get received / dropped statisticsZ2Ir   zUnable to get stats from BPF !)NNN)	rC   rD   rA   r   rE   rF   r\   rG   r   ©rS   r_   r%   r%   r&   Ú	get_stats  s    z_L2bpfSocket.get_statsc                 C   sL   z*t  | jtt dd¡¡}t d|¡d W S  tyF   tdƒ Y dS 0 dS )zGet the BPF buffer lengthr0   r   z#Unable to get the BPF buffer lengthN)	rC   rD   rA   r   rE   rF   r\   rG   r   re   r%   r%   r&   Úget_blen  s    z_L2bpfSocket.get_blenc                 C   s   | j S )z"Get the underlying file descriptor)rA   rZ   r%   r%   r&   Úfileno%  s    z_L2bpfSocket.filenoc                 C   s,   | j s(| jdur(t | j¡ d| _ d| _dS )zClose the Super SocketNT)ÚclosedrA   ra   rY   rZ   r%   r%   r&   rY   )  s    z_L2bpfSocket.closec                 C   s   t d| jj ƒ‚dS )zDummy send methodzCan't send anything with %sN©rc   Ú	__class__r    ©rS   Úxr%   r%   r&   Úsend1  s    
ÿz_L2bpfSocket.sendc                 C   s   t d| jj ƒ‚dS )zDummy recv methodzCan't recv anything with %sNrj   rl   r%   r%   r&   Úrecv_raw7  s    
ÿz_L2bpfSocket.recv_rawc                 C   s
   t | |ƒS )zcThis function is called during sendrecv() routine to select
        the available sockets.
        )Ú
bpf_select)ÚsocketsZremainr%   r%   r&   r   =  s    z_L2bpfSocket.select)T)N)r    r!   r"   Ú__doc__ÚdescZnonblocking_socketr   rW   rI   r[   rQ   rd   rf   rg   rh   rY   rn   r   ro   Ústaticmethodr   r%   r%   r%   r&   r/   R   s$   ÿ
~	


r/   c                       sP   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zedd	„ ƒZd
d„ Z	e
fdd„Z‡  ZS )ÚL2bpfListenSocketz!"Scapy L2 BPF Listen Super Socketc                    s    g | _ tt| ƒj|i |¤Ž d S )N)Úreceived_framesÚsuperru   rW   )rS   ÚargsÚkwargs©rk   r%   r&   rW   I  s    zL2bpfListenSocket.__init__c                 C   s
   t | jƒS )z)Return the number of frames in the buffer)Úlenrv   rZ   r%   r%   r&   Úbuffered_framesM  s    z!L2bpfListenSocket.buffered_framesc                 C   s   | j r| j  d¡S dS dS )z,Get a frame or packet from the received listr   ©NNNN)rv   ÚpoprZ   r%   r%   r&   Ú	get_frameQ  s    zL2bpfListenSocket.get_framec                 C   s   | | t d  t d  @ S )z1Return the index to the end of the current packetr3   )ÚBPF_ALIGNMENT)Zbh_hZbh_cr%   r%   r&   Ú	bpf_alignX  s    zL2bpfListenSocket.bpf_alignc                 C   s¶   t |ƒ}|tk rdS t |¡}|jdkr,dS ||j|j|j … }tr\|jj	d|jj
  }n|jj	d|jj  }| j | j||f¡ |  |j|j¡}|| dkr²|  ||d… ¡ dS )zY
        Extract all frames from the buffer and stored them in the received list
        Nr   g•Ö&è.>g�íµ ÷Æ°>é   )r{   Ú_bpf_hdr_lenr*   Zfrom_buffer_copyr-   r.   r,   Ú	_NANOTIMEr+   r   r   r(   rv   ÚappendrR   r�   Úextract_frames)rS   Ú
bpf_bufferZlen_bbZbh_hdrZ	frame_strÚtsÚendr%   r%   r&   r†   _  s$    

ÿ
ÿz L2bpfListenSocket.extract_framesc              
   C   s~   t |tƒ}|  ¡ r|  ¡ S zt | j|¡}W n> tyj } z&|jtj	krTt
ddd� W Y d}~dS d}~0 0 |  |¡ |  ¡ S )z Receive a frame from the networkzBPF recv_raw()T)Úexc_infoNr}   )Úminr   r|   r   ra   ÚreadrA   ÚEnvironmentErrorÚerrnoÚEAGAINr   r†   )rS   rm   r‡   Úexcr%   r%   r&   ro     s    

zL2bpfListenSocket.recv_raw)r    r!   r"   rr   rW   r|   r   rt   r�   r†   r   ro   Ú__classcell__r%   r%   rz   r&   ru   F  s   
 ru   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚL2bpfSocketz"Scapy L2 BPF Super Socketc                 C   s   t  | jt|ƒ¡S )zSend a frame)ra   ÚwriterB   r   rl   r%   r%   r&   rn   ˜  s    zL2bpfSocket.sendc                 C   s4   |   ¡ rt | ¡S |  d¡ t | ¡}|  d¡ |S )zNon blocking receiveTF)r|   ru   Úrecvrd   )rS   Úpktr%   r%   r&   Únonblock_recvœ  s    



zL2bpfSocket.nonblock_recvN)r    r!   r"   rr   rn   r–   r%   r%   r%   r&   r’   •  s   r’   c                   @   s    e Zd Zefdd„Zdd„ ZdS )ÚL3bpfSocketc                 C   s$   t  | |¡}|r |j|j_|jS |S )zReceive on layer 3)r   r”   ÚtimeÚpayload)rS   rm   Úrr%   r%   r&   r”   ¬  s
    
zL3bpfSocket.recvc              	   C   sì   ddl m} | ¡ d }|du r*ttjƒ}| j|krzz t | j	t
t d| ¡ ¡¡ W n tyr   td| ƒ‚Y n0 || _trœ| d¡rœ| j|krœt|ƒ}n6trÂ| d¡s´| d¡rÂtd|ƒ dS t|  ¡ | ƒ}t ¡ |_t | |¡ dS )	zSend a packetr   )ÚLoopbackNr1   r2   ZtunÚtapz2Cannot write to %s according to the documentation!)Zscapy.layers.l2r›   Zrouter   r   r@   r>   rC   rD   rB   r   rE   rF   rH   rG   r   r   Ú
startswithrR   r   r   r   r˜   Z	sent_timer’   rn   )rS   r•   r›   ZiffÚframer%   r%   r&   rn   ´  s$    

 


zL3bpfSocket.sendN)r    r!   r"   r   r”   rn   r%   r%   r%   r&   r—   ª  s   r—   c                 C   s   t | tttfƒS )z(Return True is obj is a BPF Super Socket)Ú
isinstanceru   r—   )Úobjr%   r%   r&   ÚisBPFSocketô  s    þr¡   c                 C   sp   t ƒ }t ƒ }| D ]*}t|ƒr0| ¡ r0| |¡ q| |¡ q|rh|du rLd}t|g g |ƒ\}}}|| S |S dS )z„A call to recv() can return several frames. This functions hides the fact
       that some frames are read from the internal buffer.Ngš™™™™™©?)Úlistr¡   r|   r…   r   )Zfds_listÚtimeoutZbpf_scks_bufferedZ
select_fdsZtmp_fdZ
ready_listÚ_r%   r%   r&   rp   ü  s    
rp   )N);rr   r   r#   rŽ   rC   ra   rJ   rE   rO   r˜   Zscapy.arch.bpf.corer   r   Zscapy.arch.bpf.constsr   r   r   r   r	   r
   r   r   r   r   r   r   Zscapy.configr   Zscapy.constsr   r   r   Z
scapy.datar   r   Zscapy.errorr   r   Zscapy.interfacesr   Zscapy.supersocketr   Zscapy.compatr   ZsizeofZc_longr€   Zc_int32r„   Z	Structurer   r*   rƒ   r/   ru   r’   r—   r¡   rp   r%   r%   r%   r&   Ú<module>   sH   8
 uOJ