a
    kÄ#dÀÇ  ã                	   @   sz  d Z ddlmZmZ ddlZddlmZm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 ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZmZmZm Z  ddl!m"Z"m#Z#m$Z$ ddlm%Z%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1 ddlm2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddlm<Z< ddl!m=Z= ej>du �rxddl?Z@G dd„ dƒZAdZBe:e9e. e.f ZCG dd„ deDƒZEdd„ ZFdQdd„ZGdRdd „ZHejIjJdSd!d"„ƒZKejIjJdTd#d$„ƒZLejIjJdUd%d&„ƒZMd'd(„ ZNd)d*„ ZOejIjJdVd+d,„ƒZPejIjJd-d.„ ƒZQejIjJdddddefd/d0„ƒZRejIjJd1d2„ ƒZSeReSePeQfD ] ZTeTj du�rheT j eB7  _ �qhd3d4„ d5d4„ d6dddd6fd7d8„ZUejIjJd9d:„ ƒZVejIjJd;d<„ ƒZWG d=d>„ d>eDƒZXdWd?d@„ZYejIjJdXdAdB„ƒZZejIjJdYdCdD„ƒZ[ejIjJdZdEdF„ƒZ\ejIjJd[dGdH„ƒZ]G dIdJ„ dJeDƒZ^ejIjJdKdL„ ƒZ_e^j e__ ejIjJd\dMdN„ƒZ`ejIjJdOdP„ ƒZadS )]z(
Functions to send and receive packets.
é    )Úabsolute_importÚprint_functionN)ÚThreadÚEvent)Ú	plain_str©Ú	ETH_P_ALL)Úconf)Úwarning)Únetwork_nameÚresolve_ifaceÚNetworkInterface)ÚPacket)Úget_temp_fileÚtcpdumpÚwrpcapÚContextManagerSubprocessÚ
PcapReaderÚEDecimal)Ú
PacketListÚQueryAnswerÚ
SndRcvList)Úlog_runtimeÚlog_interactiveÚScapy_Exception)ÚGenÚSetGen)Úsix)ÚDefaultSession)ÚSuperSocketÚ
IterSocket)
ÚAnyÚCallableÚDictÚIteratorÚListÚOptionalÚTupleÚTypeÚUnionÚcast)Ú_GlobInterfaceType)Ú_PacketIterablec                   @   s.   e Zd Zeg dƒZeg dƒZeg dƒZdZdS )ÚdebugÚReceivedÚSentÚMatchedN)	Ú__name__Ú
__module__Ú__qualname__r   ÚrecvÚsentr   ÚmatchZ
crashed_on© r7   r7   úE/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/sendrecv.pyr-   B   s   


r-   a8  
    :param pks: SuperSocket instance to send/receive packets
    :param pkt: the packet to send
    :param timeout: how much time to wait after the last packet has been sent
    :param inter: delay between two packets during sending
    :param verbose: set verbosity level
    :param chainCC: if True, KeyboardInterrupts will be forwarded
    :param retry: if positive, how many times to resend unanswered packets
        if negative, how many times to retry when no more packets
        are answered
    :param multi: whether to accept multiple answers for the same stimulus
    :param rcv_pks: if set, will be used instead of pks to receive packets.
        packets will still be sent through pks
    :param prebuild: pre-build the packets before starting to send them.
        Automatically enabled when a generator is passed as the packet
    :param _flood:
    :param threaded: if True, packets will be sent in an individual thread
    :param session: a flow decoder used to handle stream of packets
    :param chainEX: if True, exceptions during send will be forwarded
    c                   @   s:   e Zd ZdZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ ZdS )ÚSndRcvHandleraÝ  
    Util to send/receive packets, used by sr*().
    Do not use directly.

    This matches the requests and answers.

    Notes::
      - threaded mode: enabling threaded mode will likely
        break packet timestamps, but might result in a speedup
        when sending a big amount of packets. Disabled by default
      - DEVS: store the outgoing timestamp right BEFORE sending the packet
        to avoid races that could result in negative latency. We aren't Stadia
    Nr   Fc                 C   sx  |d u rt j}t jr8tg dƒt_tg dƒt_tg dƒt_d| _	g | _
