a
    kÄ#d@  ã                   @   sê  d Z ddlmZ ddlmZmZmZ ddlmZmZm	Z	m
Z
mZm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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% ddl&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 e%�r2e3dƒ‚e 4edƒ¡Z5eege5j6_7ee5j6_8G dd„ deƒZ9ee9d ƒZ:g e5j9_7e:e5j9_8e:ge5j;_7de5j;_8dd„ Z<dd„ Z=dd„ Z>dd„ Z?dd„ Z@e Ad ¡ZBd!d"„ ZCG d#d$„ d$e-ƒZDe. EeD¡ dS )%z"
Scapy *BSD native support - core
é    )Úabsolute_import)ÚcdllÚcastÚpointer)Úc_intÚc_ulongÚc_uintÚc_char_pÚ	StructureÚPOINTER)Úfind_libraryN)ÚBIOCSETFÚSIOCGIFFLAGSÚ	BIOCSETIF)Úcompile_filterÚ
_iff_flags)Úget_ifÚin6_getifaddr)Ú	plain_str)Úconf)ÚLINUX)ÚARPHDR_LOOPBACKÚARPHDR_ETHER)ÚScapy_ExceptionÚwarning)ÚInterfaceProviderÚIFACESÚNetworkInterfaceÚnetwork_name)Ú	inet_ntopzBPF conflicts with LinuxÚcc                   @   s   e Zd ZdefdefgZdS )Úif_nameindexÚif_indexÚif_nameN)Ú__name__Ú
__module__Ú__qualname__r   r	   Z_fields_© r'   r'   úJ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/arch/bpf/core.pyr!   4   s   ÿr!   éÿ   c                 C   s¬   t | ƒ} tjtjj| gdtjtjd�}| ¡ \}}|jrNt	dt
|ƒ ¡ ƒ dS dd„ t
|ƒ ¡ D ƒ}|svt	d| ƒ dS |d  d	¡d
 }d|v rž| d¡d }t tj|¡S )zGReturns the IPv4 address configured on 'ifname', packed with inet_pton.T©Ú	close_fdsÚstdoutÚstderrú Failed to execute ifconfig: (%s)s       c                 S   s   g | ]}d |v r|  ¡ ‘qS )zinet ©Ústrip©Ú.0Úliner'   r'   r(   Ú
<listcomp>S   s   ÿz#get_if_raw_addr.<locals>.<listcomp>zNo IPv4 address found on %s !r   ú é   ú/)r   Ú
subprocessÚPopenr   ÚprogÚifconfigÚPIPEÚcommunicateÚ
returncoder   r   r0   Ú
splitlinesÚsplitÚsocketÚ	inet_ptonÚAF_INET)ÚifnameÚsubprocr,   r-   Ú	addressesÚaddressr'   r'   r(   Úget_if_raw_addrC   s&    

þ
ÿ
rH   c                 C   sÔ   d}t | ƒ} | tjkrt|fS tjtjj| gdtjtjd�}| 	¡ \}}|j
rbtdt|ƒ ¡  ƒ‚dd„ t|ƒ ¡ D ƒ}|sˆtd|  ƒ‚|d  d	¡d
 }dd„ | d¡D ƒ}t|ƒdkrÆtd|  ƒ‚td |¡fS )z6Returns the packed MAC address configured on 'ifname'.s         Tr*   r.   c                 S   s,   g | ]$}d |v s d|v s d|v r|  ¡ ‘qS )ZetherZlladdrrG   r/   r1   r'   r'   r(   r4   x   s   ÿz%get_if_raw_hwaddr.<locals>.<listcomp>zNo MAC address found on %s !r   r5   r6   c                 S   s   g | ]}t t|d ƒƒ‘qS )é   )ÚchrÚint)r2   Úbr'   r'   r(   r4   ‚   ó    ú:é   Ú )r   r   Zloopback_namer   r8   r9   r:   r;   r<   r=   r>   r   r   r0   r?   r@   Úlenr   Újoin)rD   ZNULL_MAC_ADDRESSrE   r,   r-   rF   Úmacr'   r'   r(   Úget_if_raw_hwaddrc   s.    


þ
ÿ
ÿrT   c                  C   s‚   t dƒD ]l} z t d|  tj¡}|| fW   S  tyr } z.|jdkrRtd|  ƒ‚W Y d}~qW Y d}~qd}~0 0 qtdƒ‚dS )z!Returns an opened BPF file objecté   z
/dev/bpf%ié   z\Permission denied: could not open /dev/bpf%i. Make sure to be running Scapy as root ! (sudo)Nz!No /dev/bpf handle is available !)ÚrangeÚosÚopenÚO_RDWRÚOSErrorÚerrnor   )ZbpfÚfdÚexr'   r'   r(   Úget_dev_bpf�   s    
ý$r_   c                 C   s:   t ||ƒ}t t| ƒttt|ƒtƒ¡}|dk r6tdƒ‚dS )z.Attach a BPF filter to the BPF file descriptorr   zCan't attach the BPF filter !N)	r   ÚLIBCÚioctlr   r   r   r   r	   r   )r]   Z
bpf_filterÚifaceÚbpÚretr'   r'   r(   Úattach_filter    s    
re   c                  C   sR   t  ¡ } g }tdƒD ].}| j| }|js, qD| t|jƒ|jf¡ qt  | ¡ |S )z2
    Returns a list containing (iface, index)
    r)   )	r`   r!   rW   Úcontentsr#   Úappendr   r"   Úif_freenameindex)ZptrZifacesÚirb   r'   r'   r(   Ú_get_ifindex_list«   s    

rj   z([0-9]*)([ab]?)$c                 C   sB   zt | tƒ}W n ty,   td| ƒ Y dS 0 t d|¡d }|S )z(Internal function to get interface flagsz"ioctl(SIOCGIFFLAGS) failed on %s !NZ16xH14xr   )r   r   ÚIOErrorr   ÚstructÚunpack)rD   ÚresultÚifflagsr'   r'   r(   Ú_get_if_flags½   s    
rp   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBPFInterfaceProviderÚBPFc              	   C   s´   |j d@ sdS ztƒ d }W n ty0   Y dS 0 |d u rBtdƒ‚z`z t |tt d|j 	¡ ¡¡ W n  t
y„   Y W t |¡ dS 0 W t |¡ dS W t |¡ nt |¡ 0 d S )Nr6   Fr   TzNo /dev/bpf are available !Z16s16x)Úflagsr_   r   Úfcntlra   r   rl   Úpackr   Úencoderk   rX   Úclose)ÚselfÚdevr]   r'   r'   r(   Ú	_is_validÎ   s(    
ÿ

û
ýzBPFInterfaceProvider._is_validc           	   
      s´   ddl m} i }tƒ }tƒ D ]’\‰ }z0tˆ ƒ}tj tˆ ƒd ¡}t	t
