a
    kÄ#d[‹  ã                   @   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
mZ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mZmZmZmZ ddlmZmZmZm Z 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, ddl-m.Z.m/Z/ ddl0m1  m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl6m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB de_CddlDmEZE ddlFmGZGmHZH dZIejJ�r˜eIe_Kn@z$eLe M¡ ƒdk�r´de_Knde_KW n eN�yÖ   de_KY n0 eOedƒ�sêde_PeOedƒ�süde_QeOedƒ�sde_ReOedƒ�s de_SeOed ƒ�s4ejSe_TeOed!ƒ�sFd"e_UeOed#ƒ�sXd$e_VeOed%ƒ�sjd&e_WeGd' ZXd(d)„ ZYd*d+„ ZZdhd-d.„Z[did0d1„Z\G d2d3„ d3eƒZ]d4d5„ Z^e]ƒ e__ej_j`�rèejJ�rèd6d7„ Zaeaƒ Zbeb�sæe d8¡ [bdjd:d;„Zcd<d=„ ZdG d>d?„ d?eƒZeG d@dA„ dAeƒZfejg hef¡ dkdBdC„ZidDdE„ ZjdldFdG„ZkdHdI„ ZldJdK„ ZmdmdLdM„ZndndNdO„ZododPdQ„ZpejC�rŒeEjqZrdRdS„ ZqeqeE_qdTdU„ ZsdVdW„ Zte;dXdY„ ƒZue;dpdZdY„ƒZudqd[dY„Zud\d]„ Zvd^d_„ Zwd`da„ Zxdbdc„ Zydrddde„ZzG dfdg„ dge9ƒZ{dS )sz5
Customizations needed to support Microsoft Windows.
é    )ÚglobN)Ú_windows_titleÚGetAdaptersAddressesÚGetIpForwardTableÚGetIpForwardTable2Úget_service_status)ÚWINDOWSÚ
WINDOWS_XP)ÚconfÚProgPath)ÚScapy_ExceptionÚlog_interactiveÚlog_loadingÚlog_runtimeÚwarning)ÚNetworkInterfaceÚInterfaceProviderÚdev_from_indexÚresolve_ifaceÚnetwork_name)Ú	inet_ntopÚ	inet_pton)ÚatolÚitomÚmac2strÚstr2mac)Úconstruct_source_candidate_setÚin6_getscope)ÚARPHDR_ETHERÚ
load_manuf)ÚinputÚwinreg)Ú	plain_str)ÚSuperSocket)	ÚcastÚoverloadÚAnyÚDictÚListÚLiteralÚOptionalÚTupleÚUnionT)Úlibpcap)Ú
NPCAP_PATHÚ
PCAP_IF_UPz\Device\NPF_Loopbackg333333 @z"Microsoft KM-TEST Loopback AdapterzMicrosoft Loopback AdapterÚIPPROTO_IPIPé   Ú
IP_RECVTTLé   ÚIPV6_HDRINCLé$   ÚIPPROTO_IPV6é)   ÚSOL_IPV6ÚIPPROTO_GREé/   Ú
IPPROTO_AHé3   ÚIPPROTO_ESPé2   z\WlanHelper.exec                 C   s   d|  S )z0Encapsulate a command with an Administrator flagzmpowershell /command "Start-Process cmd -windowstyle hidden -Wait -PassThru -Verb RunAs -ArgumentList '/c %s'"© )Úcmdr?   r?   úR/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/arch/windows/__init__.pyÚ_encapsulate_adminc   s    þrB   c                 C   sT   t j}d}z*t  ||¡}t  || ¡\}}t  |¡ W n tyH   Y dS 0 tt|ƒS )zù
    Get a Npcap parameter matching key in the registry.

    List:
    AdminOnly, DefaultFilterSettings, DltNull, Dot11Adapters, Dot11Support
    LoopbackAdapter, LoopbackSupport, NdisImPlatformBindingOptions, VlanSupport
    WinPcapCompatible
    z2SYSTEM\CurrentControlSet\Services\npcap\ParametersN)r!   ÚHKEY_LOCAL_MACHINEÚOpenKeyÚQueryValueExZCloseKeyZWindowsErrorr$   Ústr)Z	param_keyÚhkeyÚnodeÚkeyZdot11_adaptersÚ_r?   r?   rA   Ú_get_npcap_configo   s    