|| _|	pP|| _|| _|| _|| _|| _|| _|| _|| _d| _d| _d| _|| _|
r¬| js¬t|ƒ| _n|| _|dk rÆ|  }}nd}|d urà|dk ràd | _|dk�rÌi | _|sü| j�r6t| jd�}d|_|  |j¡ | j�r,| j  ¡  | !¡  n|  | j¡ |�rfdd	„ t"j#t$ %| j¡Ž D ƒ}ntt"j#t$ %| j¡Ž ƒ}|�r¨t&|ƒdk�r¨t&|ƒt&| jƒk�r¨|}|| _t&| jƒdk�rÂ�qÌ|d
8 }qàt j�rüt|d d … dƒt_t| j
d d … ƒt_|�r$| j
D ]\}}t'|dƒ�r|`(�q|�r\t)d| j	t&| j
ƒ t&| j
ƒt*d| j| j ƒf ƒ t| j
ƒ| _+t|dƒ| _,d S )Nr.   r/   r0   r   F)ÚtargetTc                 S   s   g | ]}t |d ƒs|‘qS )Ú	_answered)Úhasattr)Ú.0Úpr7   r7   r8   Ú
<listcomp>À   s   
ÿz*SndRcvHandler.__init__.<locals>.<listcomp>é   r;   z:
Received %i packets, got %i answers, remaining %i packetsZ
Unanswered)-r	   ÚverbÚdebug_matchr   r-   r4   r5   r   r6   ÚnbrecvÚansÚpksÚrcv_pksÚinterÚverboseÚchainCCÚmultiÚtimeoutÚsessionÚchainEXÚ
_send_doneÚnotansÚnoansÚ_floodÚlistÚtobesentÚhsentr   Ú_sndrcv_sndÚdaemonÚ_sndrcv_rcvÚstartÚstopÚjoinÚ	itertoolsÚchainr   Ú
itervaluesÚlenr<   r;   ÚprintÚmaxÚ
ans_resultÚunans_result)ÚselfrE   ÚpktrK   rG   rH   rI   ÚretryrJ   rF   ZprebuildrQ   ZthreadedrL   rM   ZautostopZ
snd_threadÚremainZsndÚ_r7   r7   r8   Ú__init__t   sŽ    


ÿ

ÿÿ
þÿÿzSndRcvHandler.__init__c                 C   s   | j | jfS ©N)ra   rb   ©rc   r7   r7   r8   Úresultsæ   s    zSndRcvHandler.resultsc                 C   s^  d}d}zözh| j rtdƒ | jD ]<}| j | ¡ g ¡ |¡ | j |¡ t	 
| j¡ |d7 }q | j rptd| ƒ W n6 ty„   Y n& ty¨   | jrš‚ n
t d¡ Y n0 W ztt|ƒjtt| jƒ_W n tyØ   Y n0 | jrì| jj| _n| jsø|| _d| _nZztt|ƒjtt| jƒ_W n t�y.   Y n0 | j�rD| jj| _n| j�sR|| _d| _0 dS )z/Function used in the sending thread of sndrcv()r   NzBegin emission:r@   zFinished sending %i packets.z--- Error sending packetsT)rH   r_   rS   rT   Ú
setdefaultÚhashretÚappendrE   ÚsendÚtimeÚsleeprG   Ú
SystemExitÚ	ExceptionrM   r   Ú	exceptionr*   r   Ú	sent_timeÚAttributeErrorrQ   ÚiterlenrO   rN   )rc   Úir>   r7   r7   r8   rU   ê   sL    


ÿ÷
ÿzSndRcvHandler._sndrcv_sndc                 C   s   |du rdS d}|  ¡ }|| jv r²| j| }t|ƒD ]|\}}| |¡r4| j t||ƒ¡ | jdkrnt 	dd¡ d}| j
sŽ||= |  jd7  _nt|dƒs¦|  jd7  _d|_ q²q4| jrÞ| j| jkrÞ| j
sÞ| jrÞ| jjdd� |�s| jdkrút 	dd¡ |  jd7  _tj�rtj |¡ dS )	z.Internal function used to process each packet.NFr@   ó   *Tr;   )rZ   ó   .)rm   rT   Ú	enumerateZanswersrD   rn   r   rH   ÚosÚwriterJ   rP   r<   r;   rN   rO   ÚsnifferrY   rC   r	   rB   r-   r4   )rc   ÚrÚokÚhZhlstrx   Zsentpktr7   r7   r8   Ú_process_packet  s8    





zSndRcvHandler._process_packetc                 C   sR   d| _ z,tƒ | _ | j j| j| jd| j| j|d� W n tyL   | jrH‚ Y n0 dS )z8Function used to receive packets and check their hashretNF)ÚprnrK   ÚstoreÚopened_socketrL   Ústarted_callback)	r~   ÚAsyncSnifferÚ_runr‚   rK   rF   rL   ÚKeyboardInterruptrI   )rc   Úcallbackr7   r7   r8   rW   1  s    ú
zSndRcvHandler._sndrcv_rcv)Nr   NFr   FNFNFNF)	r1   r2   r3   Ú__doc__rh   rk   rU   r‚   rW   r7   r7   r7   r8   r9   f   s$               ò
r&!r9   c                  O   s   t | i |¤Ž}| ¡ S )z§Scapy raw function to send a packet and receive its answer.
    WARNING: This is an internal function. Using sr/srp/sr1/srp is
    more appropriate in many cases.
    )r9   rk   )ÚargsÚkwargsZsndrcverr7   r7   r8   ÚsndrcvD  s    rŽ   Fc                 O   s   t |tƒrtj|d�}t |tƒs(t|ƒ}|du r6tj}d}
|durJ| }n|sRd}|r\tƒ nd}d}zôz¬|�rd}|D ]†}|r¾t ¡ }|r°|t	|jƒ | }|dkr¾t 
|¡ n|t	|jƒ }|  |¡ |durÚ| |¡ |
d7 }
|ròt dd¡ t 
|¡ qv|dk rh|d7 }qhW n t�y&   Y n0 W ztt|ƒjtt|ƒ_W n t�yV   Y n0 n0ztt|ƒjtt|ƒ_W n t�y†   Y n0 0 |�rœtd|
 ƒ |S )z±
    An internal function used by send/sendp to actually send the packets,
    implement the send logic...

    It will take care of iterating through the different packets
    )ÚloadNr   éÿÿÿÿr@   rz   z
