a
    kÄ#d R  ã                   @   s`  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	m
Z
 ddlm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mZmZmZ dd
lmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$ ddlZ%ddlm&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, e%j-j�sddl.m/Z/ e0edƒ�s(de_1dZ2dZ3g d¢Z4G dd„ de!ƒZ5ej6�ræe�rvej7d d Z8ddl9m:Z:m;Z; nddl9m<Z< ddl=m>Z>m?Z?m@Z@mAZAm&ZB z’ddl9mCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZU zddl9mVZV W n  eW�y$   ddl9mXZV Y n0 dd „ ZYW nF eZ�yv   d!e_6e�r`ej[�rre \d"¡ nej[�rre \d#¡ Y np0 e�ræeNƒ Z]d$e] ^¡ v �rÆej_ `e8d% ¡�r®ed&ƒ ne a¡ d'k�ræed(ƒ n d)e] ^¡ v �ræd*e_bd+ e_ce_ce�rðd,Z8ej6�r\G d-d.„ d.ƒZdedZeG d/d0„ d0eƒZfe�s,ejg hef¡ G d1d2„ d2e5ƒZiG d3d4„ d4e5ƒZjG d5d6„ d6ejƒZkdS )7z/
Packet sending and receiving libpcap/WinPcap.
é    N©Úselect_objects)ÚrawÚ	plain_str)Úconf)ÚWINDOWS)ÚMTUÚ	ETH_P_ALL)ÚScapy_ExceptionÚlog_loadingÚlog_runtimeÚwarning)ÚInterfaceProviderÚNetworkInterfaceÚ_GlobInterfaceTypeÚnetwork_name)ÚPacket)Ú	inet_ntop)ÚSuperSocket)Ústr2macÚdecode_locale_str)ÚcastÚDictÚListÚNoReturnÚOptionalÚTupleÚType)ÚioctlÚAF_LINKé   ipB€é   )ZLOOPBACKZUPÚRUNNINGZWIRELESSÚOKZDISCONNECTEDZNAc                   @   sP   e Zd ZdgZdd„ Zefdd„Zefdd„Zdd	„ Ze	ddd„ƒZ
dd„ Zd
S )Ú_L2libpcapSocketÚpcap_fdc                 C   sH   || _ | j  ¡ }|tjv r(tj| | _ntj| _td| j|| jjƒ d S )NzBUnable to guess datalink type (interface=%s linktype=%i). Using %s)	r%   Údatalinkr   Zl2typesÚclsZ
default_l2r   ÚifaceÚname)ÚselfÚfdÚll© r-   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/arch/libpcap.pyÚ__init__R   s    

ýz_L2libpcapSocket.__init__c                 C   s&   | j  ¡ \}}|du rdS | j||fS )zb
        Receives a packet, then returns a tuple containing
        (cls, pkt_data, time)
        N)NNN)r%   Únextr'   )r*   ÚxÚtsÚpktr-   r-   r.   Úrecv_raw`   s    z_L2libpcapSocket.recv_rawc                 C   s&   | j  d¡ |  |¡}| j  d¡ |S )z3Receives and dissect a packet in non-blocking mode.TF)r%   ÚsetnonblockÚrecv)r*   r1   Úpr-   r-   r.   Únonblock_recvk   s    
z_L2libpcapSocket.nonblock_recvc                 C   s
   | j  ¡ S ©N)r%   Úfileno©r*   r-   r-   r.   r:   s   s    z_L2libpcapSocket.filenoNc                 C   s
   t | |ƒS r9   r   )ÚsocketsZremainr-   r-   r.   Úselectw   s    z_L2libpcapSocket.selectc                 C   s(   | j r
d S d| _ t| dƒr$| j ¡  d S )NTr%   )ÚclosedÚhasattrr%   Úcloser;   r-   r-   r.   r@   |   s
    
