a
    kÄ#dn3  ã                   @   s  d Z ddlZddlZddlZddlmZ ddlZddlZddlm	Z	 ddl
mZ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mZ dd
lmZmZmZ ddlmZmZm Z m!Z!m"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 )zL
Common customizations for all Unix-like operating systems other than Linux
é    N)Úioctl)Úconf)ÚFREEBSDÚNETBSDÚOPENBSDÚSOLARIS)Úlog_runtimeÚwarning)Únetwork_nameÚNetworkInterface)Ú	inet_pton)Úin6_getscopeÚconstruct_source_candidate_set)Úin6_isvalidÚin6_ismlladdrÚin6_ismnladdr)ÚListÚOptionalÚTupleÚUnionÚcastc              	   C   sD   t | ƒ} t ¡ }z$t||t d|  d¡¡ƒW | ¡  S | ¡  0 dS )zEase SIOCGIF* ioctl callsZ16s16xÚutf8N)r
   Úsocketr   ÚstructÚpackÚencodeÚclose)ÚiffÚcmdZsck© r   úF/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/arch/unix.pyÚget_if#   s    þr!   c                 C   s0   |du rddl m} |}tdt dt| |ƒ¡ƒS )zñGet the raw MAC address of a local interface.

    This function uses SIOCGIFHWADDR calls, therefore only works
    on some distros.

    :param iff: the network interface name as a string
    :returns: the corresponding raw MAC address
    Nr   )ÚSIOCGIFHWADDRzTuple[int, bytes]Z16xH6s8x)Ú
scapy.archr"   r   r   Úunpackr!   )r   Zsiocgifhwaddrr"   r   r   r    Úget_if_raw_hwaddr/   s    þþr%   c                    sn   t  dtjj ¡�"}| ¡  ¡  d¡}W d  ƒ n1 s:0    Y  ‡ fdd„|D ƒ}t|ƒdkrj|d S dS )zþ
    We attempt to guess the name of interfaces that are truncated from the
    output of ifconfig -l.
    If there is only one possible candidate matching the interface name then we
    return it.
    If there are none or more, then we return None.
    ú%s -lú Nc                    s   g | ]}|  ˆ ¡r|‘qS r   )Ú
startswith)Ú.0Úiface©Únetifr   r    Ú
<listcomp>W   ó    z%_guess_iface_name.<locals>.<listcomp>é   r   )	ÚosÚpopenr   ÚprogÚifconfigÚreadlineÚstripÚsplitÚlen)r,   ZfdescZifacesÚmatchesr   r+   r    Ú_guess_iface_nameL   s    	0r9   c                	   C   sB  t rt d¡} ntr t d¡} n
t d¡} d}d}d}d}d}g }g }|  ¡ D �]F}|s^ �q˜| ¡  ¡ }| d¡dkrzqN|sº| d¡dkrNd}d	|v }d
|v }d|v }d|v p¶d|v }qN|sÄ �q˜| ¡ }	t rö|	dd… \}
}}}|	d| |  }nH|	dd… \}
}}t	�o|	d dk}|| | | }||7 }|	d|  }| d¡dk�rRqNnš|
dk�rfd}d}n†t �r†t
j |
¡}t
j |¡}nfd|
v �r°|
 d¡\}
}t
j t|ƒ¡}nt
j |
 d¡d d ¡}|
dd|
 d¡  7 }
t
j |
¡}d}d|v�rþd}|du�r†ddlm} zX||ƒ}|dk�rTt|ƒ}|du�rH||ƒ}|}nt d|¡ | ||||||f¡ W n t�y‚   ‚ Y n0 qN| |||f¡ qN|  ¡  |D ]˜\}}}t
j |¡}d\}}}|dd… D ]6\}}}}}}||@ |k�rÐ||k�rÐ|}|}|}�qÐd}|�r0|�r0| ||||||f¡ n
td|ƒ �q¤|S )z_Return a list of IPv4 routes than can be used by Scapy.

    This function parses netstat.
    znetstat -rvn -f inetznetstat -rnW -f inetznetstat -rn -f inetr   Fz----Údestinationr/   ZmtuÚprioÚrefZuseZnhopNé   é   é   ÚlÚlcÚdefaultú/Ú.é   z.0Úgz0.0.0.0)Úget_if_addrz*Could not guess partial interface name: %s)r   NNz1Did not find output interface to reach gateway %s)r   r0   r1   r   Ú	readlinesr5   ÚlowerÚfindr6   r   ÚscapyÚutilsZatolZitomÚintÚcountr#   rG   r9   r   ÚinfoÚappendÚOSErrorr   r	   ) ÚfÚokÚmtu_presentÚprio_presentZrefs_presentZuse_presentÚroutesZ