Sent %i packets.)Ú
isinstanceÚstrr	   Z	raw_layerr   r   rA   r   rp   Úfloatrq   ro   rn   r|   r}   r‰   r*   r   ru   rv   r_   )ÚsÚxrG   ÚloopÚcountrH   ÚrealtimeÚreturn_packetsrŒ   ÚkargsÚnZsent_packetsr>   Zdt0ÚctÚstr7   r7   r8   Ú
__gen_sendN  s\    



ýrž   c
              
   K   sX   |	du }t |ptjƒ}|	p.||ƒf d|i|
¤Ž}	t|	| ||||||d�}|rT|	 ¡  |S )z(Internal function used by send and sendpNÚiface)rG   r–   r—   rH   r˜   r™   )r   r	   rŸ   rž   Úclose)r•   Z_funcrG   r–   rŸ   r—   rH   r˜   r™   Úsocketrš   Zneed_closingrk   r7   r7   r8   Ú_sendŽ  s    
þr¢   c                 K   s$   t || ƒ}t| dd„ fd|i|¤ŽS )aq  
    Send packets at layer 3

    :param x: the packets
    :param inter: time (in s) between two packets (default 0)
    :param loop: send packet indefinitely (default 0)
    :param count: number of packets to send (default None=1)
    :param verbose: verbose mode (default None=conf.verb)
    :param realtime: check that a packet was sent before sending the next one
    :param return_packets: return the sent packets
    :param socket: the socket to use (default is conf.L3socket(kargs))
    :param iface: the interface to send the packets on
    :param monitor: (not on linux) send in monitor mode
    :returns: None
    c                 S   s   |   ¡ S ri   )Úl3socket©rŸ   r7   r7   r8   Ú<lambda>¿  ó    zsend.<locals>.<lambda>rŸ   )Ú_interface_selectionr¢   )r•   rŸ   rš   r7   r7   r8   ro   §  s    
þýüro   c                 K   sD   |du r(|dur(|du r(t j |¡d }t| dd„ f||dœ|¤ŽS )aq  
    Send packets at layer 2

    :param x: the packets
    :param inter: time (in s) between two packets (default 0)
    :param loop: send packet indefinitely (default 0)
    :param count: number of packets to send (default None=1)
    :param verbose: verbose mode (default None=conf.verb)
    :param realtime: check that a packet was sent before sending the next one
    :param return_packets: return the sent packets
    :param socket: the socket to use (default is conf.L3socket(kargs))
    :param iface: the interface to send the packets on
    :param monitor: (not on linux) send in monitor mode
    :returns: None
    Nr   c                 S   s   |   ¡ S ri   )Úl2socketr¤   r7   r7   r8   r¥   à  r¦   zsendp.<locals>.<lambda>)rŸ   r¡   )r	   Úrouter¢   )r•   rŸ   Ú