rK   ÚPATHc              	      sˆ   |du rg }t |tƒs|g}tˆ ƒr(ˆ S tjgtj|  tjj¡ | }zt	‡ fdd„|D ƒƒW S  t
tfy‚   tdˆ  ƒ‚Y n0 dS )z@Find file in current dir, in deep_lookup cache or in system pathNc                 3   s6   | ].}t tj |ˆ ¡ƒD ]}|rtj |¡V  qqd S ©N)r   ÚosÚpathÚjoinÚnormpath)Ú.0rO   Úmatch©Úfilenamer?   rA   Ú	<genexpr>�   s   ýz_where.<locals>.<genexpr>zFile not found: %s)Ú
isinstanceÚlistr   rN   ÚcurdirÚenvironÚsplitrO   ÚpathsepÚnextÚStopIterationÚRuntimeErrorÚIOError)rU   ÚdirsÚenvÚpathsr?   rT   rA   Ú_where„   s    
 ÿ
rd   ÚProgramFilesc              	   C   s~   |   d¡r| gn
| d | g}|D ]T}z4|du r8t|ƒ}nt|tj tj| |¡gd�}W n tyn   d}Y q 0  qvq |p|dS )zwFind executable in current dir, system path or in the
    given ProgramFiles subdir, and retuen its absolute path.
    z.exeN)ra   Ú )Úendswithrd   rN   rO   rP   rZ   r`   )rU   Úinstallsubdirrb   ÚfnsÚfnrO   r?   r?   rA   Úwin_find_exe—   s    
"
rk   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚWinProgPathc                 C   s   |   ¡  d S rM   )Ú_reload©Úselfr?   r?   rA   Ú__init__«   s    zWinProgPath.__init__c              	   C   s.  d| _ d| _d| _tdƒ| _tdƒ| _tdƒ| _tdƒ| _| j| _	tdƒ| _
tdƒ| _tddƒ| _td	d
dd�| _tdddd�| _tdddd�| _tdddd�| _| j�r*z6ttjj | j tjj¡d d… ¡tjj d ƒ}W n& ttf�y   t d¡ d }Y n0 |�r*tjj ¡  tjj |j¡ d S )Nrf   ÚdotZwindumpÚtsharkÚ	tcpreplayZhexerÚsoxÚ	wiresharkZ
USBPcapCMDZUSBPcapZprogramfiles)rh   rb   Ú
powershellzSystem32\WindowsPowerShell\v1.0Z
SystemRootÚcscriptZSystem32r@   éÿÿÿÿZmanufz/Wireshark is installed, but cannot read manuf !) Z	pdfreaderZpsreaderZ	svgreaderrk   rq   Útcpdumprr   rs   Ú_defaultÚdisplayZhexeditrt   ru   Z
usbpcapcmdrv   rw   r@   r   rN   rO   ÚseprP   r[   r`   ÚOSErrorr   r   r
   ZmanufdbÚ__dict__ÚclearÚupdate)ro   Z	new_manufr?   r?   rA   rm   ¯   sX    





ýýÿÿÿþþÿ

zWinProgPath._reloadN)Ú__name__Ú
__module__Ú__qualname__rp   rm   r?   r?   r?   rA   rl   ª   s   rl   c                 C   s(   t j| t jdd�}| ¡ d }||jfS )z7Call a CMD command and return the output and returncodeT)ÚstdoutÚshellr   )ÚspÚPopenÚPIPEÚcommunicateÚ
returncode)ÚcommandÚprocÚresr?   r?   rA   Ú	_exec_cmdÛ   s    þrŽ   c                  C   sb   zHt jtjjdgt jt jd�} |  ¡ \}}tƒ  | 	¡ }d|v oFd|vW S  t
y\   Y dS 0 dS )z0Return whether windump version is correct or notz-help)r„   Ústderrs   npcaps   winpcapFN)r†   r‡   r
   Úprogry   rˆ   ÚSTDOUTr‰   r   ÚlowerÚ	Exception)Zp_test_windumpr„   ÚerrÚ_outputr?   r?   rA   Útest_windump_npcapè   s    r–   zvThe installed Windump version does not work with Npcap! Refer to 'Winpcap/Npcap conflicts' in scapy's installation docFc                    s@   dd„ ‰‡fdd„‰ t jr$dd„ ‰nt‰‡ ‡‡fdd„tƒ D ƒS )	z‰Returns windows interfaces through GetAdaptersAddresses.

    params:
     - extended: include anycast and multicast IPv6 (default False)c                 S   s4   | d }|dkrdS t | d ƒ}tt|ƒd |… ƒS )NZphysical_address_lengthé   rf   Zphysical_address)Ú	bytearrayr   Úbytes)ÚxÚsizeÚdatar?   r?   rA   Ú_get_mac  s
    z%get_windows_if_list.<locals>._get_macc                    sV   | d }| d }| d }dd„ }g }|  ||ƒ¡ ˆ rR|  ||ƒ¡ |  ||ƒ¡ |S )NZfirst_unicast_addressZfirst_anycast_addressZfirst_multicast_addressc                 S   s„   t | tƒsg S g }| D ]h}|d d j}|jtjkr>d}d}nd}d}t||ƒ}t||ƒ}tt|j	ƒƒ}|r| 