z_L2libpcapSocket.close)N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r/   r   r4   r8   r:   Ústaticmethodr=   r@   r-   r-   r-   r.   r$   O   s   r$   ZWINDIRz\System32\Npcap)Úpcap_setmintocopyÚpcap_getevent)Úpcap_get_selectable_fd)ÚPOINTERÚbyrefÚcreate_string_bufferÚc_ubyter   )ÚPCAP_ERRBUF_SIZEÚ
PCAP_ERRORÚPCAP_ERROR_NO_SUCH_DEVICEÚPCAP_ERROR_PERM_DENIEDÚbpf_programÚ
pcap_closeÚpcap_compileÚpcap_datalinkÚpcap_findalldevsÚpcap_freealldevsÚ	pcap_if_tÚpcap_lib_versionÚpcap_next_exÚpcap_open_liveÚpcap_pkthdrÚpcap_setfilterÚpcap_setnonblockÚsockaddr_inÚsockaddr_in6)Úpcap_inject)Úpcap_sendpacketc                  C   s¼  ddl m}  ttƒ}ttƒƒ }i }tt|ƒ|ƒdk r8dS �zr�zL|}|�r‚t|j	j
ƒ}t|j	jpbdƒ}|j	j}g }d}	|j	j}
|
�r^|
j	jj	j}|
j	j}|tjkrÂt|ttƒƒ}|j	jdd… }nl|tjkrìt|ttƒƒ}|j	jdd… }nB|tjk�r$|j	j}ttt|dd… ƒƒƒ}	|
j	j}
q~n
|
j	j}
q~t|tt|ƒƒƒ}|dk�rT| |¡ |
j	j}
q~| |t ƒ}||||	f||< |j	j}qD|t!_"W n t#�y    ‚ Y n0 W t$|ƒ n
t$|ƒ 0 dS )zóThis functions calls libpcap ``pcap_findalldevs`` function,
            and extracts and parse all the data scapy will need
            to build the Interface List.

            The data will be stored in ``conf.cache_pcapiflist``
            r   )Ú	FlagValueNÚ é   z0.0.0.0)%Zscapy.fieldsrb   rK   rM   rI   rW   rU   rJ   r   Úcontentsr)   ÚdescriptionÚflagsÚ	addressesÚaddrZ	sa_familyÚsocketÚAF_INETÚccastr^   Zsin_addrÚAF_INET6r_   Z	sin6_addrr   Zsa_datar   ÚbytesÚ	bytearrayr0   r   ÚappendÚ_pcap_if_flagsr   Úcache_pcapiflistÚ	ExceptionrV   )rb   ÚerrZdevsZif_listr7   r)   rf   rg   ÚipsÚmacÚaÚfamilyZapÚvalZaddr_rawri   r-   r-   r.   Úload_winpcapy²   sX    

ÿ








rz   FzeNpcap/Winpcap is not installed ! See https://scapy.readthedocs.io/en/latest/installation.html#windowszLibpcap is not installed!s   winpcapz
\wpcap.dllzaWinpcap is installed over Npcap. Will use Winpcap (see 'Winpcap/Npcap conflicts' in Scapy's docs)ÚXPzDWinPcap is now deprecated (not maintained). Please use Npcap insteads   npcapTzNpcap Loopback Adapterrc   c                   @   sV   e Zd ZdZddd„Zdd„ ZeZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú_PcapWrapper_libpcapzWrapper for the libpcap callsNc                 C   s   t tƒ| _t t|ƒ d¡ƒ| _d| _|�r’tr<tj	s<t
dƒ‚ddlm}m}m}m}	m}
m}m}m} || j| jƒ| _| jsštt| jƒ d¡ƒ}|ršt
|ƒ‚|| j|ƒ || j|ƒ |	| j|ƒ |
| jdƒdkrØt d¡ || jƒ}|dk �rÊtt| jƒ d¡ƒ}tt|| jƒƒ d¡ƒ}tt||ƒƒ d¡ƒ}|tk�r>|}nJ|tk�rXd	|||f }n0|tk�r||d
k�r|d	|||f }nd||f }t
|ƒ‚n8t| j|||| jƒ| _tt| jƒ d¡ƒ}|�rÊt
|ƒ‚t�rÜt| jdƒ tt ƒƒ | _!tt"ƒƒ | _#t$ƒ | _$d S )NÚutf8éÿÿÿÿz)On Windows, this feature requires NPcap !r   )Úpcap_createÚpcap_set_snaplenÚpcap_set_promiscÚpcap_set_timeoutÚpcap_set_rfmonÚpcap_activateÚpcap_statustostrÚpcap_geterró    é   zCould not set monitor modez%s: %s
(%s)rc   z%s: %s)%rK   rM   Úerrbufr   Úencoder(   Údtlr   r   Ú	use_npcapÚOSErrorÚscapy.libs.winpcapyr   r€   r�   r‚   rƒ   r„   r…   r†   Úpcapr   ro   Ústripr   ÚerrorrN   rO   rP   rZ   rF   rI   r[   ÚheaderrL   Úpkt_datarQ   )r*   ZdeviceZsnaplenÚpromiscZto_msÚmonitorr   r€   r�   r‚   rƒ   r„   r…   r†   r‘   Ústatusr(   ZerrstrZ	statusstrÚerrmsgr-   r-   r.   r/     sd    
ÿ
(


ÿÿÿ


þz_PcapWrapper_libpcap.__init__c                 C   sj   t | jt| jƒt| jƒƒ}|dks&dS | jjjjt| jjjj	ƒd  }t
t| jd| jjj… ƒƒ}||fS )zb
            Returns the next packet as the tuple
            (timestamp, raw_packet)
            r   )NNg    €„.AN)rY   r�   rJ   r’   r“   re   r2   Ztv_secÚfloatZtv_usecrn   ro   Úlen)r*   Úcr2   r3   r-   r-   r.   r0   ]  s    ý