iface_hintr¡   rš   r7   r7   r8   ÚsendpÅ  s    þüûr«   c	              	   C   s¶  |du rt j}t jjdt|ƒ g}	|dur:|	 d| ¡ n:|durR|	 d| ¡ n"|durj|	 d| ¡ n
|	 d¡ |durŠ|	 d| ¡ |r˜|	 d¡ |durª|	 |¡ tƒ }
|	 |
¡ t|
| ƒ d}t	t jjƒ�´ zt
j|	t
jt
jd	�}W n< t�y   t d
¡ Y nn t�y*   t |
¡ ‚ Y nP0 | ¡ \}}|�rLt | ¡ ¡ |�r`t|||	ƒ}nt jdk�rzt | ¡ ¡ W d  ƒ n1 �s�0    Y  tj |
¡�r²t |
¡ |S )a’  Send packets at layer 2 using tcpreplay for performance

    :param pps:  packets per second
    :param mbps: MBits per second
    :param realtime: use packet's timestamp, bending time with real-time value
    :param loop: number of times to process the packet list. 0 implies
        infinite loop
    :param file_cache: cache packets in RAM instead of reading from
        disk at each iteration
    :param iface: output interface
    :param replay_args: List of additional tcpreplay args (List[str])
    :param parse_results: Return a dictionary of information
        outputted by tcpreplay (default=False)
    :returns: stdout, stderr, command used
    Nz
--intf1=%sz--pps=%iz	--mbps=%fz--multiplier=%fz
--topspeedz	--loop=%iz--preload-pcap)ÚstdoutÚstderrzInterrupted by useré   )r	   rŸ   ÚprogZ	tcpreplayr   rn   Úextendr   r   r   Ú
subprocessÚPopenÚPIPEr‰   r   Úinfors   r|   ÚunlinkÚcommunicater   r
   ÚdecodeÚ_parse_tcpreplay_resultrA   ÚpathÚexists)r•   ÚppsÚmbpsr˜   r–   Ú
file_cacherŸ   Zreplay_argsZparse_resultsÚargvÚfrk   Úcmdr¬   r­   r7   r7   r8   Ú	sendpfastç  sP    





ÿ

.
rÁ   c              
      s„  �z<i }t | ƒ ¡ }t |ƒ ¡  d¡}tttftttfttttftftftftftftfdœ	}ddddddœ}d	}d
}	d}
t|	t|i‰ | d¡D ]Š}| ¡ }| ¡ D ]t\}}| |¡r¤|
 ‡ fdd„|D ƒ¡}t	 
||¡}t|ƒD ]4\}}| ||g¡| }|râ|| |d ¡ƒ||< qâq¤q�d |¡|d< |dd… |d< |W S  t�y~ } z&tj�sZ‚ t d|¡ i W  Y d}~S d}~0 0 dS )a‰  
    Parse the output of tcpreplay and modify the results_dict to populate output information.  # noqa: E501
    Tested with tcpreplay v3.4.4
    Tested with tcpreplay v4.1.2
    :param stdout: stdout of tcpreplay subprocess call
    :param stderr: stderr of tcpreplay subprocess call
    :param argv: the command used in the subprocess call
    :return: dictionary containing the results
    Ú
)	ÚactualÚratedÚflowsZ	attemptedZ
successfulÚfailedÚ	truncatedúretried packets (enoúretried packets (eag)ZpacketsÚbytesrp   )Zbpsr¼   r»   )rÅ   ZfpsZflow_packetsZnon_flow)Zretried_enobufs)Zretried_eagain)rÃ   rÄ   rÅ   rÈ   rÉ   z([0-9]*\.[0-9]+|[0-9]+)z([0-9]+)z[^0-9]*c                    s   g | ]}ˆ | ‘qS r7   r7   )r=   r•   ©Zr_typesr7   r8   r?   Z  r¦   z+_parse_tcpreplay_result.<locals>.<listcomp>r@   ú ÚcommandNr�   ÚwarningszError parsing output: %s)r   ÚlowerÚstripÚsplitÚintr“   ÚitemsÚ
startswithrZ   ÚreÚsearchr{   ÚgetÚgrouprs   r	   Úinteractiver   Úerror)Zstdout_bZstderr_br¾   rk   r¬   r­   ÚelementsrJ   Z	float_regZint_regZany_regÚlineÚeltÚ_typesÚregexÚmatchesrx   ÚtypÚnameZparse_exceptionr7   rË   r8   r¸   1  sT    
÷û
r¸   c                 C   sF   | du rBzt | ¡ ƒ ¡ d }W n ty6   d}Y n0 |p@tjS | S )zK
    Select the network interface according to the layer 3 destination
    Nr   )ÚnextÚ__iter__r©   rv   r	   rŸ   )rŸ   ÚpacketZiffr7   r7   r8   r§   j  s    

r§   c           	      O   s@   t || ƒ}tj||||d�}t|| g|¢R i |¤Ž}| ¡  |S )z-
    Send and receive packets at layer 3
    ©ÚpromiscÚfilterrŸ   Únofilter)r§   r	   ZL3socketrŽ   r    )	r•   rç   rè   rŸ   ré   rŒ   rš   r”   Úresultr7   r7   r8   Úsr|  s    
ÿrë   c                  O   s,   t | i |¤Ž\}}|r(tt|d d ƒS dS )zB
    Send packets at layer 3 and return only the first answer
    r   r@   N)rë   r*   r   ©rŒ   rš   rD   rg   r7   r7   r8   Úsr1‘  s    rí   c                 O   sh   |du r |dur t j |¡d }t|p*t jƒ}| ¡ |||||d�}	t|	| g|¢R i |¤Ž}
|	 ¡  |
S )z-
    Send and receive packets at layer 2
    Nr   )rç   rŸ   rè   ré   Útype)r	   r©   r   rŸ   r¨   rŽ   r    )r•   rç   rŸ   rª   rè   ré   rî   rŒ   rš   r”   rê   r7   r7   r8   Úsrp�  s    
ÿrï   c                  O   s4   t | i |¤Ž\}}t|ƒdkr0tt|d d ƒS dS )zN
    Send and receive packets at layer 2 and return only the first answer
    r   r@   N)rï   r^   r*   r   rì   r7   r7   r8   Úsrp1¶  s    rð   c                 C   s   | d   ¡ S )Nr@   ©Úsummary©r•   r7   r7   r8   r¥   Í  r¦   r¥   c                 C   s   |   ¡ S ri   rñ   ró   r7   r7   r8   r¥   Î  r¦   r@   c	                 O   sÜ  d}d}t j}|d u rt j}d}g }g }|d u r>td| dƒ}�zF|dN }|j|jg| }|d urv|dkrn�q„|d8 }t ¡ }|dkr’tddd� | |g|	¢R |ddd	œ|
¤Ž}|t|d ƒt|d ƒ 7 }|t|d ƒ7 }|dk�rX|�rXt|d ƒdk�rXd
t|d ƒ }td| 	|¡ dd� |d D ]*}t|||ƒƒƒ tdt|ƒ dd� �q,|dk�rÔ|�rÔt|d ƒdk�rÔdt|d ƒ }td| 
|¡ dd� |d D ]*}t|||ƒƒƒ tdt|ƒ dd� �q¨|dk�r|�s|�stdttt|d d… ƒƒ ƒ |dk�r>|d �r(t dd¡ |d �r>t dd¡ |�r\||d 7 }||d 7 }t ¡ }|| |k rBt || | ¡ qBW n t�yš   Y n0 |�rÌ|dk�rÌt| d||d| | f ¡ƒ t|ƒt|ƒfS )Nr   r®   é   r@   z	send...rÌ   )ÚendT)rK   rH   rI   zRECV %i:úzfail %i:zrecv:%i  fail:%iry   rz   z4
Sent %i packets, received %i packets. %3.1f%% hits.g      Y@)r	   Zcolor_themerA   ÚminZevenZoddrp   r_   r^   ÚsuccessZfailÚtupleÚmapr|   r}   rq   r‰   Únormalr   r   )ZsrfuncÚpktsrƒ   ZprnfailrG   rK   r—   rH   r„   rŒ   rš   r›   r   rœ   ZparityrD   ZunansÚcolrX   ÚresÚmsgr>   rõ   r7   r7   r8   Ú	__sr_loopË  sj    ""


 r   c                 O   s   t t| g|¢R i |¤ŽS )z�
    Send a packet at layer 3 in loop and print the answer each time
    srloop(pkts, [prn], [inter], [count], ...) --> None
    )r   rë   ©rü   rŒ   rš   r7   r7   r8   Úsrloop  s    
r  c                 O   s   t t| g|¢R i |¤ŽS )z�
    Send a packet at layer 2 in loop and print the answer each time
    srloop(pkts, [prn], [inter], [count], ...) --> None
    )r   rï   r  r7   r7   r8   Úsrploop  s    
r  c                   @   s>   e Zd Zdd„ Zdd„ Zedd„ ƒZejdd„ ƒZdd	„ Zd
S )Ú_FloodGeneratorc                 C   s   || _ || _tƒ | _d| _d S )Nr   )rS   Ú
maxretriesr   Ú	stopeventrw   )rc   rS   r  r7   r7   r8   rh   .  s    z_FloodGenerator.__init__c                 c   sd   d}|d7 }d}| j r$|| j kr$d S | jD ]"}| j ¡ r> d S |d7 }|V  q*| jdkr|| _qd S )Nr   r@   )r  rS   r  Úis_setrw   )rc   rx   Újr>   r7   r7   r8   rä   5  s    


z_FloodGenerator.__iter__c                 C   s   t t| jƒjS ri   ©r*   r   rS   ru   rj   r7   r7   r8   ru   E  s    z_FloodGenerator.sent_timec                 C   s   |t t| jƒ_d S ri   r	  )rc   Úvalr7   r7   r8   ru   J  s    c                 C   s   | j  ¡  d S ri   )r  Úsetrj   r7   r7   r8   rY   O  s    z_FloodGenerator.stopN)	r1   r2   r3   rh   rä   Úpropertyru   ÚsetterrY   r7   r7   r7   r8   r  -  s   

r  c              	   C   s    t ||ƒ}t| ||||||d�S )zsndrcv equivalent for flooding.)rG   rH   rI   rK   rQ   )r  rŽ   )rE   rd   rG   r  rH   rI   rK   Z	flood_genr7   r7   r8   ÚsndrcvfloodT  s    
ür  c           	      O   sF   t |p
tjƒ}| ¡ ||||d�}t|| g|¢R i |¤Ž}| ¡  |S )a<  Flood and receive packets at layer 3

    :param prn:      function applied to packets received
    :param unique:   only consider packets whose print
    :param nofilter: put 1 to avoid use of BPF filters
    :param filter:   provide a BPF filter
    :param iface:    listen answers only on the given interface
    ræ   )r   r	   rŸ   r£   r  r    )	r•   rç   rè   rŸ   ré   rŒ   rš   r”   r   r7   r7   r8   Úsrfloodh  s
    r  c           
      O   sh   t |p
tjƒ}| ¡ ||||d�}t|| g|¢R i |¤Ž\}}	| ¡  t|ƒdkrdtt|d d ƒS dS )aO  Flood and receive packets at layer 3 and return only the first answer

    :param prn:      function applied to packets received
    :param verbose:  set verbosity level
    :param nofilter: put 1 to avoid use of BPF filters
    :param filter:   provide a BPF filter
    :param iface:    listen answers only on the given interface
    ©rç   rè   ré   rŸ   r   r@   N)	r   r	   rŸ   r£   r  r    r^   r*   r   ©
r•   rç   rè   rŸ   ré   rŒ   rš   r”   rD   rg   r7   r7   r8   Úsr1flood�  s    r  c           
      O   sf   |du r |dur t j |¡d }t|p*t jƒ}| ¡ ||||d�}t|| g|¢R i |¤Ž}	| ¡  |	S )a<  Flood and receive packets at layer 2

    :param prn:      function applied to packets received
    :param unique:   only consider packets whose print
    :param nofilter: put 1 to avoid use of BPF filters
    :param filter:   provide a BPF filter
    :param iface:    listen answers only on the given interface
    Nr   ræ   )r	   r©   r   rŸ   r¨   r  r    )
r•   rç   rè   rŸ   rª   ré   rŒ   rš   r”   r   r7   r7   r8   Úsrpfloodœ  s    r  c           
      O   sh   t |p
tjƒ}| ¡ ||||d�}t|| g|¢R i |¤Ž\}}	| ¡  t|ƒdkrdtt|d d ƒS dS )aO  Flood and receive packets at layer 2 and return only the first answer

    :param prn:      function applied to packets received
    :param verbose:  set verbosity level
    :param nofilter: put 1 to avoid use of BPF filters
    :param filter:   provide a BPF filter
    :param iface:    listen answers only on the given interface
    r  r   r@   N)	r   r	   rŸ   r¨   r  r    r^   r*   r   r  r7   r7   r8   Ú	srp1flood¸  s    r  c                   @   s`   e Zd ZdZdd„ Zdd„ Zdddd	dddddddddi fd