t|j|ƒ¡ q|S )NÚaddressÚIpv6Ú	sin6_addrÚIpv4Úsin_addr)rW   rX   ÚcontentsZ	si_familyÚsocketÚAF_INET6Úgetattrr™   r˜   ÚbyteÚappendr   )ÚyÚipsÚipÚaddrZip_keyZsi_keyrœ   r?   r?   rA   Ú_resolve_ips  s     


z;get_windows_if_list.<locals>._get_ips.<locals>._resolve_ips)Úextend)rš   ZunicastZanycastZ	multicastr­   rª   ©Úextendedr?   rA   Ú_get_ips  s    z%get_windows_if_list.<locals>._get_ipsc                 S   s   | j ddd�S )NÚutf8Úignore©Úerrors)Úencode)rš   r?   r?   rA   Ú<lambda>.  ó    z%get_windows_if_list.<locals>.<lambda>c                    s^   g | ]V}ˆ|d  ƒ|d ˆ|d ƒˆ|d ƒˆ|ƒt r:dn|d t rHdn|d ˆ |ƒdœ‘qS )Zfriendly_nameZinterface_indexÚdescriptionZadapter_namer   Úipv4_metricÚipv6_metric)ÚnameÚindexr¹   ÚguidÚmacrº   r»   rª   )r	   ©rR   rš   )r±   r�   Ú_str_decoder?   rA   Ú
<listcomp>1  s   
ø


øz'get_windows_if_list.<locals>.<listcomp>)ÚsixÚPY2r"   r   r¯   r?   )r±   r�   rÁ   r°   rA   Úget_windows_if_listü   s    "

örÅ   c                 C   s   d| v rd|   d¡d  S | S )zcConverts a Winpcap/Npcap pcpaname to its guid counterpart.
    e.g. \DEVICE\NPF_{...} => {...}
    Ú{é   )r[   )Z	pcap_namer?   r?   rA   Ú_pcapname_to_guid?  s    rÈ   c                       s¨   e Zd ZdZd&‡ fdd„	Z‡ fdd„Zdd„ Z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dd„ Zd d!„ Zd"d#„ Zd$d%„ Z‡  ZS )(ÚNetworkInterface_Winz&A network interface of your local hostNc                    s4   d | _ d | _d | _d | _d | _tt| ƒ ||¡ d S rM   )Ú
cache_moderº   r»   r¾   Úraw80211ÚsuperrÉ   rp   )ro   Úproviderrœ   ©Ú	__class__r?   rA   rp   L  s    zNetworkInterface_Win.__init__c                    sˆ   |d | _ |d | _|d | _|d | _z8tjr^| j tkr^d|d< d|d< d	|d
< dd	g|d< W n tyr   Y n0 tt	| ƒ 
|¡ dS )z„Update info about a network interface according
        to a given dictionary. Such data is provided by get_windows_if_list
        r   r¾   rº   r»   ú00:00:00:00:00:00r¿   ú	127.0.0.1r«   ú::1Zip6rª   N)r   r¾   rº   r»   r
   Ú	use_npcapÚNPCAP_LOOPBACK_NAMEÚKeyErrorrÌ   rÉ   r€   )ro   rœ   rÎ   r?   rA   r€   U  s    