ÿÿÿz_PcapWrapper_libpcap.nextc                 C   s   | j dkrt| jƒ| _ | j S )zWrapper around pcap_datalinkr~   )r‹   rT   r�   r;   r-   r-   r.   r&   t  s    
z_PcapWrapper_libpcap.datalinkc                 C   s(   t rttt| jƒƒS ttt| jƒƒS d S r9   )r   r   ÚintrG   r�   rH   r;   r-   r-   r.   r:   {  s    z_PcapWrapper_libpcap.filenoc                 C   sd   t | d¡ƒ}t| jt| jƒ|ddƒdkr:t d|¡ dS t| jt| jƒƒdkr`t d|¡ dS dS )Nr}   rˆ   r~   z&Could not compile filter expression %sFzCould not set filter %sT)	rK   rŠ   rS   r�   rJ   rQ   r   r‘   r\   )r*   ÚfZ
filter_expr-   r-   r.   Ú	setfilterƒ  s    z_PcapWrapper_libpcap.setfilterc                 C   s   t | j|| jƒ d S r9   )r]   r�   r‰   )r*   Úir-   r-   r.   r5   �  s    z _PcapWrapper_libpcap.setnonblockc                 C   s   t | j|t|ƒƒS r9   )r`   r�   r™   ©r*   r1   r-   r-   r.   Úsend“  s    z_PcapWrapper_libpcap.sendc                 C   s   t | jƒ d S r9   )rR   r�   r;   r-   r-   r.   r@   —  s    z_PcapWrapper_libpcap.close)N)rA   rB   rC   Ú__doc__r/   r0   Ú__next__r&   r:   r�   r5   r    r@   r-   r-   r-   r.   r|     s    û
Lr|   c                   @   s(   e Zd ZdZdZdZdd„ Zdd„ ZdS )	ÚLibpcapProviderzF
        Load interfaces from Libpcap on non-Windows machines
        ÚlibpcapTc              	   C   s¬   t jr
tri S t jstƒ  i }d}t j ¡ D ]z\}}|\}}}}|d7 }|s|ddlm}	 z|	|ƒ}W n tyz   Y q,Y n0 ||p„||||pŽd||dœ}
t	| |
ƒ||< q,|S )Nr   rˆ   )Úget_if_hwaddrz00:00:00:00:00:00)r)   rf   r   Úindexrv   ru   rg   )
r   Úuse_pcapr   rr   rz   ÚitemsZ
scapy.archr¥   rs   r   )r*   Údatarž   ZifnameZdatrf   ru   rg   rv   r¥   Zif_datar-   r-   r.   Úload£  s2    

ù	zLibpcapProvider.loadc                 C   s    t jrddlm} |ƒ  |  ¡ S )Nr   )rz   )r   r§   Zscapy.arch.libpcaprz   rª   )r*   rz   r-   r-   r.   ÚreloadÁ  s    zLibpcapProvider.reloadN)rA   rB   rC   r¡   r)   r¤   rª   r«   r-   r-   r-   r.   r£   œ  s
   r£   c                       s4   e Zd ZdZdedddf‡ fdd„	Zdd„ Z‡  ZS )ÚL2pcapListenSocketz%read packets at layer 2 using libpcapNc                    sÒ   || _ d | _|d u rtj}|| _|d ur0|| _ntj| _t|t| jd|d�}tt	| ƒ 