d„Zdd„ Zddd„Zdd„ Z	dS )r‡   aü
  
    Sniff packets and return a list of packets.

    Args:
        count: number of packets to capture. 0 means infinity.
        store: whether to store sniffed packets or discard them
        prn: function to apply to each packet. If something is returned, it
             is displayed.
             --Ex: prn = lambda x: x.summary()
        session: a session = a flow decoder used to handle stream of packets.
                 --Ex: session=TCPSession
                 See below for more details.
        filter: BPF filter to apply.
        lfilter: Python function applied to each packet to determine if
                 further action may be done.
                 --Ex: lfilter = lambda x: x.haslayer(Padding)
        offline: PCAP file (or list of PCAP files) to read packets from,
                 instead of sniffing them
        quiet:   when set to True, the process stderr is discarded
                 (default: False).
        timeout: stop sniffing after a given time (default: None).
        L2socket: use the provided L2socket (default: use conf.L2listen).
        opened_socket: provide an object (or a list of objects) ready to use
                      .recv() on.
        stop_filter: Python function applied to each packet to determine if
                     we have to stop the capture after this packet.
                     --Ex: stop_filter = lambda x: x.haslayer(TCP)
        iface: interface or list of interfaces (default: None for sniffing
               on all interfaces).
        monitor: use monitor mode. May not be available on all OS
        started_callback: called as soon as the sniffer starts sniffing
                          (default: None).

    The iface, offline and opened_socket parameters can be either an
    element, a list of elements, or a dict object mapping an element to a
    label (see examples below).

    For more information about the session argument, see
    https://scapy.rtfd.io/en/latest/usage.html#advanced-sniffing-sniffing-sessions

    Examples: synchronous
      >>> sniff(filter="arp")
      >>> sniff(filter="tcp",
      ...       session=IPSession,  # defragment on-the-flow
      ...       prn=lambda x: x.summary())
      >>> sniff(lfilter=lambda pkt: ARP in pkt)
      >>> sniff(iface="eth0", prn=Packet.summary)
      >>> sniff(iface=["eth0", "mon0"],
      ...       prn=lambda pkt: "%s: %s" % (pkt.sniffed_on,
      ...                                   pkt.summary()))
      >>> sniff(iface={"eth0": "Ethernet", "mon0": "Wifi"},
      ...       prn=lambda pkt: "%s: %s" % (pkt.sniffed_on,
      ...                                   pkt.summary()))

    Examples: asynchronous
      >>> t = AsyncSniffer(iface="enp0s3")
      >>> t.start()
      >>> time.sleep(1)
      >>> print("nice weather today")
      >>> t.stop()
    c                 O   s"   || _ || _d| _d | _d | _d S ©NF)rŒ   r�   ÚrunningÚthreadrk   ©rc   rŒ   r�   r7   r7   r8   rh     s
    zAsyncSniffer.__init__c                 C   s$   t | j| j| jdd�| _d| j_d S )Nr‡   )r:   rŒ   r�   râ   T)r   rˆ   rŒ   r�   r  rV   rj   r7   r7   r8   Ú_setup_thread  s    üzAsyncSniffer._setup_threadr   TNFc                    sD  dˆ_ t|tƒs.|pt}|f ||dœ|¤Ž}n||_||_i }|	d ur˜t|	tƒrj| dd„ t|	ƒD ƒ¡ n.t|	tƒr�| dd„ t	 