zNetworkInterface_Win.updatec                 C   sH   t jstdƒ‚| jd u r6tdƒ}|r0tt|ƒƒnd| _| jsDtdƒ‚d S )NzThis operation requires Npcap.ZDot11SupportFz%Npcap 802.11 support is NOT enabled !)r
   rÓ   r}   rË   rK   ÚboolÚintr   )ro   Úvalr?   r?   rA   Ú_check_npcap_requirementm  s    
z-NetworkInterface_Win._check_npcap_requirementc                 C   s^   | j du rtdƒ‚ttd t| j dd… ||g¡ƒƒ\}}tƒ  |dkrZt|jddd	�ƒ‚d
S )z3Internal function. Set a [key] parameter to [value]NúInterface not setupú rÇ   rx   r   r²   r³   r´   T)r¾   r}   rŽ   rB   rP   Ú_WlanHelperr   Údecode)ro   rI   rØ   r�   Úcoder?   r?   rA   Ú
_npcap_setw  s    
ÿ
zNetworkInterface_Win._npcap_setc                 C   s`   | j d u rtdƒ‚td t| j dd… |g¡ƒ\}}tƒ  |dkrTt|jddd�ƒ‚t| ¡ ƒS )	NrÚ   rÛ   rÇ   rx   r   r²   r³   r´   )	r¾   r}   rŽ   rP   rÜ   r   rÝ   r"   Ústrip)ro   rI   r�   rÞ   r?   r?   rA   Ú
_npcap_get„  s    
"zNetworkInterface_Win._npcap_getc                 C   s   |   ¡  |  d¡S )zDGet the interface operation mode.
        Only available with Npcap.Úmode©rÙ   rá   rn   r?   r?   rA   râ   Ž  s    zNetworkInterface_Win.modec                 C   sB   | j dur| j S z|  ¡ dk}|| _ |W S  ty<   Y dS 0 dS )zTReturns True if the interface is in monitor mode.
        Only available with Npcap.NÚmonitorF)rÊ   râ   r   )ro   r�   r?   r?   rA   Ú	ismonitor•  s    
zNetworkInterface_Win.ismonitorTc                 C   sJ   |r|   d¡}n
|   d¡}|s(t d¡ d| _|  ¡  }| _|rD|S | S )zTAlias for setmode('monitor') or setmode('managed')
        Only available with Npcaprä   Úmanagedz.Npcap WlanHelper returned with an error code !N)Úsetmoder   ÚerrorrÊ   rå   )ro   Úenabler�   Útmpr?   r?   rA   Ú
setmonitor¢  s    

zNetworkInterface_Win.setmonitorc                 C   s   |   ¡  |  d¡ d¡S )zEGet all available interface modes.
        Only available with Npcap.Úmodesú,©rÙ   rá   r[   rn   r?   r?   rA   Úavailablemodes±  s    z#NetworkInterface_Win.availablemodesc                 C   s@   |   ¡  dddddddœ}t|tƒr0| |d¡n|}|  d	|¡S )
a¥  Set the interface mode. It can be:
        - 0 or managed: Managed Mode (aka "Extensible Station Mode")
        - 1 or monitor: Monitor Mode (aka "Network Monitor Mode")
        - 2 or master: Master Mode (aka "Extensible Access Point")
              (supported from Windows 7 and later)
        - 3 or wfd_device: The Wi-Fi Direct Device operation mode
              (supported from Windows 8 and later)
        - 4 or wfd_owner: The Wi-Fi Direct Group Owner operation mode
              (supported from Windows 8 and later)
        - 5 or wfd_client: The Wi-Fi Direct Client operation mode
              (supported from Windows 8 and later)
        Only available with Npcap.ræ   rä   ZmasterZ
wfd_deviceZ	wfd_ownerZ
wfd_client)r   rÇ   é   é   r1   é   Úunknownrâ   )rÙ   rW   r×   Úgetrß   )ro   râ   Z_modesÚmr?   r?   rA   rç   ¹  s    úzNetworkInterface_Win.setmodec                 C   s   |   ¡  t|  d¡ƒS )zDGet the channel of the interface.
        Only available with Npcap.Úchannel©rÙ   r×   rá   rn   r?   r?   rA   rö   Ô  s    zNetworkInterface_Win.channelc                 C   s   |   ¡  |  dt|ƒ¡S )úKSet the channel of the interface (1-14):
        Only available with Npcap.rö   ©rÙ   rß   rF   )ro   rö   r?   r?   rA   Ú
setchannelÜ  s    zNetworkInterface_Win.setchannelc                 C   s   |   ¡  t|  d¡ƒS )zFGet the frequence of the interface.
        Only available with Npcap.Úfreqr÷   rn   r?   r?   rA   Ú	frequenceä  s    zNetworkInterface_Win.frequencec                 C   s   |   ¡  |  dt|ƒ¡S )rø   rû   rù   )ro   rû   r?   r?   rA   Úsetfrequenceì  s    z!NetworkInterface_Win.setfrequencec                 C   s   |   ¡  |  d¡ d¡S )zRGet all available 802.11 interface modulations.
        Only available with Npcap.Zmodusrí   rî   rn   r?   r?   rA   Úavailablemodulationsô  s    z)NetworkInterface_Win.availablemodulationsc                 C   s   |   ¡  |  d¡S )zNGet the 802.11 modulation of the interface.
        Only available with Npcap.Úmodurã   rn   r?   r?   rA   Ú
modulationü  s    zNetworkInterface_Win.modulationc                 C   sN   |   ¡  ddddddddd	d
d
dœ}t|tƒr:| |d¡n|}|  dt|ƒ¡S )a_  Set the interface modulation. It can be:
           - 0: dsss
           - 1: fhss
           - 2: irbaseband
           - 3: ofdm
           - 4: hrdss
           - 5: erp
           - 6: ht
           - 7: vht
           - 8: ihv
           - 9: mimo-ofdm
           - 10: mimo-ofdm
           - the value directly
        Only available with Npcap.ZdsssZfhssZ
irbasebandZofdmZhrdssZerpZhtZvhtZihvz	mimo-ofdm)r   rÇ   rð   rñ   r1   rò   r—   é   é   é	   é
   ró   rÿ   )rÙ   rW   r×   rô   rß   rF   )ro   rÿ   Z_modusrõ   r?   r?   rA   Úsetmodulation  s    õz"NetworkInterface_Win.setmodulation)N)T)r�   r‚   rƒ   Ú__doc__rp   r€   rÙ   rß   rá   râ   rå   rë   rï   rç   rö   rú   rü   rý   rþ   r   r  Ú__classcell__r?   r?   rÎ   rA   rÉ   I  s$   	


rÉ   c                   @   s<   e Zd ZdZdZdd„ Zedd„ ƒZefdd„Z	d	d
„ Z
dS )ÚWindowsInterfacesProviderr-   Tc                 C   s   |j dkrdS t|j t@ ƒS )Nr   T)ÚflagsrÖ   r/   )ro   Údevr?   r?   rA   Ú	_is_valid+  s    
z#WindowsInterfacesProvider._is_validc                 C   sb   t js
dS tƒ }dd„ }|r dS t d¡ t jr6|ƒ rTtt jd�}|rTt d¡ dS t d¡ dS )z$Performs checks/restart pcap adapterNc               	   S   s~   t js
dS d} z"dd l}tt|jjj| dd�ƒW S  tt	fyx   t
| ƒ}| ¡  ¡ }|dv rdY dS |dv rBY dS qBY n0 d S )	NFz(Do you want to start it ? (yes/no) [y]: r   r©   )Údefault)Úyesr©   rf   T)ÚnoÚn)r
   ÚinteractiveÚIPythonr$   rÖ   ÚutilsÚioZ
ask_yes_noÚ	NameErrorÚImportErrorr    r’   rà   )Úmsgr  Z_confirr?   r?   rA   Ú	_ask_user<  s    z8WindowsInterfacesProvider._pcap_check.<locals>._ask_userz:Scapy has detected that your pcap service is not running !©ÚaskadminzPcap service started !z†Could not start the pcap service! You probably won't be able to send packets. Check your winpcap/npcap installation and access rights.)	r
   Úuse_pcapÚpcap_service_statusr   r   r  Úpcap_service_startr   Úinfo)ÚclsZ_detectr  Zsucceedr?   r?   rA   Ú_pcap_check2  s"    ÿ
ÿz%WindowsInterfacesProvider._pcap_checkc                 C   s  i }t jst ¡  tƒ }tƒ D ]J}d|d v r8t j|d< |d rt jr\|d t jkr\t|d< |||d < qd}t	 
t j¡D ]†\}}|\}}	}
}t|ƒ}| |d ¡}|rÐ||d< tt|d |	 ƒƒ|d< |
|d< n"|d8 }|||||d	dd|	|
d
œ
}|| |ƒ||< qz|S )NZLoopbackr¼   r¾   r   r   rª   r	  rÇ   rÐ   )
r¼   r¹   r½   r¾   r   r¿   rº   r»   rª   r	  )r
   Zcache_pcapiflistr  r  ÚdictrÅ   Úloopback_namerÓ   rÔ   rÃ   Ú	iteritemsrÈ   rô   rX   Úset)ro   rÉ   ÚresultsZwindows_interfacesÚir½   ÚnetwZif_datar¼   rª   r	  rJ   r¾   rœ   r?   r?   rA   Úload`  sD    