|¡ z"ts|t| j ¡ tt dd¡ƒ W n ty�   Y n0 |tkrÎtjr¾|r´d|tjf }n
dtj }|rÎ| j |¡ d S )Néd   ©r•   ÚIrˆ   ú(%s) and not (%s)únot (%s))ÚtypeZoutsr   r(   r”   Úsniff_promiscÚ	open_pcapr   Úsuperr¬   r/   r   r   r%   r:   ÚBIOCIMMEDIATEÚstructÚpackrs   r	   Úexcept_filterr�   )r*   r(   r²   r”   Úfilterr•   r+   ©Ú	__class__r-   r.   r/   Ð  s:    
þ
ý
zL2pcapListenSocket.__init__c                 C   s   t dƒ‚d S )Nz+Can't send anything with L2pcapListenSocket)r
   rŸ   r-   r-   r.   r    ø  s    ÿzL2pcapListenSocket.send©rA   rB   rC   Údescr	   r/   r    Ú__classcell__r-   r-   r»   r.   r¬   Í  s   û(r¬   c                       s6   e Zd ZdZdeddddf‡ fdd„	Zdd„ Z‡  ZS )ÚL2pcapSocketz0read/write packets at layer 2 using only libpcapNr   c                    sü   |d u rt j}|| _|d ur$|| _nt j| _t|t| jd|d�}tt| ƒ |¡ z"t	spt
| j ¡ tt dd¡ƒ W n ty„   Y n0 |r¢|tkrœd| }qèd }nFt jrÆ|r¼d|t jf }n
dt j }|tkrè|ràd||f }nd| }|rø| j |¡ d S )	Nr­   r®   r¯   rˆ   zether proto %ir°   r±   z(ether proto %i) and (%s))r   r(   r”   r³   r´   r   rµ   rÀ   r/   r   r   r%   r:   r¶   r·   r¸   rs   r	   r¹   r�   )r*   r(   r²   r”   rº   Znofilterr•   r+   r»   r-   r.   r/     sB    	ÿ
ý

zL2pcapSocket.__init__c                 C   s6   t |ƒ}zt ¡ |_W n ty(   Y n0 | j |¡S r9   )r   ÚtimeÚ	sent_timeÚAttributeErrorr%   r    ©r*   r1   Úsxr-   r-   r.   r    2  s    zL2pcapSocket.sendr½   r-   r-   r»   r.   rÀ   þ  s   ú1rÀ   c                   @   s$   e Zd ZdZefdd„Zdd„ ZdS )ÚL3pcapSocketz0read/write packets at layer 3 using only libpcapc                 C   s$   t  | |¡}|r |j|j_|jS |S r9   )rÀ   r6   rÁ   Úpayload)r*   r1   Úrr-   r-   r.   r6   >  s
    
zL3pcapSocket.recvc                 C   s>   t |  ¡ | ƒ}zt ¡ |_W n ty0   Y n0 | j |¡S r9   )r   r'   rÁ   rÂ   rÃ   r%   r    rÄ   r-   r-   r.   r    F  s    zL3pcapSocket.sendN)rA   rB   rC   r¾   r   r6   r    r-   r-   r-   r.   rÆ   ;  s   rÆ   )lr¡   ÚosÚplatformrj   r·   rÁ   Zscapy.automatonr   Zscapy.compatr   r   Zscapy.configr   Zscapy.constsr   Z
scapy.datar   r	   Zscapy.errorr
   r   r   r   Zscapy.interfacesr   r   r   r   Zscapy.packetr   Zscapy.pton_ntopr   Zscapy.supersocketr   Zscapy.utilsr   r   Zscapyr   r   r   r   r   r   r   ZconstsZfcntlr   r?   r   r¶   Z
PCAP_IF_UPrq   r$   r§   ÚenvironZ
NPCAP_PATHrŽ   rF   rG   rH   ÚctypesrI   rJ   rK   rL   rl   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ÚImportErrorra   rz   r�   ÚinteractiveÚcriticalÚversionÚlowerÚpathÚexistsÚreleaserŒ   Zloopback_namer|   r´   r£   ZifacesZregister_providerr¬   rÀ   rÆ   r-   r-   r-   r.   Ú<module>   s�   $

<T<ÿÿ


 ,1=