|	¡D ƒ¡ nd||	< |d u�r–ˆ d¡‰t|tƒr¼|g}t|tƒrôtdd„ |D ƒƒrô| ‡‡fd	d„|D ƒ¡ n¢t|tƒ�r"| ‡‡fd
d„t	 
|¡D ƒ¡ ntt|tttfƒ�rjt|ƒ}||ˆd u �rN|ntt|ddgˆdˆd�ƒ< n,||tˆd u �r~|nt|ddgˆdˆd�ƒ< |�r¦|d u�r0‡ fdd„‰t|tƒ�rÚ| ‡‡fdd„|D ƒ¡ nVt|tƒ�r| ‡‡fdd„t	 
|¡D ƒ¡ n(|�ptj}||ˆ|ƒf t|dœˆ¤Ž< tt|ƒƒ}|j‰t|ddƒ}t‡fdd„|D ƒƒ�sntdƒ d ‰|�s¬ddlm} |d  ƒ ‰d|ˆ< ‡‡fdd„}|ˆ_n‡fdd„}|ˆ_�z,|�rÎ|ƒ  dˆ_|d u�rêt ¡ | }d }|�rêˆj�rê|d u�r |t ¡  }|dk�r �qêˆt|  ¡ ƒ|ƒ}g }|D �]x}|ˆu �rP �q¶z| !¡ }W nä t"�y¢   z| #¡  W n t$�yŒ   Y n0 | %|¡ Y �q:Y n  t$�y@ } z†d}z| #¡  W n. t$�yð } zd| }W Y d }~n
d }~0 0 td||f | ƒ | %|¡ tj&d k�r‚ W Y d }~�q:W Y d }~n
d }~0 0 |d u �rP�q:|�rd||ƒ�sd�q:|| |_'| (|¡ |
�rˆ|
|ƒ�s¦d|  k �r¢|j)k�r:n ndˆ_ �q¶�q:|D ]*}||= t*|ƒd!k�rºˆ|v �rº|ˆ= �qº�qîW n t+�y    Y n0 dˆ_ |	d u �r(|D ]}| #¡  �qnˆ�r6ˆ #¡  | ,¡ ˆ_-d S )"NT©rƒ   r„   c                 s   s   | ]\}}|d | fV  qdS )zsocket%dNr7   )r=   rx   r”   r7   r7   r8   Ú	<genexpr>H  s   ÿz$AsyncSniffer._run.<locals>.<genexpr>c                 s   s   | ]\}}||fV  qd S ri   r7   )r=   r”   Úlabelr7   r7   r8   r  M  s   ÿZsocket0rè   c                 s   s   | ]}t |tƒV  qd S ri   )r‘   r’   )r=   rÝ   r7   r7   r8   r  Z  r¦   c              	   3   s8   | ]0}t ˆ d u r|nt|ddgˆ dˆd�ƒ|fV  qd S ©Nú-wú-T©rŒ   ÚfltZgetfdÚquiet©r   r   )r=   Úfname©r!  r"  r7   r8   r  \  s   ùüþùc              	   3   s<   | ]4\}}t ˆ d u r|nt|ddgˆ dˆd�ƒ|fV  qd S r  r#  )r=   r$  r  r%  r7   r8   r  f  s   ùüþùr  r  r   c                    s   ˆ pt | ƒ ¡ S ri   )r   Zl2listen©rx   )ÚL2socketr7   r8   r¥   „  r¦   z#AsyncSniffer._run.<locals>.<lambda>c                 3   s*   | ]"}ˆ |ƒf t |d œˆ¤Ž|fV  qdS ©©rî   rŸ   Nr   )r=   Úifname©Ú_RL2Úkargr7   r8   r  †  s   þÿc                 3   s.   | ]&\}}ˆ |ƒf t |d œˆ¤Ž|fV  qdS r(  r   )r=   r*  Ziflabelr+  r7   r8   r  Œ  s   þÿr)  Únonblocking_socketFc                 3   s   | ]}ˆ |j kV  qd S ri   )Úselect)r=   Úsock)Úselect_funcr7   r8   r  ›  r¦   zaWarning: inconsistent socket types ! The used select function will be the one of the first socketr   )Ú
ObjectPipeZcontrol_socketc                      s   ˆj rˆ rˆ  d ¡ dˆ_d S r  )r  ro   Úcontinue_sniffr7   )Ú
close_piperc   r7   r8   Ústop_cb§  s    