özWindowsInterfacesProvider.loadc                 C   s&   d| _ tjrddlm} |ƒ  |  ¡ S )zReload interface listFr   )Úload_winpcapy)Zrestarted_adapterr
   r  Úscapy.arch.libpcapr(  r'  )ro   r(  r?   r?   rA   ÚreloadŽ  s
    z WindowsInterfacesProvider.reloadN)r�   r‚   rƒ   r¼   r-   r  Úclassmethodr  rÉ   r'  r*  r?   r?   r?   rA   r  '  s   
-.r  c                 C   s<   i }t  tj¡D ]&}| r(|jd ||< q|jd ||< q|S )zŸReturns all available IPs matching to interfaces, using the windows system.
    Should only be used as a WinPcapy fallback.

    :param v6: IPv6 addresses
    r—   r1   )rÃ   Ú
itervaluesr
   Úifacesrª   )Úv6r�   Úifacer?   r?   rA   Úget_ips�  s    r0  c                 C   s    t | ƒ} | jsdS ttj| jƒS )z(Return the raw IPv4 address of interfaces       )r   r«   r   r¤   ÚAF_INET)Ziffr?   r?   rA   Úget_if_raw_addr­  s    r2  c                 C   s0   t  dt¡ tj | ¡}t|d� |dg¡d S )zEBackward compatibility: indirectly calls get_ips
    Deprecated.
    zrget_ip_from_name is deprecated. Use the `ip` attribute of the iface or use get_ips() to get all ips per interface.©r.  rf   r   )ÚwarningsÚwarnÚDeprecationWarningr
   r-  Údev_from_namer0  rô   )Zifnamer.  r/  r?   r?   rA   Úget_ip_from_name¶  s    ýr8  c                   C   s   t jr