jtˆ ƒƒ}W n tyj   Y qY n0 ||tƒ}ˆ ˆ ˆ |||‡ fdd„|D ƒ|g |dœ}t| |ƒ|ˆ < q|S )Nr   )Ú	FlagValuer6   c                    s    g | ]}|d  ˆ kr|d ‘qS )é   r   r'   )r2   Úx©rD   r'   r(   r4   ÷   rM   z-BPFInterfaceProvider.load.<locals>.<listcomp>)Únamer   Údescriptionrs   ÚindexÚipÚipsrS   )Zscapy.fieldsr{   r   rj   rp   ÚscapyÚutilsZstr2macrT   r   rA   rC   rH   r   r   r   )	rx   r{   Údatarƒ   r�   ro   rS   r‚   Zif_datar'   r~   r(   Úloadä   s,    

ø
zBPFInterfaceProvider.loadN)r$   r%   r&   r   rz   r‡   r'   r'   r'   r(   rq   Ë   s   rq   )FÚ__doc__Ú
__future__r   Úctypesr   r   r   r   r   r   r	   r
   r   Zctypes.utilr   rt   rX   ÚrerA   rl   r8   r„   Zscapy.arch.bpf.constsr   r   r   Zscapy.arch.commonr   r   Zscapy.arch.unixr   r   Zscapy.compatr   Zscapy.configr   Zscapy.constsr   Z
scapy.datar   r   Zscapy.errorr   r   Zscapy.interfacesr   r   r   r   Zscapy.pton_ntopr   r[   ZLoadLibraryr`   ra   ÚargtypesÚrestyper!   Z_ptr_ifnameindex_tablerh   rH   rT   r_   re   rj   ÚcompileZ_IFNUMrp   rq   Zregister_providerr'   r'   r'   r(   Ú<module>   sR    
 *
3