z"AsyncSniffer._run.<locals>.stop_cbc                      s
   dˆ _ d S r  )r3  r7   rj   r7   r8   r5  ¯  s    z It was closed.z close() failed with '%s'zSocket %s failed with '%s'.r®   r@   ).r  r‘   r   rƒ   r„   rR   Úupdater{   Údictr   Ú	iteritemsr×   r’   Úallr   r   r    r   r   r	   rŸ   r   rã   Úiterr/  Úgetattrr
   Zscapy.automatonr2  r5  r3  rp   Úkeysr4   ÚEOFErrorr    rs   rn   Zdebug_dissectorÚ
sniffed_onZon_packet_receivedr—   r^   r‰   ZtoPacketListrk   )rc   r—   r„   Úoffliner"  rƒ   Zlfilterr'  rK   r…   Zstop_filterrŸ   r†   rL   Zsession_kwargsr-  Zsniff_socketsZ_main_socketr.  r2  r5  Zstoptimerf   ÚsocketsZdead_socketsr”   r>   Úexrÿ   Zex2r7   )r'  r,  r4  r!  r-  r"  r1  rc   r8   rˆ   (  s,   
ÿ

þ


þ




ÿù
ù
úüÿùüþý
ý
ÿÿ







ÿ
$


ÿ
ÿ
ÿ
zAsyncSniffer._runc                 C   s   |   ¡  | jr| j ¡  dS )z!Starts AsyncSniffer in async modeN)r  r  rX   rj   r7   r7   r8   rX   ý  s    zAsyncSniffer.startc                 C   sP   | j rDz|  ¡  W n ty,   tdƒ‚Y n0 |r@|  ¡  | jS dS tdƒ‚dS )z'Stops AsyncSniffer if not in async modez+Unsupported (offline or unsupported socket)Nz#Not running ! (check .running attr))r  r5  rv   r   rZ   rk   )rc   rZ   r7   r7   r8   rY     s    ÿ
zAsyncSniffer.stopc                 O   s   | j r| j j|i |¤Ž d S ri   )r  rZ   r  r7   r7   r8   rZ     s    zAsyncSniffer.join)T)
r1   r2   r3   r‹   rh   r  rˆ   rX   rY   rZ   r7   r7   r7   r8   r‡   Õ  s,   >	ò
 V