dS dS )z&Return the pcap adapter service's nameZnpcapZnpf)r
   rÓ   r?   r?   r?   rA   Úpcap_service_nameÄ  s    r9  c                  C   s   t tƒ ƒ} | d dkS )z:Returns whether the windows pcap adapter is running or notZdwCurrentStater1   )r   r9  )Ústatusr?   r?   rA   r  Ê  s    
r  c                 C   sH   | d t ƒ  }t|rt|ƒn|ƒ\}}|dkr@t|jddd�ƒ |dkS )z)Internal util to run pcap control commandrÛ   r   r²   r³   r´   )r9  rŽ   rB   r   rÝ   )Úactionr  r‹   r�   rÞ   r?   r?   rA   Ú_pcap_service_controlÑ  s
    r<  c                 C   s   t d| d�S )zDStarts the pcap adapter. Will ask for admin. Returns True if successzsc startr  ©r<  r  r?   r?   rA   r  Û  s    r  c                 C   s   t d| d�S )zCStops the pcap adapter. Will ask for admin. Returns True if successzsc stopr  r=  r  r?   r?   rA   Úpcap_service_stopá  s    r>  c                 O   sj   t tt| ƒƒ} | j}| s tdƒ‚| dd¡}tjrT|durT|  ¡ }||urT|  	|¡ t
|g|¢R i |¤ŽS )z�open_pcap: Windows routine for creating a pcap from an interface.
        This function is also responsible for detecting monitor mode.
        z+Interface is invalid (no pcap match found)!rä   N)r$   rÉ   r   r   r   rô   r
   rÓ   rå   rë   Ú_orig_open_pcap)r/  ÚargsÚkargsZiface_network_nameZ