pending_ifÚlineÚrtZdest_Znetmask_Zgwr,   ZflgÚlockedÚoffsetÚdestÚnetmaskÚmetricrG   ZifaddrZguessed_netifZgw_lZ
max_rtmaskZgw_ifZ
gw_if_addrZrtdstZrtmaskÚ_ZrtifZrtaddrr   r   r    Úread_routes]   s¬    






þ


r_   c              
   C   sÔ   zt  dtjj| f ¡}W n  ty:   t d¡ g  Y S 0 g }|D ]‚}d|v rD| ¡  	dd¡d }nqDd|v r€| 	dd¡d }zt
tj|ƒ W n tjtfy¬   Y qDY n0 t|ƒ}| ||| f¡ qD| ¡  |S )	zN
    Returns a list of IPv6 addresses configured on the interface ifname.
    z%s %súFailed to execute ifconfig.Zinet6Né   r/   ú%r   )r0   r1   r   r2   r3   rQ   r   r	   Úrstripr6   r   r   ÚAF_INET6ÚerrorÚ
ValueErrorr   rP   r   )ZifnamerR   ÚretrW   ÚaddrÚscoper   r   r    Ú_in6_getifaddrÐ   s(    


rj   c                  C   sð   t str‚trd} nd} zt | tjj ¡}W n  tyL   t 	d¡ g  Y S 0 g }|D ](}d|v rV| 
¡ d  d¡}| |¡ qVnHzt dtjj ¡}W n  ty¸   t 	d¡ g  Y S 0 | ¡  ¡  
¡ }g }|D ]}|t|ƒ7 }qÒ| ¡  |S )zõ
    Returns a list of 3-tuples of the form (addr, scope, iface) where
    'addr' is the address of scope 'scope' associated to the interface
    'iface'.

    This is the list of all addresses of all interfaces available on
    the system.
    z%s -a6z%sr`   Úflagsr   ú:r&   )r   r   r0   r1   r   r2   r3   rQ   r   r	   r6   rc   rP   r4   rj   r   )r   rR   Úsplitted_linerW   r*   rg   Úir   r   r    Úin6_getifaddrõ   s2    



ro   c               	      sh  t  d¡} tƒ }|s |  ¡  g S d}d}d}g }|  ¡ D �] }|shd|dd… kr8d}d|v }d|v }q8| ¡ }tsxtr¶d	| | }t|ƒ|k ršt	d
ƒ q8|dd… \}	}
}|| ‰ n*t|ƒdk rÌt	d
ƒ q8|dd… \}	}
}‰ d}d|vrîq8d|v røq8d|v �rq8d|
v �rd}
d}d|	v �rF|	 d¡\}	‰ dˆ v �rFˆ  d¡\‰ }d|
v �r^|
 d¡\}
‰ t
|
ƒ�sld}
|	dk�r€d\}	}nd|	v �r˜|	 d¡\}	}dˆ v �r°ˆ  d¡\‰ }t
|	ƒ�sÄt	dƒ q8zt|ƒ}W n  t�yð   t	dƒ Y q8Y n0 t|	ƒs8t|	ƒ�rq8tjˆ v �rdg}d}
n‡ fdd„|D ƒ}t|	||ƒ}t|ƒr8| |	||
ˆ ||f¡ q8|  ¡  |S )z_Return a list of IPv6 routes than can be used by Scapy.

    This function parses netstat.
    znetstat -rn -f inet6FZDestinationNé   TZMtuZPrioé   z#Not enough columns in route entry !r>   r=   r/   ÚUÚRÚmÚlinkú::é€   rb   rC   rB   )rv   r   z1Invalid destination IPv6 address in route entry !z+Invalid IPv6 prefix length in route entry !z::1c                 3   s   | ]}|d  ˆ kr|V  qdS )ra   Nr   )r)   Úx©Údevr   r    Ú	<genexpr>”  r.   zread_routes6.<locals>.<genexpr>)r0   r1   ro   r   rH   r6   r   r   r7   r	   r   rM   Ú	Exceptionr   r   r   Zloopback_namer   rP   )Z
fd_netstatZlifaddrZ
got_headerrT   rU   rV   rW   rm   Úindexr:   Znext_hoprk   r]   Zdestination_plenZcsetZdevaddrsr   ry   r    Úread_routes6$  sŽ    













r~   )N)*Ú__doc__r0   r   r   Zfcntlr   Zscapy.configrK   Zscapy.utilsr   Zscapy.constsr   r   r   r   Zscapy.errorr   r	   Zscapy.interfacesr
   r   Zscapy.pton_ntopr   Zscapy.utils6r   r   r   r   r   Zscapy.compatr   r   r   r   r   r!   r%   r9   r_   rj   ro   r~   r   r   r   r    Ú<module>   s,   	 ÿ
s%/