r‡   c                  O   s"   t ƒ }|j| i |¤Ž tt|jƒS ri   )r‡   rˆ   r*   r   rk   )rŒ   r�   r~   r7   r7   r8   Úsniff  s    rB  c                    sÆ   dD ]}||v rt  d|¡ ||= q|fdd„}	|	| dƒ\}
} |	|dƒ\}}| |||
i‰ i ‰|durl|ˆ| < |dur||ˆ|< ‡ ‡fdd	„‰|du r˜ˆ}n|‰‡‡fd
d„}t||
| ||i|dœ|¤ŽS )aØ  Forward traffic between interfaces if1 and if2, sniff and return
    the exchanged packets.

    :param if1: the interfaces to use (interface names or opened sockets).
    :param if2:
    :param xfrm12: a function to call when forwarding a packet from if1 to
        if2. If it returns True, the packet is forwarded as it. If it
        returns False or None, the packet is discarded. If it returns a
        packet, this packet is forwarded instead of the original packet
        one.
    :param xfrm21: same as xfrm12 for packets forwarded from if2 to if1.

    The other arguments are the same than for the function sniff(),
    except for offline, opened_socket and iface that are ignored.
    See help(sniff) for more.
    )r…   r?  rŸ   z@Argument %s cannot be used in bridge_and_sniff() -- ignoring it.c                 S   sB   t | tƒr| d| fS |s0t| p$tjƒ} |  ¡ }|| d�| fS d S )Nziface%dr¤   )r‘   r   r   r	   rŸ   r¨   )rŸ   r—   r'  r7   r7   r8   Ú_init_socketG  s    
z&bridge_and_sniff.<locals>._init_socketr@   r®   Nc              	      sÒ   zˆ | j pd }W n ty&   Y d S 0 | j ˆv r�zˆ| j  | ƒ}W n, typ   tjd|  ¡ | j dd� Y d S 0 t|tƒrŠ|s„d S | }q”|}n| }z| |¡ W n* tyÌ   tjd|  ¡ | j dd� Y n0 d S )NÚ zOException in transformation function for packet [%s] received on %s -- droppingT)Úexc_infoz)Cannot forward packet [%s] received on %s)	r>  ÚKeyErrorrs   r   r
   rò   r‘   Úboolro   )rd   ZsendsockZ_newpktZnewpkt)ÚpeersÚxfrmsr7   r8   Úprn_send\  s2    
ý
ÿz"bridge_and_sniff.<locals>.prn_sendc                    s   ˆ| ƒ ˆ | ƒS ri   r7   ©rd   )Úprn_origrJ  r7   r8   rƒ     s    zbridge_and_sniff.<locals>.prn)r…   rƒ   )r   r
   rB  )Zif1Zif2Zxfrm12Zxfrm21rƒ   r'  rŒ   rš   ÚargrC  Zsckt1Zsckt2r7   )rH  rL  rJ  rI  r8   Úbridge_and_sniff&  s4    ÿþ
ÿÿrN  c                     s�   d|v r|  d¡}n"d|v r0tt|  d¡ƒj}ntj}td| ƒ dg‰ ‡ fdd„}t| |ddœ|¤Ž td	ˆ d ˆ d d
kr‚dndf ƒ dS )z|Sniff packets and print them calling pkt.summary().
    This tries to replicate what text-wireshark (tshark) would look likerŸ   r…   zCapturing on '%s'r   c                    s,   t dˆ d |  ¡ f ƒ ˆ d  d7  < d S )Nz%5d	%sr   r@   )r_   rò   rK  r&  r7   r8   Ú_cbš  s    ztshark.<locals>._cbFr  z
%d packet%s capturedr@   r”   rD  N)r×   r*   r   rŸ   r	   r_   rB  )rŒ   rš   rŸ   rO  r7   r&  r8   Útsharkˆ  s    rP  )r   r   NNFF)r   r   NNNFFN)N)NNN)NNFNFNNF)NNNr   )r   NNFN)NNNN)NNNr   )NNNNN)NNNr   )NNNN)br‹   Ú
__future__r   r   r[   Ú	threadingr   r   r|   rÕ   r±   rp   Zscapy.compatr   Z
scapy.datar   Zscapy.configr	   Zscapy.errorr
   Zscapy.interfacesr   r   r   Zscapy.packetr   Zscapy.utilsr   r   r   r   r   r   Zscapy.plistr   r   r   r   r   r   Zscapy.base_classesr   r   Z
scapy.libsr   Zscapy.sessionsr   Zscapy.supersocketr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r©   Zscapy.routeZscapyr-   Z_DOC_SNDRCV_PARAMSZ_GlobSessionTypeÚobjectr9   rŽ   rž   r¢   ÚcommandsÚregisterro   r«   rÁ   r¸   r§   rë   rí   rï   rð   Zsr_funcr   r  r  r  r  r  r  r  r  r‡   rB  rN  rP  r7   r7   r7   r8   Ú<module>   s$   0 _      ù
B        ÷
 ÿ   ý!        øI9    ü
ú
ø
F

)     ú
    ü    ü     û    ü  H
    ûa