kw_monitorZ	monitoredr?   r?   rA   Ú	open_pcapê  s    ÿ
rB  c                 C   s    t | ƒ}t|jrt|jƒpdfS )Ns         )r   r   r¿   r   )r/  Z_ifacer?   r?   rA   Úget_if_raw_hwaddr  s    rC  c               	   C   sÄ   dd„ } dd„ }g }t ƒ D ]¤}|d }||d ƒ}||d ƒ}| |d ƒ}|d	 }z&ttt|ƒƒ}	|	jrr|	jd
krvW qW n tyŽ   Y qY n0 |	j}
t|	ƒ}||	j }| |||||
|f¡ q|S )ztRetrieve Windows routes through a GetIpForwardTable call.

    This is compatible with XP but won't get IPv6 routes.c                 S   s   t tjt d| ¡ƒS )Nú<I)r   r¤   r1  ÚstructÚpack)Úobjr?   r?   rA   Ú_extract_ip  s    z&_read_routes_c_v1.<locals>._extract_ipc                 S   s    t rt dt d| ¡¡d S | S )NrD  z>Ir   )r	   rE  ÚunpackrF  )r«   r?   r?   rA   Ú_proc  s    z _read_routes_c_v1.<locals>._procZForwardIfIndexZForwardDestZForwardMaskZForwardNextHopZForwardMetric1ú0.0.0.0)	r   r$   rÉ   r   r«   Ú
ValueErrorr   rº   r¨   )rH  rJ  ÚroutesÚrouteÚifIndexÚdestÚnetmaskÚnexthopÚmetricr/  r«   r&  r?   r?   rA   Ú_read_routes_c_v1  s(    


rT  c                 C   s   d S rM   r?   ©Úipv6r?   r?   rA   Ú_read_routes_c0  s    rW  c                 C   s   d S rM   r?   rU  r?   r?   rA   rW  6  s    c              	      s.  | r
t jnt j‰ | rdnd‰| r$dnd‰| r0dnd}| r>tƒ }g }‡ ‡‡fdd„}tˆ ƒD ]Î}|d	 }||d
 d ƒ}|d
 d }||d ƒ}	|d }
z t|ƒ}|jr°|jdkr´W qZW n tyÌ   Y qZY n0 |j}t|ƒ}|
t	||ƒ }
| �rt
||||	|||
ƒ qZ| t|ƒtt|ƒƒ|	|||
f¡ qZ|S )zeRetrieve Windows routes through a GetIpForwardTable2 call.

    This is not available on Windows XP !rŸ   r¡   r    r¢   r»   rº   c                    s&   | ˆ ˆ }t t|d ƒƒ}tˆ |ƒS )Nr§   )r™   r˜   r   )rG  r«   ©ÚafZsin_addr_nameZsock_addr_namer?   rA   rH  I  s    z#_read_routes_c.<locals>._extract_ipZInterfaceIndexZDestinationPrefixZPrefixZPrefixLengthZNextHopZMetricrK  )r¤   r¥   r1  Úin6_getifaddrr   r   r«   rL  r   r¦   Ú_append_route6r¨   r   r   r×   )rV  Zmetric_nameÚlifaddrrM  rH  rN  rO  rP  rQ  rR  rS  r/  r«   r&  r?   rX  rA   rW  <  s>    

ÿÿc               
   C   sT   g } zt rtƒ } n
tdd�} W n0 tyN } zt d|¡ W Y d }~n
d }~0 0 | S )NFrU  z,Error building scapy IPv4 routing table : %s)r	   rT  rW  r“   r   r   )rM  Úer?   r?   rA   Úread_routesk  s    "r^  c                  C   sf   g } t dd�}| ¡ D ],\}}|D ]}t|ƒ}|  |||jf¡ q"qtjrbtjrb|  ddtjf¡ | S )z:
    Returns all IPv6 addresses found on the computer
    Tr3  rÒ   r   )r0  Úitemsr   r¨   r   r
   rÓ   r!  )ZifaddrsZip6sr/  rª   r«   Úscoper?   r?   rA   rZ  }  s    
rZ  c           	         sb   g }ˆ t jkr"|dkrd S dg}n‡ fdd„|D ƒ}t|||ƒ}|sHd S |  |||ˆ ||f¡ d S )Nú::rÒ   c                 3   s   | ]}|d  ˆ kr|V  qdS )rð   Nr?   rÀ   ©r/  r?   rA   rV   �  r¸   z!_append_route6.<locals>.<genexpr>)r
   r!  r   r¨   )	rM  ZdprefZdpZnhr/  r\  rS  ZcsetZdevaddrsr?   rb  rA   r[  Ž  s    	
r[  c               
   C   sP   g } t r| S ztdd�} W n0 tyJ } zt d|¡ W Y d }~n
d }~0 0 | S )NTrU  z,Error building scapy IPv6 routing table : %s)r	   rW  r“   r   r   )Zroutes6r]  r?   r?   rA   Úread_routes6¥  s    "rc  c                 C   sê  t stdƒ dS tdƒ |r*tjjs6dS ntjjs6dS tj tj¡ tj 	tj¡}|rf| 
|j¡ dS ttjjƒD ]$}|d }|tjkrrtjj |¡ qrttj ¡ ƒD ]\}}|tjkr¦tj |¡ q¦|tjd< |jt_ttjtƒrøtjjtjkrø|t_dtjjd< dtjjd< t d	t d
¡¡d }t d	t d¡¡d }||d|jddf}	ddd|jdgdf}
ddd|jdgdf}| du �rÀtjj 
|
¡ tjj 
|¡ tjj 
|	¡ tj ¡  tj ¡  n&|�rÜ|  
|
¡ |  
|¡ n
|  
|	¡ dS )zBAdd a route to 127.0.0.1 and ::1 to simplify unit tests on Windowsz4Calling _route_add_loopback is only valid on WindowsNz?This will completely mess up the routes. Testing purpose only !rñ   z&{0XX00000-X000-0X0X-X00X-00XXXX000XXX}zff:ff:ff:ff:ff:ffrÑ   rÒ   z!Iz	127.0.0.0r   z	255.0.0.0rK  rÇ   é€   ra  zfe80::)r   r   r
   Zroute6rM  rN  r-  Z_add_fake_ifacer!  r7  r¨   r   rX   Úremover_  ÚpoprW   r/  r   ZnetcacheZ	arp_cacheZin6_neighborrE  rI  r¤   Ú	inet_atonZinvalidate_cache)rM  rV  ZiflistÚadapterrN  r/  ZdevnameZloop_netZ	loop_maskZloopback_routeZloopback_route6Zloopback_route6_customr?   r?   rA   Ú_route_add_loopback±  sb    


ú


ri  c                   @   s   e Zd ZdZdd„ ZdS )Ú_NotAvailableSocketzwpcap.dll missingc                 O   s   t dƒ‚d S )Nz�Sniffing and sending packets is not available at layer 2: winpcap is not installed. You may use conf.L3socket orconf.L3socket6 to access layer 3)r_   )ro   r@  rA  r?   r?   rA   rp   ù  s    ÿz_NotAvailableSocket.__init__N)r�   r‚   rƒ   Údescrp   r?   r?   r?   rA   rj  ö  s   rj  )NrL   )Nre   )F)F)F)T)T)T)F)F)NFN)|r  r   rN   ÚplatformZplatform_libr¤   rE  Ú
subprocessr†   r4  Zscapy.arch.windows.structuresr   r   r   r   r   Zscapy.constsr   r	   Zscapy.configr
   r   Zscapy.errorr   r   r   r   r   Zscapy.interfacesr   r   r   r   r   Zscapy.pton_ntopr   r   Zscapy.utilsr   r   r   r   Zscapy.utils6r   r   Z
scapy.datar   r   Zscapy.libs.sixZlibsrÃ   Zscapy.libs.six.movesr    r!   Zscapy.compatr"   Zscapy.supersocketr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r  Z
scapy.archr-   r)  r.   r/   rÔ   rÓ   r!  ÚfloatÚreleaserL  Úhasattrr0   r2   r4   r6   r8   r9   r;   r=   rÜ   rB   rK   rd   rk   rl   rŽ   r�   ry   r–   Z
windump_okrÅ   rÈ   rÉ   r  r-  Zregister_providerr0  r2  r8  r9  r  r<  r  r>  rB  r?  rC  rT  rW  r^  rZ  r[  rc  ri  rj  r?   r?   r?   rA   Ú<module>   sÆ   ,


1
ÿ
C
 _s
	




$

/   þ
E