a
    kÄ#d�* ã                   @   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ZddlmZ ddl	m
Z
mZmZmZmZ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mZmZmZmZmZ ddlm Z m!Z!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. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZK ddlLmMZMmNZNmOZOmPZPmQZQ ddlRmSZSmTZT ddlUmVZVmWZWmXZX ddlYmZZZm[Z[ ddl\m]Z]m^Z^ ddl_m`Z` ddlaZbddlcmd  meZe G dd„ defƒZgdddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/œZhG d0d1„ d1eHƒZiG d2d3„ d3eHƒZjG d4d5„ d5ejƒZkG d6d7„ d7ejƒZlG d8d9„ d9ejƒZmG d:d;„ d;ejƒZnG d<d=„ d=enƒZoG d>d?„ d?enƒZpG d@dA„ dAejƒZqG dBdC„ dCejƒZrG dDdE„ dEerƒZsG dFdG„ dGejƒZtG dHdI„ dIejƒZuG dJdK„ dKejƒZvG dLdM„ dMejƒZwG dNdO„ dOejƒZxdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^œdd_d`dadbdcdddedfdgdhdidjdkdlœfZyG dmdn„ dneHƒZzdodp„ Z{G dqdr„ dreQƒZ|G dsdt„ dteBƒZ}G dudv„ dve;ƒZ~G dwdx„ dxe:e5ƒZG dydz„ dzeHegƒZ€d{d|„ Z�d}d~„ Z‚dd€„ Zƒd�d‚„ Z„dƒd„„ Z…d…d†„ Z†G d‡dˆ„ dˆeHƒZ‡G d‰dŠ„ dŠeHƒZˆd‹dŒd�dŽd�d�d‘d’d“d”d•d–d—d˜d™d'dšd›dœd�dždŸd d¡d¢d£d¤œZ‰d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´œdµd¶d·d¸d¹œdºd»d¼œd½d¾d¼œd¿dÀdÁdÂdÃdÄdÅœdÆœZŠg dÇ¢Z‹G dÈdÉ„ dÉeHƒZŒG dÊdË„ dËe€ƒZ�G dÌdÍ„ dÍe‡ƒZŽG dÎdÏ„ dÏeˆƒZ�G dÐdÑ„ dÑeŒƒZ�eIe e€dÒdÓ� eIe#e€dÒdÔ� eIe$e€dÒdÔ� eIe%e€dÒdÕ� eJe&e€ddÓ� eIe&e€ej‘dÓ� eIe�e�ddbdÖ� eIe�e�dd_dÖ� eIe�eŽdd×dÖ� eIe�e�ddØdÖ� eIe€e€ddbdÖ� eIe€eŒdd_dÖ� eIe€e‡dd×dÖ� eIe€eˆddØdÖ� eIe€e$ddÙdÖ� e.j’ “ee€¡ e.j’ ”ee€¡ e.j’ “ee€¡ e.j• “ee€¡ e.j• ”ee€¡ dÚdÛ„ Z–e.j— ˜e e€e–¡ e.j— ˜e!e€e–¡ e.j™j“�ddÝdÞ„ƒZše.j™j“�ddßdà„ƒZ›dádâ„ Zœ�ddädå„Z�e.j™j“dædç„ ƒZže.j™j“dèdé„ ƒZŸdêdë„ Z e eV_¡G dìdí„ díeXƒZ¢e.j™j“dîd_dïeMƒ ddd`dfdðd'„ƒZ£e.j™j“dñdò„ ƒZ¤G dódô„ dôeZƒZ¥e.j™j“dõdö„ ƒZ¦e.j™j“d÷dø„ dùdø„ fdúdû„ƒZ§e.j™j“�ddþdÿ„ƒZ¨e.j™j“�d	�d�d„ƒZ©G �d�d„ �deƒZªe. j«e‡eˆeŒg7  _«e. j¬e‡eˆeŒg7  _¬e.j­�ràddl®ZbdS (
  z
IPv4 (Internet Protocol v4).
é    N)Údefaultdict)ÚchecksumÚdo_graphÚincremental_labelÚlinehexdumpÚstrxorÚwhoisÚcolgen)ÚAnsweringMachine)ÚGenÚNet)ÚETH_P_IPÚ	ETH_P_ALLÚDLT_RAWÚDLT_RAW_ALTÚDLT_IPV4Ú	IP_PROTOSÚTCP_SERVICESÚUDP_SERVICES)ÚEtherÚDot3Ú
getmacbyipÚCookedLinuxÚGREÚSNAPÚLoopback)ÚrawÚchbÚorbÚbytes_encodeÚOptional)Úconf)ÚBitEnumFieldÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚ	DestFieldÚEmphÚFieldLenFieldÚFieldListFieldÚ
FlagsFieldÚIPFieldÚIntFieldÚMultiEnumFieldÚMultipleTypeFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚSourceIPFieldÚStrFieldÚStrFixedLenFieldÚStrLenFieldÚ
XByteFieldÚXShortField)ÚPacketÚbind_layersÚbind_bottom_upÚ	NoPayload)Ú	RandShortÚRandIntÚRandBinÚRandNumÚVolatileValue)ÚsrÚsr1)Ú_PacketListÚ
PacketListÚ
SndRcvList)Ú	AutomatonÚATMT)Úlog_runtimeÚwarning)Ú	inet_ptonc                   @   s4   e Zd ZdZg Zdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚIPToolsz3Add more powers to a class with an "src" attribute.c                 C   s   t t| jƒ dd¡ƒ dS )z%whois the source and print the outputÚutf8ÚignoreN)Úprintr   ÚsrcÚdecode©Úself© rT   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/inet.pyr   J   s    zIPTools.whoisc                 C   s   t | tjjjƒr| jS | jS )z0Returns ttl or hlim, depending on the IP version)Ú
isinstanceÚscapyÚlayersÚinet6ÚIPv6ÚhlimÚttlrR   rT   rT   rU   Ú_ttlN   s    zIPTools._ttlc                 C   s,   t g d¢|  ¡ g ƒ}|| |  ¡ ¡d  S )N)é    é@   é€   éÿ   é   )Úsortedr]   Úindex)rS   ÚtrT   rT   rU   ÚottlR   s    zIPTools.ottlc                 C   s   |   ¡ |  ¡  S ©N)rf   r]   rR   rT   rT   rU   ÚhopsV   s    zIPTools.hopsN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r]   rf   rh   rT   rT   rT   rU   rL   F   s   rL   Zend_of_listZnopÚsecurityZloose_source_routeÚ	timestampZextended_securityZcommercial_securityZrecord_routeZ	stream_idZstrict_source_routeZexperimental_measurementZ	mtu_probeZ	mtu_replyZflow_controlZaccess_controlÚencodeZimi_traffic_descriptorZextended_IPÚ
tracerouteZaddress_extensionZrouter_alertZ!selective_directed_broadcast_modeZdynamic_packet_stateZupstream_multicast_packetZquick_startZrfc4727_experiment)r   rb   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   c                   @   s8   e Zd Zedddƒeddddddœƒed	dd
eƒgZdS )Ú_IPOption_HDRÚ	copy_flagr   rb   Úoptclassrr   ÚcontrolÚdebug)r   rr   Úoptionru   N)ri   rj   rk   r#   r"   Ú_ip_options_namesÚfields_descrT   rT   rT   rU   rŠ   w   s   
þrŠ   c                   @   s`   e Zd ZdZeedddddd„ d�edd	d
d„ d�gZdd„ Zi Z	e
dd„ ƒZe
ddd„ƒZdS )ÚIPOptionz	IP OptionÚlengthNÚBÚvaluec                 C   s   |d S ©Nrr   rT   ©ÚpktÚlrT   rT   rU   Ú<lambda>�   ó    zIPOption.<lambda>©ÚfmtZ	length_ofÚadjustÚ c                 C   s
   | j d S r–   ©r“   ©r˜   rT   rT   rU   rš   ‚   r›   ©Zlength_fromc                 C   s   d|fS )Nr›   rT   )rS   ÚprT   rT   rU   Úextract_padding„   s    zIPOption.extract_paddingc                 C   s   | | j | jj< d S rg   )Úregistered_ip_optionsr�   Údefault)ÚclsrT   rT   rU   Úregister_variant‰   s    zIPOption.register_variantc                 O   s,   |r(t |d ƒd@ }|| jv r(| j| S | S )Nr   é   )r   r¥   )r§   r˜   ÚargsÚkargsÚoptrT   rT   rU   Údispatch_hook�   s
    

zIPOption.dispatch_hook)N)ri   rj   rk   ÚnamerŠ   r)   r6   r‘   r¤   r¥   Úclassmethodr¨   r­   rT   rT   rT   rU   r’   }   s   ÿý
r’   c                   @   s   e Zd ZdZdZegZdS )ÚIPOption_EOLzIP Option End of Options Listr   N©ri   rj   rk   r®   r�   rŠ   r‘   rT   rT   rT   rU   r°   –   s   r°   c                   @   s   e Zd ZdZdZegZdS )ÚIPOption_NOPzIP Option No Operationrb   Nr±   rT   rT   rT   rU   r²   œ   s   r²   c                	   @   sH   e Zd ZdZdZdZeeddƒeddƒeddƒed	dƒe	d
ddƒgZ
dS )ÚIPOption_SecurityzIP Option Securityrb   rr   r“   r{   rn   r   ZcompartmentZhandling_restrictionsZtransmission_control_codeZxxxrs   N)ri   rj   rk   r®   r‹   r�   rŠ   r%   r2   r5   r‘   rT   rT   rT   rU   r³   ¢   s   
ûr³   c                	   @   sV   e Zd ZdZdZeedddddd„ d	�ed
dƒedg e	ddƒdd„ d�gZ
dd„ ZdS )ÚIPOption_RRzIP Option Record Routerw   r“   Nr”   Úroutersc                 C   s   |d S ©Nrs   rT   r—   rT   rT   rU   rš   ´   r›   zIPOption_RR.<lambda>rœ   Úpointerrt   rŸ   ú0.0.0.0c                 C   s
   | j d S r¶   r    r¡   rT   rT   rU   rš   ·   r›   r¢   c                 C   s   | j | jd d  S )Nrt   rb   )rµ   r·   rR   rT   rT   rU   Úget_current_routerº   s    zIPOption_RR.get_current_router)ri   rj   rk   r®   r�   rŠ   r)   r%   r*   r,   r‘   r¹   rT   rT   rT   rU   r´   ¯   s   ÿÿür´   c                   @   s   e Zd ZdZdZdZdS )ÚIPOption_LSRRz'IP Option Loose Source and Record Routerb   rs   N©ri   rj   rk   r®   r‹   r�   rT   rT   rT   rU   rº   ¾   s   rº   c                   @   s   e Zd ZdZdZdZdS )ÚIPOption_SSRRz(IP Option Strict Source and Record Routerb   ry   Nr»   rT   rT   rT   rU   r¼   Ä   s   r¼   c                   @   s.   e Zd ZdZdZdZeeddƒeddƒgZ	dS )	ÚIPOption_Stream_IdzIP Option Stream IDrb   rx   r“   rt   rn   r   N)
ri   rj   rk   r®   r‹   r�   rŠ   r%   r2   r‘   rT   rT   rT   rU   r½   Ê   s   þr½   c                   @   s*   e Zd ZdZdZeeddƒeddƒgZdS )ÚIPOption_MTU_ProbezIP Option MTU Prober{   r“   rt   Zmtur   N)	ri   rj   rk   r®   r�   rŠ   r%   r2   r‘   rT   rT   rT   rU   r¾   Ó   s   þr¾   c                   @   s   e Zd ZdZdZdS )ÚIPOption_MTU_ReplyzIP Option MTU Replyr|   N)ri   rj   rk   r®   r�   rT   rT   rT   rU   r¿   Û   s   r¿   c                   @   sB   e Zd ZdZdZeeddƒeddƒeddƒeddƒed	d
ƒgZ	dS )ÚIPOption_TraceroutezIP Option Tracerouter‚   r“   r|   Úidr   Zoutbound_hopsZreturn_hopsZoriginator_ipr¸   N)
ri   rj   rk   r®   r�   rŠ   r%   r2   r,   r‘   rT   rT   rT   rU   rÀ   à   s   ûrÀ   c                   @   sn   e Zd ZdZdZdZeeddƒeddƒedd	dƒe	d
ddddddœƒe
eddƒdd„ ƒedd	ƒgZdd„ ZdS )ÚIPOption_TimestampzIP Option Timestamprr   rt   r“   Nr·   ry   Zoflwr   Úflgrb   Ztimestamp_onlyZtimestamp_and_ip_addrZprespecified_ip_addr)r   rb   rs   Zinternet_addressr¸   c                 C   s
   | j dkS ©Nr   )rÃ   r¡   rT   rT   rU   rš   ø   r›   zIPOption_Timestamp.<lambda>ro   c                 C   s:   | j d u r2|d d… t dt|ƒ¡ |dd …  }|| S )Nrb   ú!Brr   )r“   ÚstructÚpackÚlen)rS   r£   ÚpayrT   rT   rU   Ú
post_buildû   s    
(zIPOption_Timestamp.post_build)ri   rj   rk   r®   rŒ   r�   rŠ   r%   r#   r"   r&   r,   r-   r‘   rÊ   rT   rT   rT   rU   rÂ   ë   s&   
þÿ
ÿörÂ   c                   @   s6   e Zd ZdZdZdZeeddƒeddƒeddƒgZ	d	S )
ÚIPOption_Address_ExtensionzIP Option Address Extensionrb   rƒ   r“   rz   Zsrc_extr¸   Zdst_extN)
ri   rj   rk   r®   r‹   r�   rŠ   r%   r,   r‘   rT   rT   rT   rU   rË     s   ýrË   c                   @   s4   e Zd ZdZdZdZeeddƒeddddiƒgZ	d	S )
ÚIPOption_Router_AlertzIP Option Router Alertrb   r„   r“   rt   Úalertr   Zrouter_shall_examine_packetN)
ri   rj   rk   r®   r‹   r�   rŠ   r%   r1   r‘   rT   rT   rT   rU   rÌ     s   þrÌ   c                   @   sJ   e Zd ZdZdZdZeedddddd	„ d
�edg e	ddƒdd	„ d�gZ
dS )ÚIPOption_SDBMz+IP Option Selective Directed Broadcast Moderb   r…   r“   Nr”   Ú	addressesc                 C   s   |d S r–   rT   r—   rT   rT   rU   rš     r›   zIPOption_SDBM.<lambda>rœ   rŸ   r¸   c                 C   s
   | j d S r–   r    r¡   rT   rT   rU   rš     r›   r¢   )ri   rj   rk   r®   r‹   r�   rŠ   r)   r*   r,   r‘   rT   rT   rT   rU   rÎ     s   ÿÿýrÎ   ©ÚEOLN©ÚNOPN)ÚMSSú!H)ÚWScalerÅ   )ÚSAckOKN)ÚSAckú!)Ú	Timestampú!II)Ú	AltChkSumz!BH)ÚAltChkSumOptN)ÚMD5Z16s)ÚMoodz!p)ÚUTOrÕ   )ÚAON)ÚTFOrÛ   )r   rb   rr   rs   rt   ru   rx   r~   r   rƒ   rˆ   é   é   é"   rb   rr   rs   rt   ru   rx   r~   r   rƒ   rˆ   rã   rä   rå   )rÑ   rÓ   rÔ   rÖ   r×   rØ   rÚ   rÜ   rÝ   rÞ   rß   rà   rá   râ   c                   @   s4   e Zd ZdZeddƒeddƒedddd„ d	�gZdS )
Ú
TCPAOValuezValue of TCP-AO optionZkeyidNZ
rnextkeyidÚmacrŸ   c                 C   s   t | jƒd S r–   )rÈ   Úoriginal©r£   rT   rT   rU   rš   I  r›   zTCPAOValue.<lambda>r¢   )ri   rj   rk   rl   r%   r6   r‘   rT   rT   rT   rU   ræ   D  s
   ýræ   c                 C   s$   | j D ]\}}|dkr|  S qdS )z%Get the TCP-AO option from the headerrá   N)Úoptions)ZtcphdrZoptidÚoptvalrT   rT   rU   Ú	get_tcpaoM  s    
rì   c                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚRandTCPOptionsNc                 C   s   |d u rt ddƒ}|| _d S )Nrb   ru   )r@   Úsize)rS   rî   rT   rT   rU   Ú__init__W  s    
zRandTCPOptions.__init__c           
      C   sÆ   dd„ t | jƒD ƒ}g }|D ]¤\}}|d u r<| |df¡ qt d|¡}g }|D ]\}d| }d|v sld|v r€ttt |¡ƒƒ}n"t |¡}	t	 
dd	d
|	  d ¡}| |¡ qP| |t|ƒf¡ q|S )Nc              
   S   s.   g | ]&}t  td d„ t td ¡D ƒƒ¡‘qS )c                 s   s"   | ]\}}|d kr||fV  qdS rÐ   rT   )Ú.0r¬   r�   rT   rT   rU   Ú	<genexpr>`  s   ÿz1RandTCPOptions._fix.<locals>.<listcomp>.<genexpr>r   )ÚrandomÚchoiceÚlistÚsixÚ
itervaluesÚ
TCPOptions)rð   Ú_rT   rT   rU   Ú
<listcomp>_  s   üÿz'RandTCPOptions._fix.<locals>.<listcomp>r›   z!?([bBhHiIlLqQfdpP]|\d+[spx])rÙ   Úsr£   r   rr   rx   rb   )Úrangerî   ÚappendÚreÚfindallÚbytesr?   rÆ   Úcalcsizerò   ÚrandintÚtuple)
rS   Zrand_patternsZ	rand_valsÚonamer�   ÚstructsÚrvalZstruÚvÚ_sizerT   rT   rU   Ú_fix\  s$    û
zRandTCPOptions._fixc                 C   s   t  d d |  ¡ ¡S rg   )ÚTCPOptionsFieldÚi2mr  rR   rT   rT   rU   Ú	__bytes__y  s    zRandTCPOptions.__bytes__)N)ri   rj   rk   rï   r  r  rT   rT   rT   rU   rí   V  s   
rí   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )r	  rb   c                 C   sH   |j d d }|dk r(t d|j ¡ d}||d … |  ||d |… ¡fS )Nru   rt   r   z$bad dataofs (%i). Assuming dataofs=5)ÚdataofsrI   ÚinfoÚm2i)rS   r˜   rú   ZopszrT   rT   rU   Úgetfield€  s    ÿzTCPOptionsField.getfieldc           	      C   sN  g }|�rJt |d ƒ}|dkr,| d¡ �qJ|dkrL| d¡ |dd … }qzt |d ƒ}W n tyr   d}Y n0 |dk rŒt d|¡ d}|d|… }|td v �r.td | \}}|dkrÒ|dt|ƒd	  7 }|d
krât|ƒ}|�rt 	|¡t|ƒk�rt 
||¡}t|ƒdk�r|d }| ||f¡ n| ||f¡ ||d … }q|S )Nr   rÐ   rb   rÒ   rr   z-Malformed TCP option (announced length is %i)ru   ú%iIrt   rä   )r   rü   Ú
IndexErrorrI   r  r÷   rÈ   ræ   rÆ   r   Úunpack)	rS   r˜   Úxr¬   ÚonumÚolenÚovalr  ÚofmtrT   rT   rU   r  ‰  sD    


ÿzTCPOptionsField.m2ic                 C   s   |sg S |S rg   rT   ©rS   r˜   r  rT   rT   rU   Úi2h®  s    zTCPOptionsField.i2hc           	      C   sŠ  d}|D �]b\}}dddœ  ||¡}t|tƒrü|dkrB|d7 }qn¸|dkrV|d7 }qn¤|td v rîtd | }td | d }|d	kr–|d
t|ƒ 7 }t|ttfƒ }|d urÜ|sºd|v rÜt|tƒsÊ|f}tj|g|¢R Ž }|dkrút|ƒ}nt	d|ƒ qn<|}t|t
ƒ�st	d| ƒ qt|ttfƒ�s8t	d| ƒ qt|tƒ�rLt|ƒ}|t|ƒtdt|ƒ ƒ | 7 }q|ddt|ƒd d    S )Nr›   rÑ   rÓ   ©r   rb   ó   ó    rb   r   ru   r  rú   rä   zOption [%s] unknown. Skipped.zInvalid option number [%i]zOption [%i] is not bytes.rr   rs   rt   )ÚgetrV   Ústrr÷   rÈ   rÿ   r  rÆ   rÇ   rJ   Úintr   r   )	rS   r˜   r  r¬   r  r  r  r  Z_test_isinstancerT   rT   rU   r
  ³  sF    



"zTCPOptionsField.i2mc                 C   s   t ƒ S rg   )rí   rR   rT   rT   rU   ÚrandvalÛ  s    zTCPOptionsField.randvalN)	ri   rj   rk   Zislistr  r  r  r
  r   rT   rT   rT   rU   r	  }  s   	%(r	  c                   @   s&   e Zd Ze d¡Zdd„ Zdd„ ZdS )ÚICMPTimeStampFieldzM([0-2]?[0-9])[Hh:](([0-5]?[0-9])([Mm:]([0-5]?[0-9])([sS:.]([0-9]{0,3}))?)?)?$c                 C   sN   |d u rdS t |dƒ\}}t |dƒ\}}t |dƒ\}}d|||t|ƒf S d S )Nz--éè  é<   z%d:%d:%d.%d)Údivmodr  )rS   r˜   ÚvalÚsecZmilliÚminÚhourrT   rT   rU   Úi2reprâ  s    zICMPTimeStampField.i2reprc           	      C   s    t |tƒr€| j |¡}|rz| ¡ \}}}}}}}t|p8dd d d… ƒ}t|ƒd t|pZdƒ d t|pjdƒ d | }qœd}n|d u rœtt ¡ d d ƒ}|S )NrŸ   Z000rs   r#  r   r"  i€Q )rV   r  Úre_hmsmÚmatchÚgroupsr  Útime)	rS   r˜   r%  ZhmsmsÚhrø   Úmrú   ÚmsrT   rT   rU   Úany2ië  s    
2zICMPTimeStampField.any2iN)ri   rj   rk   rý   Úcompiler*  r)  r1  rT   rT   rT   rU   r!  ß  s   
	r!  c                   @   s(   e Zd Zi Zdd„ Zdd„ Zdd„ ZdS )ÚDestIPFieldc                 C   s    t  | |d ¡ t | ||¡ d S rg   )r,   rï   r'   )rS   r®   r¦   rT   rT   rU   rï   ü  s    zDestIPField.__init__c                 C   s    |d u r|   |¡}t | ||¡S rg   )Údst_from_pktr,   r
  r  rT   rT   rU   r
     s    
zDestIPField.i2mc                 C   s    |d u r|   |¡}t | ||¡S rg   )r4  r,   r  r  rT   rT   rU   r    s    
zDestIPField.i2hN)ri   rj   rk   Zbindingsrï   r
  r  rT   rT   rT   rU   r3  ù  s   r3  c                   @   sÞ   e Zd ZdgZd Zedddƒedddƒeddƒeddƒed	d
ƒedddg d¢ƒedddƒe	ddƒe
ddeƒeddƒeeddƒƒeeddƒƒedg edd„ d�gZdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd*d(d)„ZdS )+ÚIPÚ_defrag_posÚversionrt   ÚihlNZtosr   rÈ   rÁ   rb   Úflagsrs   )ÚMFZDFZevilÚfragr}   r\   r_   ÚprotoÚchksumrP   Údstz	127.0.0.1rê   c                 C   s   | j d d S )Nrt   r„   )r8  ré   rT   rT   rU   rš     r›   zIP.<lambda>r¢   c                 C   sÞ   | j }|dt|ƒ d  7 }|d u rVt|ƒd }t| jd@ d> |d@ B ƒ|dd …  }| jd u r”t|ƒt|ƒ }|d d… t d|¡ |dd …  }| jd u rÖt|ƒ}|d d… t|d? ƒ t|d	@ ƒ |d
d …  }|| S )Nr  rt   r   rb   rr   rÕ   rz   rx   ra   r|   )r8  rÈ   r   r7  rÆ   rÇ   r=  r   )rS   r£   rÉ   r8  Útmp_lenÚckrT   rT   rU   rÊ     s    &
$
0zIP.post_buildc                 C   s8   | j | jd>  }|dk r |dfS |d |… ||d … fS )Nrr   r   r›   )rÈ   r8  ©rS   rú   r?  rT   rT   rU   r¤   +  s    zIP.extract_paddingc                 C   s:   | j }t|tƒrtt|ƒƒ}tjd u r.dd l}tj |¡S rÄ   )r>  rV   r   ÚnextÚiterr!   ÚrouteZscapy.route)rS   r>  rW   rT   rT   rU   rD  1  s    

zIP.routec                 C   sÆ   | j tjkr0t| jtƒr0| jjdv r0| jj ¡ S tj	sJ| j dv rJ| j ¡ S | j
dkrlt d| j ¡| j ¡  S tjr®tjr®tttj| jƒttj| j
ƒƒt d| j ¡ | j ¡  S t d| j ¡| j ¡  S )N©rs   rt   ru   r{   r|   ©rt   é)   ú224.0.0.251r”   )r<  ÚsocketÚIPPROTO_ICMPrV   ÚpayloadÚICMPÚtypeÚhashretr!   ÚcheckIPinIPr>  rÆ   rÇ   Ú
checkIPsrcÚcheckIPaddrr   rK   ÚAF_INETrP   rR   rT   rT   rU   rN  :  s&    
ÿ
þ

ÿþþz
IP.hashretc                 C   s  t jsh| jdv r| j |¡S t|tƒr<|jdv r<|  |j¡S t jrht|tj	j
jƒrh|jdv rh|  |j¡S t|tƒsvdS t jr®|jdkrž| jdkrž| j |j¡S | j|jkr®dS | jtjkràt| jtƒrà| jjdv rà| jj |¡S t jrô| j|jk�s| j|jk�rdS | j |j¡S d S )NrF  r   rH  rE  )r!   rO  r<  rK  ÚanswersrV   r5  Úipv6_enabledrW   rX   rY   rZ   ZnhrQ  r>  rP   rI  rJ  rL  rM  ©rS   ÚotherrT   rT   rU   rS  I  s:    
ÿþ

ÿ
þ
ÿz
IP.answersc                 C   s"   |   d¡}| jr|d| j 7 }|S )Nz%IP.src% > %IP.dst% %IP.proto%z frag:%i)Úsprintfr;  )rS   rú   rT   rT   rU   Ú	mysummaryf  s    
zIP.mysummaryéÈ  c                 C   sF  |}||d 8 }g }d}| }|j dur6|d7 }|j }q|D �]}t|| jƒ}t|ƒ|krf| |¡ q:t|ƒ| | d | d }t|ƒD ]´}	| ¡ }
|
| `|
| `|
| `|	|d krÚ|
|  jdO  _|	d | }n|	| | }|
|  j	|	| d 7  _	t
j||	| |… d�}|| jj ¡ |_|
 |¡ | |
¡ qŠq:|S )zFragment IP datagramsrx   r   Nrb   ©Úload)Ú
underlayerr   rK  rÈ   rü   rû   Úcopyr=  r9  r;  r!   Ú	raw_layerÚoverload_fieldsÚadd_payload)rS   ÚfragsizeÚ
lastfragszÚlstZfnbÚflr£   rú   ÚnbÚiÚqÚfragendÚrrT   rT   rU   Úfragmentl  s:    



zIP.fragment)rY  )ri   rj   rk   rm   r®   r#   r7   r2   r+   r%   r$   r   r8   r(   r3   r3  r0   r’   r‘   rÊ   r¤   rD  rN  rS  rX  rj  rT   rT   rT   rU   r5    s.   



ó	r5  c           	      C   sê   |j durb|jdu rFtdd„ |jD ƒƒ}d|d  |d r>dnd }n|j}t|j d|  dƒ}n|}dd	„ |jD ƒ}t |ƒ}|dkr¦t |d jƒr¦|d jd
 |_n|dkrÄd}|d7 }t||ƒ t 	dt
tj|jƒt
tj|jƒ| |¡S )zÁIPv4 Pseudo Header as defined in RFC793 as bytes

    :param proto: value of upper layer protocol
    :param u: IP layer instance
    :param plen: the length of the upper layer and payload
    Nc                 s   s   | ]}t |ƒV  qd S rg   ©rÈ   ©rð   r  rT   rT   rU   rñ   š  r›   z#in4_pseudoheader.<locals>.<genexpr>ru   rt   rb   r   c                 S   s$   g | ]}t |tƒst |tƒr|‘qS rT   )rV   rº   r¼   )rð   r¬   rT   rT   rU   rù   £  s   
ÿz$in4_pseudoheader.<locals>.<listcomp>éÿÿÿÿz!Found %d Source Routing Options! z0Falling back to IP.dst for checksum computation.z!4s4sHH)rÈ   r8  Úsumrê   Úmaxrµ   r>  rJ   rÆ   rÇ   rK   rI  rR  rP   )	r<  ÚuÚplenr  r8  ÚlnZ
sr_optionsZlen_sr_optionsÚmessagerT   rT   rU   Úin4_pseudoheader�  s*    


ürt  c                 C   s2   t |tƒstdƒ dS t| |t|ƒƒ}t|| ƒS )zÈIPv4 Pseudo Header checksum as defined in RFC793

    :param nh: value of upper layer protocol
    :param u: upper layer instance
    :param p: the payload of the upper layer provided as a string
    ú3No IP underlayer to compute checksum. Leaving null.r   )rV   r5  rJ   rt  rÈ   r   )r<  rp  r£   ZpsdhdrrT   rT   rU   Ú
in4_chksum¶  s
    
rv  c                 C   s    t | tjjjƒpt | tjjjƒS rg   )rV   rW   rX   rY   rZ   Ú_IPv6ExtHdrré   rT   rT   rU   Ú_is_ipv6_layerÅ  s    ÿrx  c                 C   sj   t | jtƒr(tt| ƒƒ}ttj| j|ƒS tj	r^t
| jƒr^tt| ƒƒ}ttjj tj| j|¡ƒS tdƒ‚dS )z[Pseudoheader of a TCP packet as bytes

    Requires underlayer to be either IP or IPv6
    z.TCP packet does not have IP or IPv6 underlayerN)rV   r\  r5  rÈ   rÿ   rt  rI  ÚIPPROTO_TCPr!   rT  rx  r   rW   rX   rY   Zin6_pseudoheaderÚ
ValueError)Útcprq  rT   rT   rU   Útcp_pseudoheaderË  s    

ÿr|  c                 C   sf   ddl }| ¡ }t| ƒ}| t| ƒ¡ | |dd… ¡ | d¡ | |dd… ¡ | |¡ | ¡ S )z>Calculate TCP-MD5 hash from packet and return a 16-byte stringr   Nr€   s     r‚   )ÚhashlibÚmd5rÿ   Úupdater|  Údigest)r{  Úkeyr}  r.  Z	tcp_bytesrT   rT   rU   Úcalc_tcp_md5_hashÜ  s    

r‚  c                 C   s    t | |ƒ}| jd|fg | _dS )z&Append TCP-MD5 signature to tcp packetrÞ   N)r‚  rê   )r{  r�  ÚsigrT   rT   rU   Úsign_tcp_md5ì  s    
r„  c                   @   s˜   e Zd Zd Zeddeƒeddeƒeddƒeddƒedd	d
ƒedddƒeddddƒe	ddƒe
dd	ƒe	ddƒeddƒgZdd„ Zdd„ Zdd„ Zdd„ Zd	S )ÚTCPÚsportr„   ÚdportéP   Úseqr   Úackr  Nrt   Úreservedrs   r9  rr   ry   Z	FSRPAUECNÚwindowi    r=  Zurgptrrê   rŸ   c                 C   s>  ||7 }| j }|d u rzt|  d¡ | | j¡ƒ}d|d d  }|d> t|d ƒd@ B }|d d… t|d@ ƒ |dd …  }| jd u �r:t| j	t
ƒrÈttj| j	|ƒ}|d d	… t d
|¡ |dd …  }nrtjràt| j	tjjjƒsôt| j	tjjjƒ�r0tjj tj| j	|¡}|d d	… t d
|¡ |dd …  }n
t d¡ |S )Nrê   ru   rs   rt   r|   r   ra   r}   r€   rÕ   r‚   ru  )r  rÈ   Ú	get_fieldr
  rê   r   r   r=  rV   r\  r5  rv  rI  ry  rÆ   rÇ   r!   rT  rW   rX   rY   rZ   rw  Ú
in6_chksumrI   r  )rS   r£   rÉ   r  Zopt_lenr@  rT   rT   rU   rÊ     s$    $&,&ÿzTCP.post_buildc                 C   s2   t jr$t d| j| jA ¡| j ¡  S | j ¡ S d S )NÚH)r!   rP  rÆ   rÇ   r†  r‡  rK  rN  rR   rT   rT   rU   rN    s    zTCP.hashretc                 C   s¾   t |tƒsdS |jjrdS | jjr:| jjs.dS |jjs:dS tjr\| j|j	krX| j	|jks\dS |jjrl|jjr„t
|j| j ƒdkr„dS | jjr˜| jjs˜dS t
|j| j ƒdt|jƒ krºdS dS )Nr   rr   rb   )rV   r…  r9  ÚRÚSÚAr!   rP  r†  r‡  ÚabsrŠ  r‰  rÈ   rK  rU  rT   rT   rU   rS    s.    

ÿÿzTCP.answersc                 C   sJ   t | jtƒr| j d¡S tjr<t | jtjjj	ƒr<| j d¡S |  d¡S d S )Nz;TCP %IP.src%:%TCP.sport% > %IP.dst%:%TCP.dport% %TCP.flags%z?TCP %IPv6.src%:%TCP.sport% > %IPv6.dst%:%TCP.dport% %TCP.flags%z)TCP %TCP.sport% > %TCP.dport% %TCP.flags%)
rV   r\  r5  rW  r!   rT  rW   rX   rY   rZ   rR   rT   rT   rU   rX  ;  s
    zTCP.mysummary)ri   rj   rk   r®   r1   r   r-   r#   r+   r2   r8   r	  r‘   rÊ   rN  rS  rX  rT   rT   rT   rU   r…  ó  s"   



ör…  c                   @   s`   e Zd Zd ZeddeƒeddeƒeddƒeddƒgZdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ ZdS )ÚUDPr†  é5   r‡  rÈ   Nr=  c                 C   s  ||7 }| j }|d u rBt |ƒ}|d d… t d|¡ |dd …  }| jd u �rt| jtƒrœttj	| j|ƒ}|dkrvd}|d d… t d|¡ |dd …  }nxt| jt
jjjƒsÂt| jt
jjjƒ�r
t
jj tj	| j|¡}|dkräd}|d d… t d|¡ |dd …  }n
t d¡ |S )Nrt   rÕ   rv   r   iÿÿ  rx   ru  )rÈ   rÆ   rÇ   r=  rV   r\  r5  rv  rI  ÚIPPROTO_UDPrW   rX   rY   rZ   rw  rŽ  rI   r  )rS   r£   rÉ   r?  r@  rT   rT   rU   rÊ   K  s(    $&&&ÿzUDP.post_buildc                 C   s"   | j d }|d |… ||d … fS )Nrx   rk  rA  rT   rT   rU   r¤   d  s    
zUDP.extract_paddingc                 C   s
   | j  ¡ S rg   )rK  rN  rR   rT   rT   rU   rN  h  s    zUDP.hashretc                 C   s2   t |tƒsdS tjr$| j|jkr$dS | j |j¡S rÄ   )rV   r”  r!   rP  r‡  r†  rK  rS  rU  rT   rT   rU   rS  k  s    
zUDP.answersc                 C   sD   t | jtƒr| j d¡S t | jtjjjƒr6| j d¡S |  d¡S d S )Nz/UDP %IP.src%:%UDP.sport% > %IP.dst%:%UDP.dport%z3UDP %IPv6.src%:%UDP.sport% > %IPv6.dst%:%UDP.dport%zUDP %UDP.sport% > %UDP.dport%)rV   r\  r5  rW  rW   rX   rY   rZ   rR   rT   rT   rU   rX  s  s
    zUDP.mysummary)ri   rj   rk   r®   r1   r   r2   r8   r‘   rÊ   r¤   rN  rS  rX  rT   rT   rT   rU   r”  D  s   

ýr”  z
echo-replyzdest-unreachzsource-quenchÚredirectzecho-requestzrouter-advertisementzrouter-solicitationztime-exceededzparameter-problemztimestamp-requestztimestamp-replyzinformation-requestzinformation-responsezaddress-mask-requestzaddress-mask-replyzdatagram-conversion-errorzmobile-host-redirectzipv6-where-are-youzipv6-i-am-herezmobile-registration-requestzmobile-registration-replyzdomain-name-requestzdomain-name-replyÚskipZphoturis)r   rs   rt   ru   rx   ry   rz   r{   r|   r}   r~   r   r€   r�   r‚   r‰   r©   r^   é!   rå   é#   é$   é%   é&   é'   é(   znetwork-unreachablezhost-unreachablezprotocol-unreachablezport-unreachablezfragmentation-neededzsource-route-failedznetwork-unknownzhost-unknownznetwork-prohibitedzhost-prohibitedzTOS-network-unreachablezTOS-host-unreachablezcommunication-prohibitedzhost-precedence-violationzprecedence-cutoff)r   rb   rr   rs   rt   ru   rv   rw   ry   rz   r{   r|   r}   r~   r   znetwork-redirectzhost-redirectzTOS-network-redirectzTOS-host-redirect)r   rb   rr   rs   zttl-zero-during-transitzttl-zero-during-reassemblyr  zip-header-badzrequired-option-missingzbad-spizauthentication-failedzdecompression-failedzdecryption-failedzneed-authentificationzneed-authorization)r   rb   rr   rs   rt   ru   )rs   ru   r{   r|   rŸ  )
r   rx   r}   r~   r   r€   r�   r‚   rœ  r�  c                   @   sZ  e Zd Zd Zeddeƒeddedd„ dd�ed	d
ƒe	eddƒdd„ ƒe	eddƒdd„ ƒe	e
dd
ƒdd„ ƒe	e
dd
ƒdd„ ƒe	e
dd
ƒdd„ ƒe	eddƒdd„ ƒe	eddƒdd„ ƒe	eddƒdd„ ƒe	eddƒdd„ ƒe	eddƒdd„ ƒe	ed dƒd!d„ ƒeed"dƒd#d„ fed"dƒd$d„ fged"d%dd&�ƒgZd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd
S )1rL  rM  rx   Úcoder   c                 C   s   | j S rg   ©rM  r¡   rT   rT   rU   rš   ½  r›   zICMP.<lambda>r”   )Z
depends_onr�   r=  NrÁ   c                 C   s
   | j tv S rg   ©rM  Úicmp_id_seq_typesr¡   rT   rT   rU   rš   ¿  r›   r‰  c                 C   s
   | j tv S rg   r¢  r¡   rT   rT   rU   rš   À  r›   Zts_oric                 C   s
   | j dv S ©N©r}   r~   r¡  r¡   rT   rT   rU   rš   Á  r›   Zts_rxc                 C   s
   | j dv S r¤  r¡  r¡   rT   rT   rU   rš   Â  r›   Zts_txc                 C   s
   | j dv S r¤  r¡  r¡   rT   rT   rU   rš   Ã  r›   Zgwr¸   c                 C   s
   | j dkS )Nru   r¡  r¡   rT   rT   rU   rš   Ä  r›   Zptrc                 C   s
   | j dkS )Nr|   r¡  r¡   rT   rT   rU   rš   Å  r›   r‹  c                 C   s
   | j dv S )N)rs   r{   r¡  r¡   rT   rT   rU   rš   Æ  r›   r“   c                 C   s
   | j dv S )N)rs   r{   r|   r¡  r¡   rT   rT   rU   rš   Ç  r›   Z	addr_maskc                 C   s
   | j dv S )N©r�   r‚   r¡  r¡   rT   rT   rU   rš   È  r›   Z
nexthopmtuc                 C   s
   | j dkS r¶   r¡  r¡   rT   rT   rU   rš   É  r›   Zunusedc                 C   s
   | j dv S )N)r{   r|   r¡  r¡   rT   rT   rU   rš   Í  r›   c                 C   s
   | j dvS )N)r   rs   ru   rx   r{   r|   r}   r~   r   r€   r�   r‚   r¡  r¡   rT   rT   rU   rš   Ï  r›   rŸ   r    c                 C   sN   ||7 }| j d u rJt|ƒ}|d d… t|d? ƒ t|d@ ƒ |dd …  }|S )Nrr   rx   ra   rt   )r=  r   r   )rS   r£   rÉ   r@  rT   rT   rU   rÊ   Õ  s
    
0zICMP.post_buildc                 C   s0   | j tv r&t d| j| j¡| j ¡  S | j ¡ S )NZHH)rM  r£  rÆ   rÇ   rÁ   r‰  rK  rN  rR   rT   rT   rU   rN  Ü  s    
zICMP.hashretc                 C   s>   t |tƒsdS |j| jfdv r:| j|jkr:| j|jkr:dS dS )Nr   ))rx   r   r¥  )r   r€   r¦  )r™  rå   )rš  r›  )rœ  r�  rb   )rV   rL  rM  rÁ   r‰  rU  rT   rT   rU   rS  á  s    

ÿ
þzICMP.answersc                 C   s   | j dv rtS d S d S )NrE  )rM  ÚIPerror)rS   rK  rT   rT   rU   Úguess_payload_classê  s    
zICMP.guess_payload_classc                 C   s&   t | jtƒr| j d¡S |  d¡S d S )Nz0ICMP %IP.src% > %IP.dst% %ICMP.type% %ICMP.code%zICMP %ICMP.type% %ICMP.code%)rV   r\  r5  rW  rR   rT   rT   rU   rX  ð  s    zICMP.mysummary)ri   rj   rk   r®   r$   Ú	icmptypesr.   Ú	icmpcodesr8   r&   r!  r,   r%   r2   r/   r-   r5   r‘   rÊ   rN  rS  r¨  rX  rT   rT   rT   rU   rL  º  s>   
ÿÿýøò	rL  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r§  z
IP in ICMPc                 C   sŒ   t |tƒsdS tj p | j|jk}| j|jk}tj p@| j|jk}|tjoZ| jt 	|j¡kO }| j
|j
k}|rz|rz|rz|s~dS | j |j¡S rÄ   )rV   r5  r!   rP  rP   r>  Z	checkIPIDrÁ   rI  Úhtonsr<  rK  rS  )rS   rV  Z
test_IPsrcZ
test_IPdstZ	test_IPidZtest_IPprotorT   rT   rU   rS  ú  s    
zIPerror.answersc                 C   s
   t  | ¡S rg   ©r9   rX  rR   rT   rT   rU   rX    s    zIPerror.mysummaryN©ri   rj   rk   r®   rS  rX  rT   rT   rT   rU   r§  ÷  s   r§  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTCPerrorzTCP in ICMPc                 C   sn   t |tƒsdS tjr0| j|jkr,| j|jks0dS tjrj| jd urP| j|jkrPdS | jd urj| j|jkrjdS dS ©Nr   rb   )	rV   r…  r!   rP  r†  r‡  Zcheck_TCPerror_seqackr‰  rŠ  rU  rT   rT   rU   rS    s    

ÿ

zTCPerror.answersc                 C   s
   t  | ¡S rg   r¬  rR   rT   rT   rU   rX  %  s    zTCPerror.mysummaryNr­  rT   rT   rT   rU   r®    s   r®  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚUDPerrorzUDP in ICMPc                 C   s4   t |tƒsdS tjr0| j|jkr,| j|jks0dS dS r¯  )rV   r”  r!   rP  r†  r‡  rU  rT   rT   rU   rS  ,  s    

ÿzUDPerror.answersc                 C   s
   t  | ¡S rg   r¬  rR   rT   rT   rU   rX  5  s    zUDPerror.mysummaryNr­  rT   rT   rT   rU   r°  )  s   	r°  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	ICMPerrorzICMP in ICMPc                 C   s^   t |tƒsdS | j|jkr&| j|jks*dS | jdv rV| j|jkrP| j|jkrPdS dS ndS d S )Nr   )r   rx   r}   r~   r�   r‚   rb   )rV   rL  rM  r   rÁ   r‰  rU  rT   rT   rU   rS  <  s    

ÿ

ÿzICMPerror.answersc                 C   s
   t  | ¡S rg   r¬  rR   rT   rT   rU   rX  K  s    zICMPerror.mysummaryNr­  rT   rT   rT   rU   r±  9  s   r±  i   r¡  )r<  )r   )r;  r<  rv   r�   é/   c                 C   s
   t |jƒS rg   )r   r>  )Úl2Úl3rT   rT   rU   Úinet_register_l3g  s    rµ  rY  c                 C   s
  |}||d 8 }g }| D ]ì}t |t jƒ}t|ƒ| | d | d }t|ƒD ]´}| ¡ }|t `|t `|t `||d krž|t  jdO  _|d | }	n|| | }	|t  j|| d 7  _t	j
||| |	… d�}
|t jj ¡ |
_| |
¡ | |¡ qNq|S )zFragment a big IP datagramrx   rb   rZ  )r   r5  rK  rÈ   rû   r]  r=  r9  r;  r!   r^  r_  r`  rü   )r˜   ra  rb  rc  r£   rú   re  rf  rg  rh  ri  rT   rT   rU   rj  s  s*    
rj  c                 C   sX   |du r|}|   ¡ }|t `|t  |¡ t||ƒ}|d t  jdO  _|t| |ƒ S )zèBuild overlapping fragments to bypass NIPS

p:                the original packet
overlap:          the overlapping data
fragsize:         the fragment size of the packet
overlap_fragsize: the fragment size of the overlapping packetNrm  rb   )r]  r5  rK  r`  rj  r9  )r£   Úoverlapra  Zoverlap_fragsizerg  ZqfragrT   rT   rU   Úoverlap_fragŽ  s    	
r·  c           	      C   s²  | d }| d }|j dks"|jjr0| | ¡ dS | ¡ }tj|v rN|tj j`|t	 }|j
du sj|jdu rvt
|jƒ}n|j
|jd>  }t ¡ }| dd… D ]Ü}||j d> kræ||j d> krÖtd||j d> |||f ƒ | | ¡  �q®|t	 j
du �s|t	 jdu �r|t
|t	 jƒ7 }n||t	 j
|t	 jd>  7 }tj|v �rN|tj j`| |t	 j ¡ ¡ |j|jkrš|j|_qšd|j_|`|`
|| }td	d
„ | D ƒƒ|_| |¡ dS )z.Internal usage only. Part of the _defrag_logicr   rm  Nrr   rb   rs   z*Fragment overlap (%i > %i) %r || %r ||  %rFc                 s   s   | ]}|j V  qd S rg   ©r6  rl  rT   rT   rU   rñ   Æ  r›   z_defrag_list.<locals>.<genexpr>)r;  r9  r:  Úextendr]  r!   Úpadding_layerr\  rK  r5  rÈ   r8  r^  rJ   r`  r-  r=  ro  r6  rü   )	rc  ÚdefragÚmissfragr£   ZlastpÚipZc_lenÚtxtrg  rT   rT   rU   Ú_defrag_list¢  sB    


 
r¿  Fc                 C   sR  t dd„ ƒ}g }d}| D ]b}||_|d7 }t|v rp|t }|jdksL|jjrp|j|j|j|j	f}||  
|¡ q| 
|¡ qg }g }	t |¡D ] }
|
jdd„ d� t|
||	ƒ qŽg }|D ],}| t|ƒ¡}|j|_|j|_| 
|¡ q¸|�r8| |¡ | |	¡ |jdd„ d� t| dƒ�r(d	| j }nd
}t||d�S t|ƒt|ƒt|	ƒfS dS )z…Internal function used to defragment a list of packets.
    It contains the logic behind the defrag() and defragment() functions
    c                   S   s   g S rg   rT   rT   rT   rT   rU   rš   Î  r›   z_defrag_logic.<locals>.<lambda>r   rb   c                 S   s   | j S rg   )r;  ©r  rT   rT   rU   rš   ß  r›   )r�  c                 S   s   | j S rg   r¸  rÀ  rT   rT   rU   rš   ê  r›   ÚlistnamezDefragmented %sZDefragmented)r®   N)r   r6  r5  r;  r9  r:  rÁ   rP   r>  r<  rü   rõ   rö   Úsortr¿  Ú	__class__r   r-  r¹  ÚhasattrrÁ  rE   )ÚplistÚcompleteZfragsÚfinalÚposr£   r½  Zuniqr»  r¼  rc  Zdefrag2rg  r®   rT   rT   rU   Ú_defrag_logicÊ  sB    

rÉ  c                 C   s   t | dd�S )zpdefrag(plist) -> ([not fragmented], [defragmented],
                  [ [bad fragments], [bad fragments], ... ])F©rÆ  ©rÉ  ©rÅ  rT   rT   rU   r»  ô  s    r»  c                 C   s   t | dd�S )z<defragment(plist) -> plist defragmented as much as possible TrÊ  rË  rÌ  rT   rT   rU   Ú
defragmentû  s    rÍ  c              
      s  ddl m}m}m} ‡fdd„ˆjD ƒ}‡fdd„|D ƒ}g }tddƒ}	|D ]F}
|
 t¡j}|D ]0}|d dkr`| 	|
j
|	 d|d	 d ¡f¡ q`qL|s¤td
ƒ g S |d d ‰|d d	 ‰d‡‡fdd„	‰ ‡ fdd„|D ƒ}|i krê|}|j|fi |¤Ž}|�s
| ¡  |S )zOTries to graph the timeskew between the timestamps and real time for a given ipr   )ÚpltÚMATPLOTLIB_INLINEDÚMATPLOTLIB_DEFAULT_PLOT_KARGSc                 3   s   | ]}ˆ   |¡V  qd S rg   )Z_elt2pktrl  rR   rT   rU   rñ     r›   z-_packetlist_timeskew_graph.<locals>.<genexpr>c                 3   s0   | ](}t |v r|t  jˆ krt|v r|V  qd S rg   )r5  rP   r…  rl  )r½  rT   rU   rñ     r›   rŸ   NrÚ   rb   z"No timestamps found in packet listéÐ  c                    s,   | \}}|| }|ˆ  |ˆ d  }||fS )zWrap the list of tuples.g     @�@rT   )Zts_tupleZwrap_secondsÚctÚrtÚXÚY)Úfirst_creation_timeÚfirst_replied_timestamprT   rU   Ú
_wrap_data"  s    z._packetlist_timeskew_graph.<locals>._wrap_datac                    s   g | ]}ˆ |ƒ‘qS rT   rT   ©rð   Úe)rØ  rT   rU   rù   +  r›   z._packetlist_timeskew_graph.<locals>.<listcomp>)rÑ  )Úscapy.libs.matplotrÎ  rÏ  rÐ  Úresr!  Úgetlayerr…  rê   rü   r-  r1  rJ   ÚplotÚshow)rS   r½  r«   rÎ  rÏ  rÐ  ÚtmpÚbÚcZtsfr£   ÚoptsÚoÚdataÚlinesrT   )rØ  rÖ  r×  r½  rS   rU   Ú_packetlist_timeskew_graph  s.    
$	rç  c                   @   sb   e Zd Zg d¢Zddd„Zdd„ Zdd	„ Zddd„Zdd„ Zdd„ Z	ddd„Z
ejdfdd„ZdS )ÚTracerouteResult)ÚgraphdefÚgraphpaddingÚ
graphASresÚpaddingÚhlocÚnlocNÚ
Traceroutec                 C   s2   t  | |||¡ d | _d | _d| _d | _d | _d S rÄ   )rF   rï   ré  rë  rì  rí  rî  )rS   rÜ  r®   ÚstatsrT   rT   rU   rï   A  s    zTracerouteResult.__init__c                 C   s   |   dd„ ¡S )Nc                 S   s   |   d¡| j|  d¡fS )NzB%IP.dst%:{TCP:tcp%ir,TCP.dport%}{UDP:udp%ir,UDP.dport%}{ICMP:ICMP}z4%-15s,IP.src% {TCP:%TCP.flags%}{ICMP:%ir,ICMP.type%})rW  r\   )rú   ri  rT   rT   rU   rš   J  s   þz'TracerouteResult.show.<locals>.<lambda>)Z
make_tablerR   rT   rT   rU   rß  I  s    zTracerouteResult.showc              	   C   s¼   i }| j D ]L\}}t|vrq
|t j}||vr6i ||< |t jt|vf|| |t j< q
t |¡D ]T}ztdd„ t 	|¡D ƒƒ}W n t
y˜   Y qbY n0 t|ƒD ]}||kr¢||= q¢qb|S )Nc                 s   s   | ]\}}|d  r|V  qdS )rb   NrT   )rð   r  ÚyrT   rT   rU   rñ   Y  r›   z-TracerouteResult.get_trace.<locals>.<genexpr>)rÜ  r5  r>  rP   rL  r\   rõ   rö   r'  Ú	iteritemsrz  rô   )rS   Útracerú   ri  ÚdÚkr/  ZlirT   rT   rU   Ú	get_traceN  s"    
"

zTracerouteResult.get_traceTc                 C   s.   ddl }|j| jd�}| ¡  |r*| ¡  dS )a,  Give a 3D representation of the traceroute.
        right button: rotate the scene
        middle button: zoom
        shift-left button: move the scene
        left button on a ball: toggle IP displaying
        double-click button on a ball: scan ports 21,22,23,25,80 and 443 and display the resultr   N)Útarget)ÚmultiprocessingÚProcessÚtrace3D_notebookÚstartÚjoin)rS   rü  rø  r£   rT   rT   rU   Útrace3Da  s
    	zTracerouteResult.trace3Dc                    sº  |   ¡ }ddl‰G ‡fdd„dˆjƒ‰ ˆ ¡ ˆ_d| j ˆj_ˆj t 	ddt 	dd	d
¡¡¡ dˆj_
i }i }|D ]¬}|| }g ||< tdt|ƒd ƒD ]„}||vr¬g ||< ||v rô|| || vrÖ||  || ¡ ||  ||  || ¡¡ q˜||  d¡ ||  t|| ƒd ¡ q˜qr|D �]}|| }t|ƒ}t|ƒD ]â}|| d dk�rhˆ ddd¡}	n || d �r€ˆjj}	nˆjj}	ˆ ˆ |d ˆ d| ˆj | ¡ |d ˆ d| ˆj | ¡ d| ¡|| d |	d�}
t |¡D ]2}|t|ƒk�rî||d  |k�rî|
||d < �qî�qB�q$tddddƒ}t |¡D ]L}ˆjt|ƒŽ }	ˆ ddd¡}|D ]$}ˆj||j| |	dd� |j}�qf�qBˆ d¡ ‡ ‡fdd„}ˆj d|¡ dS )z7Same than trace3D, used when ran from Jupyter notebooksr   Nc                       sJ   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zd‡ fdd	„	Zd
d„ Zdd„ ZdS )z3TracerouteResult.trace3D_notebook.<locals>.IPspherec                    sL   ˆ j j| fi |¤Ž || _d | _|  | j¡ d | _d| _ˆ j| jj	Ž | _
d S ©NF)Úsphererï   r½  ÚlabelÚsetlabelÚlast_clickedÚfullÚvecÚcolorr•   Úsavcolor)rS   r½  r«   ©ÚvpythonrT   rU   rï   v  s    z<TracerouteResult.trace3D_notebook.<locals>.IPsphere.__init__c                    s�   d| _ ˆ  ddd¡| _tt| jd�tg d¢dd� ddd	�\}}t|ƒdkrXd
| j }n&d| j }|D ]\}}|| d¡7 }qf| j	|dd� d S )NTrb   r   ©r>  )r…   é   r†   rˆ   rˆ  i»  r‘  )r‡  r9  rr   ©ÚtimeoutÚverbosez%s:
no resultsz%s:
zh{TCP:%IP.src%:%TCP.sport% %TCP.flags%}{TCPerror:%IPerror.dst%:%TCPerror.dport% %IP.src% %ir,ICMP.type%}
)Úvisible)
r  r  r  rB   r5  r½  r…  rÈ   rW  r  )rS   Úará  r¾  rú   ri  r  rT   rU   Ú	fullinfos  s    *
z=TracerouteResult.trace3D_notebook.<locals>.IPsphere.fullinfosc                 S   s   | j | _d| _|  | j¡ d S rþ  )r  r  r  r  r½  rR   rT   rT   rU   Úunfull‹  s    z:TracerouteResult.trace3D_notebook.<locals>.IPsphere.unfullNc                    sP   | j d ur$|d u r| j j}d| j _n|d u r0d}ˆ j || j| jdd|d�| _ d S )Nr   rz   r„   )ÚtextrÈ  ÚspaceZxoffsetZyoffsetr  )r   r  rÈ  Úradius)rS   r¾  r  r  rT   rU   r  �  s    

z<TracerouteResult.trace3D_notebook.<locals>.IPsphere.setlabelc                 S   sh   zV| j s| jjs W t ¡ | _dS | jd urHt ¡ | j dk W t ¡ | _S W t ¡ | _dS t ¡ | _0 d S )NFg      à?)r  r   r  r-  r  rR   rT   rT   rU   Úcheck_double_click™  s    
û

ý
þzFTracerouteResult.trace3D_notebook.<locals>.IPsphere.check_double_clickc                 S   s"   | j  jdN  _| jr|  ¡  d S ©Nrb   )r   r  r  r  rR   rT   rT   rU   Úaction£  s    z:TracerouteResult.trace3D_notebook.<locals>.IPsphere.action)N)	ri   rj   rk   rï   r  r  r  r  r  rT   r  rT   rU   ÚIPsphereu  s   		
r  z!<center><u><b>%s</b></u></center>z\%(.*)\%z"<span style="color: red">\1</span>z\`(.*)\`z&<span style="color: #3399ff">\1</span>aÁ  <u><b>Commands:</b></u>
%Click% to toggle information about a node.
%Double click% to perform a quick web scan on this node.
<u><b>Camera usage:</b></u>
`Right button drag or Ctrl-drag` to rotate "camera" to view scene.
`Shift-drag` to move the object around.
`Middle button or Alt-drag` to drag up or down to zoom in or out.
  On a two-button mouse, `middle is wheel or left + right`.
Touch screen: pinch/extend to zoom, swipe or two-finger rotate.Trb   )Úunkrm  rm  g      è?rr   )rÈ  r½  r  g      ä?g      Ü?g      Ð?g      À?çš™™™™™É?)rÈ  Zaxisr  r  é2   c                    sN   | j dkrJˆjjj}|rJt|ˆ ƒrJ| ¡ rB|jdkr8d S | ¡  n| ¡  d S )NÚleftr  )	ZpressÚsceneÚmouseÚpickrV   r  r½  r  r  )Zevrä  ©r  r  rT   rU   Úmouse_clickõ  s    



z6TracerouteResult.trace3D_notebook.<locals>.mouse_clickZ	mousedown)rö  r  rÿ  Zcanvasr  rÁ  ÚtitleZappend_to_captionrý   ÚsubÚexitrû   ro  rü   rd   rÈ   r  r  ÚgreenÚblueÚcosÚpiÚsinrõ   rö   r	   rB  ZcylinderrÈ  ZrateÚbind)rS   ró  ZringsZtr3drf  Útrre   ri  r?  Úcolrú   ZtrlstZforecolrû  r½  r!  rT   r   rU   rú  p  st    3
ýýÿ

J
þ
z!TracerouteResult.trace3D_notebookc              
      sN  ddl m}m}m} zddl}ddl}W n  tyH   t d¡ g  Y S 0 t	j
s^t d¡ g S zddlm} W n  tyŽ   t d¡ g  Y S 0 |s¢t d¡ g S z|j t	j
¡}W n$ tyØ   t dt	j
¡ g  Y S 0 i }i }i }	| jD ]À\}
}d||j< |
 t¡�s|
 t¡�r,|
j|
j|
j|
jf}n4|
 t¡�rN|
j|
j|
j|
jf}n|
j|
j|
jdf}| |i ¡}| t¡�r„|jd	k�r˜||	v �r�qìd|	|< |j||
j< |||< qìi }|D ]’}|| }g }tt|ƒƒD ]d}| |d¡}|du �rð�qÒz| |¡}W n |jj �y   Y �qÒY n0 | !|j"j#|j"j$f¡ �qÒ|�r¶|||< �q¶|j%d
d� |j&| '¡ d�‰ ˆ  (¡  ˆ  )¡  ˆ  *¡  | +d¡ ddl,m-} ddl.m/} t0|j1ƒ}g }t2 3|¡D ]r\}‰t4|ƒ‰‡fdd„tt5ˆƒd ƒD ƒ}||d|d ˆd�}| !|¡ ˆ  6|¡ | 7‡ ‡fdd„ˆD ƒ¡ �q¸ˆ  8¡  |�sB| 9¡  ˆ  :¡  |S )z*Display traceroute results on a world map.r   )rÎ  Ú
MATPLOTLIBrÏ  Nz6Cannot import geoip2. Won't be able to plot the world.z�Cannot import the geolite2 CITY database.
Download it from http://dev.maxmind.com/geoip/geoip2/geolite2/ then set its path to conf.geoip_cityz_Cannot import cartopy.
More infos on http://scitools.org.uk/cartopy/docs/latest/installing.htmlz=Matplotlib is not installed. Won't be able to plot the world.z!Cannot open geoip2 database at %sr{   ZScapy)Únum)Z
projectionzScapy traceroute results)ÚLineCollection)Úcolorsc                    s    g | ]}ˆ | ˆ |d   f‘qS )rb   rT   )rð   rf  )ÚtrcrT   rU   rù   n  r›   z0TracerouteResult.world_trace.<locals>.<listcomp>rb   rr   )Z
linewidthsr   r  c                    s   g | ]}ˆ j |d ˆdœŽ‘qS )Ú.)Úmarkerr  )rÞ  rl  )Úaxr  rT   rU   rù   v  r›   );rÛ  rÎ  r-  rÏ  Zgeoip2.databaseZgeoip2.errorsÚImportErrorrI   Úerrorr!   Z
geoip_cityZcartopy.crsZcrsZdatabaseÚReaderÚ	ExceptionrÜ  rP   Úhaslayerr…  r”  r>  r<  r‡  rL  rM  r  r\   rû   ro  ZcityÚerrorsZAddressNotFoundErrorrü   ÚlocationZ	longitudeZlatitudeZfigureZaxesZPlateCarreeZ
coastlinesZ	stock_imgZ
set_globalr"  Zmatplotlib.collectionsr/  Z
matplotlibr0  rC  ZBASE_COLORSrõ   rò  rB  rÈ   Zadd_collectionr¹  Zlegendrß  Úremove)rS   rÎ  r-  rÏ  Zgeoip2ZccrsÚdbÚipsrÓ  Ú
ports_donerú   ri  Útrace_idró  ZtrtZloctracerf  r½  Zsresultr/  ZmcolorsZcolors_cycleræ  r�  Z
data_linesZline_colrT   )r4  r  r1  rU   Úworld_trace  s¶    ÿ
ÿÿ
ÿþ






þ

zTracerouteResult.world_tracer   c           #   	   C   sö  || _ || _i }i }i }i }| jD �]\}}| t¡pLtjrJ|tjj	j
 pL|}| t¡pntjrl|tjj	j
 pn|}d ||j< t|v r–|j|jd|jf}	nJt|v r²|j|jd|jf}	n.t|v rÎ|j|jd|jf}	n|j|j|jdf}	| |	i ¡}
tj�rtjj	j
|v �r|j�p|j}t|v �r,|t jdk�stj�rTtjj	j
|v �rTtjj	j|v �s|	|v �r`q"d ||	< | |jg ¡}t|v �r | | d¡¡ | d¡|
|< nrt|v �rÊ| | d¡¡ | d	¡|
|< nHt|v �rô| | d
¡¡ | d¡|
|< n| | d¡¡ | d¡|
|< |||j< n| d¡|
|< |
||	< q"tdƒ}g }i }|D ]þ}|| }
t|
ƒ}tt|
ƒ|ƒD ]}||
v�rlt|ƒ|
|< �ql||v�rJ|d dk�r¸d|d |d f }n\|d dk�rÜd|d |d f }n8|d dk�r d|d |d f }nd|d |d f }d ||< |||d < d| }||
|d < | |¡ �qJtdd„ |D ƒƒ}|d u �rlg }n
|j|Ž }i }i }|D ]n\}}}|d u �rš�q‚| |g ¡}||v �rÔ||v �rÄ| |¡ | || ¡ n
| |¡ |||< |||< �q‚t ddddƒ}t dddd ƒ}d!}|d"7 }|d#7 }|D ]r}|d$| 7 }t|ƒ}|d%| 7 }|d&| 7 }|d'7 }|d(||| f 7 }|| D ]}|d)| 7 }�qz|d*7 }�q&|d+7 }|D ]"}|d,||d- !|| ¡f 7 }�q¦|d.7 }|D ]}|d/| 7 }�qÖ|�rj|d07 }i }| jD ]N\} }!|!j|v�r|! "tj#¡�r|! tj#¡j$}|d1t%|ƒ k�rd ||!j< �q|D ]}!|d2|! 7 }�qV|d"7 }|D ]l}|d3t&|ƒ 7 }|d4t|ƒ 7 }|| }
t|
ƒ}"tt|
ƒ|"ƒD ]}|d5|
|  7 }�q¸|d6|
|"  7 }�qv|d77 }|| _'d S )8Nrv   r�   rb   r   r{   z)<T%ir,TCP.sport%> %TCP.sport% %TCP.flags%z"%r,src%":T%ir,TCP.sport%z<U%ir,UDP.sport%> %UDP.sport%z"%r,src%":U%ir,UDP.sport%z"<I%ir,ICMP.type%> ICMP %ICMP.type%z"%r,src%":I%ir,ICMP.type%z8{IP:<P%ir,proto%> IP %proto%}{IPv6:<P%ir,nh%> IPv6 %nh%}z)"%r,src%":{IP:P%ir,proto%}{IPv6:P%ir,nh%}z	"%r,src%"zunk%irr   z
%s %i/icmprs   z	%s %i/tcpz	%s %i/udpz%s %i/protoz"%s"c                 s   s   | ]}|  d d¡d V  qdS )ú rb   r   N)Úrsplitrl  rT   rT   rU   rñ   Ê  r›   z.TracerouteResult.make_graph.<locals>.<genexpr>Z60Z86ÚbaÚffZa0Z70Z40Z20zdigraph trace {
z1
	node [shape=ellipse,color=black,style=solid];

z
#ASN clustering
z	subgraph cluster_%s {
z		color="#%s%s%s";z*		node [fillcolor="#%s%s%s",style=filled];z		fontsize = 10;z		label = "%s\n[%s]"
z		"%s";
z	}
z#endpoints
zM	"%s" [shape=record,color=black,fillcolor=green,style=filled,label="%s|%s"];
ú|z
#Blackholes
z<	%s [shape=octagon,color=black,fillcolor=red,style=filled];
z

#Padding
r  z?	"%s" [shape=triangle,color=black,fillcolor=red,style=filled];
z#---[%s
z		edge [color="#%s%s%s"];
z	%s ->
z	%s;
z}
)(rë  rê  rÜ  rÝ  r5  r!   rT  rW   rX   rY   rZ   rP   r…  r>  r‡  r”  rL  rM  r<  r  r[   r\   ZICMPv6TimeExceededrü   rW  r   ro  rû   r'  rB  ÚsetÚresolver	   rü  r9  rº  r[  rÈ   Úreprré  )#rS   ÚASresrì  r>  rÓ  Úportsr?  rú   ri  r@  ró  r\   r£   Zunknown_labelZ
blackholesZbhipZrtkZ	max_traceÚnZbhZASN_query_listZASNlistZASNsZASDsr½  ZasnÚdescZiplistZbackcolorlistZforecolorlistr,  ÚpadZsndZrcvZmaxtracerT   rT   rU   Ú
make_graph…  sî    ""
&B













 zTracerouteResult.make_graphc                 K   s<   | j du s| j|ks| j|kr*|  ||¡ t| j fi |¤ŽS )a  x.graph(ASres=conf.AS_resolver, other args):
        ASres=None          : no AS resolver => no clustering
        ASres=AS_resolver() : default whois AS resolver (riswhois.ripe.net)
        ASres=AS_resolver_cymru(): use whois.cymru.com whois database
        ASres=AS_resolver(server="whois.ra.net")
        type: output type (svg, ps, gif, jpg, etc.), passed to dot's "-T" option  # noqa: E501
        target: filename or redirect. Defaults pipe to Imagemagick's display program  # noqa: E501
        prog: which graphviz program to useN)ré  rë  rê  rO  r   )rS   rJ  rì  r«   rT   rT   rU   Úgraph  s    	
ÿþzTracerouteResult.graph)Nrï  N)T)Nr   )ri   rj   rk   rm   rï   rß  rö  rý  rú  rA  rO  r!   ZAS_resolverrP  rT   rT   rT   rU   rè  =  s   

  
 rè  rˆ  r‰   c	                 K   s²   |du rt j}|du rd}|du r`tt| tƒ ||fd�ttƒ ||d� f|||dœ|	¤Ž\}
}n4d}tt| tƒ ||fd�| f|||dœ|	¤Ž\}
}t|
jƒ}
|rª|
 	¡  |
|fS )aH  Instant TCP traceroute

       :param target:  hostnames or IP addresses
       :param dport:   TCP destination port (default is 80)
       :param minttl:  minimum TTL (default is 1)
       :param maxttl:  maximum TTL (default is 30)
       :param sport:   TCP source port (default is random)
       :param l4:      use a Scapy packet instead of TCP
       :param filter:  BPF filter applied to received packets
       :param timeout: time to wait for answers (default is 2s)
       :param verbose: detailed output
       :return: an TracerouteResult, and a list of unanswered packetsNzq(icmp and (icmp[0]=3 or icmp[0]=4 or icmp[0]=5 or icmp[0]=11 or icmp[0]=12)) or (tcp and (tcp[13] & 0x16 > 0x10)))r>  rÁ   r\   )r‰  r†  r‡  )r  Úfilterr  r½  )
r!   ÚverbrB   r5  r=   r…  r>   rè  rÜ  rß  )r÷  r‡  ZminttlZmaxttlr†  Úl4rQ  r  r  r«   r  rá  rT   rT   rU   rq   %  s(    &ÿÿÿÿ

c                 K   s   |  dd¡ t| ƒd  ¡ S )zâUtil function to call traceroute on multiple targets, then
    show the different paths on a map.

    :param ips: a list of IPs on which traceroute will be called
    :param kargs: (optional) kwargs, passed to traceroute
    r  r   )Ú
setdefaultrq   rA  )r>  r«   rT   rT   rU   Útraceroute_mapI  s    rU  c                   @   sò  e Zd ZdZdd„ Zdd„ Zdd„ Zejdd	�d
d„ ƒZ	e ¡ dd„ ƒZ
e ¡ dd„ ƒZe ¡ dd„ ƒZejdd�dd„ ƒZejdd�dd„ ƒZe ¡ dd„ ƒZe e	¡dd„ ƒZe e¡dd„ ƒZe e
¡dd„ ƒZe e¡d d!„ ƒZe e¡d"d#„ ƒZe e¡d$d%„ ƒZejed&d'd(�d)d*„ ƒZe e¡d+d,„ ƒZe e¡d-d.„ ƒZe e¡d/d0„ ƒZe e¡d1d2„ ƒZe e¡d3d4„ ƒZe e¡d5d6„ ƒZ e e ¡d7d8„ ƒZ!e e¡d9d:„ ƒZ"e e"¡d;d<„ ƒZ#e $e
d¡d=d>„ ƒZ%e $ed¡d?d@„ ƒZ&dAS )BÚ
TCP_clientaF  
    Creates a TCP Client Automaton.
    This automaton will handle TCP 3-way handshake.

    Usage: the easiest usage is to use it as a SuperSocket.
        >>> a = TCP_client.tcplink(HTTP, "www.google.com", 80)
        >>> a.send(HTTPRequest())
        >>> a.recv()

    :param ip: the ip to connect to
    :param port:
    c              	   O   s¶   ddl m} tt|ƒƒ| _|| _t dd¡| _t	|d�t
| j| jdt dd¡d� | _| jj| _| jt
 j| _d | _|| jdd�| _d	| j| j| j| jf }tj| fd
|i|¤Ž d S )Nr   )Ú
TCPSessioni   r	  l        )r†  r‡  r9  r‰  F)ZprnÚstorez,host %s  and host %s and port %i and port %irQ  )Zscapy.sessionsrW  r  r   r>  r‡  rò   Ú	randranger†  r5  r…  rS  rP   rŠ  ÚsackZrel_seqÚ_transmit_packetÚrcvbufrG   Ú
parse_args)rS   r½  Úportrª   r«   rW  ZbpfrT   rT   rU   r]  g  s"    
ÿ

ýzTCP_client.parse_argsc                 C   s   | j j t|t jƒ¡ dS )z5Transmits a packet from TCPSession to the SuperSocketN)Zoir{  Úsendr   r…  rK  ©rS   r˜   rT   rT   rU   r[  x  s    zTCP_client._transmit_packetc                 C   s¨   t |v o¦|t  j| jko¦|t  j| jko¦t|v o¦|t j| jko¦|t j| jko¦| jt j|t jko¦| jt jdkp¦| j	|t j  ko¢| jt j|t j
 kS   S rÄ   )r5  rP   r>  r…  r†  r‡  rS  r‰  rŠ  rZ  rŒ  r`  rT   rT   rU   Úmaster_filter|  s    ÿþýüûú@ùzTCP_client.master_filterrb   )Úinitialc                 C   s   d S rg   rT   rR   rT   rT   rU   ÚSTART†  s    zTCP_client.STARTc                 C   s   d S rg   rT   rR   rT   rT   rU   ÚSYN_SENTŠ  s    zTCP_client.SYN_SENTc                 C   s   d S rg   rT   rR   rT   rT   rU   ÚESTABLISHEDŽ  s    zTCP_client.ESTABLISHEDc                 C   s   d S rg   rT   rR   rT   rT   rU   ÚLAST_ACK’  s    zTCP_client.LAST_ACK)rÇ  c                 C   s   d S rg   rT   rR   rT   rT   rU   ÚCLOSED–  s    zTCP_client.CLOSED)Ústopc                 C   s   d S rg   rT   rR   rT   rT   rU   ÚSTOPš  s    zTCP_client.STOPc                 C   s   d S rg   rT   rR   rT   rT   rU   ÚSTOP_SENT_FIN_ACKž  s    zTCP_client.STOP_SENT_FIN_ACKc                 C   s   |   ¡ ‚d S rg   )rd  rR   rT   rT   rU   Úconnect¢  s    zTCP_client.connectc                 C   s0   d| j t _|  | j ¡ | j t  jd7  _d S )Nr‘  rb   ©rS  r…  r9  r_  r‰  rR   rT   rT   rU   Úsend_syn¦  s    zTCP_client.send_sync                 C   s   |t  jjr|  ¡  |¡‚d S rg   )r…  r9  ZSAre  Úaction_parametersr`  rT   rT   rU   Úsynack_received¬  s    zTCP_client.synack_receivedc                 C   s2   |t  jd | jt  _d| jt  _|  | j¡ d S )Nrb   r’  )r…  r‰  rS  rŠ  r9  r_  r`  rT   rT   rU   Úsend_ack_of_synack±  s    zTCP_client.send_ack_of_synackc                 C   s(   t |t jttjfƒs$|  ¡  |¡‚d S rg   )rV   r…  rK  r<   r!   rº  re  rn  r`  rT   rT   rU   Úincoming_data_received·  s    z!TCP_client.incoming_data_receivedc                 C   sv   t |t jƒ}|rr| jt j|t jkrr| jt j| _| jt  jt|ƒ7  _d| jt _|  	| j¡ | j
 |¡ d S )Nr’  )r   r…  rK  rS  rŠ  r‰  rZ  rÈ   r9  r_  r\  Zon_packet_received)rS   r˜   rå  rT   rT   rU   Úreceive_data¼  s    zTCP_client.receive_datar{  Ztcplink)r®   Zas_supersocketc                 C   s   |   ¡  | ¡ ¡‚d S rg   )re  rn  Úrecv)rS   ÚfdrT   rT   rU   Úoutgoing_data_receivedÈ  s    z!TCP_client.outgoing_data_receivedc                 C   s8   d| j t _|  | j | ¡ | j t  jt|ƒ7  _d S )NZPA)rS  r…  r9  r_  r‰  rÈ   )rS   rô  rT   rT   rU   Ú	send_dataÌ  s    zTCP_client.send_datac                 C   s   |t  jjr|  ¡ ‚d S rg   )r…  r9  r�  rg  r`  rT   rT   rU   Úreset_receivedÒ  s    zTCP_client.reset_receivedc                 C   s   |t  jjr|  ¡  |¡‚d S rg   )r…  r9  ÚFrf  rn  r`  rT   rT   rU   Úfin_received×  s    zTCP_client.fin_receivedc                 C   sF   d| j t _|t jd | j t _|  | j ¡ | j t  jd7  _d S ©NZFArb   ©rS  r…  r9  r‰  rŠ  r_  r`  rT   rT   rU   Úsend_finackÜ  s    zTCP_client.send_finackc                 C   s   |t  jjr|  ¡ ‚d S rg   )r…  r9  r’  rg  r`  rT   rT   rU   Úack_of_fin_receivedã  s    zTCP_client.ack_of_fin_receivedc                 C   s   |   ¡ ‚d S rg   )rj  rR   rT   rT   rU   Ústop_requestedè  s    zTCP_client.stop_requestedc                 C   s0   d| j t _|  | j ¡ | j t  jd7  _d S rz  rl  rR   rT   rT   rU   Ústop_send_finackì  s    zTCP_client.stop_send_finackc                 C   s   |t  jjr|  ¡  |¡‚d S rg   )r…  r9  rx  rg  rn  r`  rT   rT   rU   Ústop_fin_receivedò  s    zTCP_client.stop_fin_receivedc                 C   s2   d| j t _|t jd | j t _|  | j ¡ d S )Nr’  rb   r{  r`  rT   rT   rU   Ústop_send_ack÷  s    zTCP_client.stop_send_ackc                 C   s   |   ¡ ‚d S rg   ©rg  rR   rT   rT   rU   Úsyn_ack_timeoutý  s    zTCP_client.syn_ack_timeoutc                 C   s   |   ¡ ‚d S rg   r‚  rR   rT   rT   rU   Ústop_ack_timeout  s    zTCP_client.stop_ack_timeoutN)'ri   rj   rk   rl   r]  r[  ra  rH   Ústaterc  rd  re  rf  rg  ri  rj  Ú	conditionrk  r  rm  Zreceive_conditionro  rp  rq  rr  Zioeventru  rv  rw  ry  r|  r}  r~  r  r€  r�  r  rƒ  r„  rT   rT   rT   rU   rV  Y  sl   





























rV  c                 C   sÌ   t t| d�t|d� dd�\}}d}|D ],\}}| t¡s(|jjdkr(|| d¡7 }q(|d7 }|D ]<\}}| t¡r„|| d	¡7 }qb|jjdkrb|| d
¡7 }qb|d7 }|D ]}|| d¡7 }q¬|d7 }|S )zPportscan a target and output a LaTeX table
report_ports(target, ports) -> stringr	  )r‡  ru   )r  z \begin{tabular}{|r|l|l|}
\hline
r‚   z%TCP.sport% & open & SA \\
z\hline
zO%TCPerror.dport% & closed & ICMP type %ICMP.type%/%ICMP.code% from %IP.src% \\
z*%TCP.sport% & closed & TCP %TCP.flags% \\
z %TCP.dport% & ? & unanswered \\
z\hline
\end{tabular}
)rB   r5  r…  r9  rL  rK  r9  rW  )r÷  rK  ÚansZunansÚreprú   ri  rf  rT   rT   rU   Úreport_ports  s"     

r‰  c                 C   s
   | d j S r  )rÁ   rÀ  rT   rT   rU   rš   #  r›   rš   c                 C   s   | d   ¡ S r  )ÚsummaryrÀ  rT   rT   rU   rš   #  r›   c                    sœ   ‡ fdd„| D ƒ}|  ¡  |d g}|dd„ t|dd… |dd… ƒD ƒ7 }‡ ‡fdd„| D ƒ} |   ¡  td	t|ƒ|f ƒ | D ]\}}td
| |ƒ q€dS )z­Identify IP id values classes in a list of packets

lst:      a list of packets
funcID:   a function that returns IP id values
funcpres: a function used to summarize packetsc                    s   g | ]}ˆ |ƒ‘qS rT   rT   rÙ  )ÚfuncIDrT   rU   rù   )  r›   zIPID_count.<locals>.<listcomp>r   c                 S   s,   g | ]$}t |d  |d  ƒdkr|d ‘qS )r   rb   r  )r“  )rð   re   rT   rT   rU   rù   ,  r›   Nrm  rb   c                    s   g | ]}ˆ |ƒˆ|ƒf‘qS rT   rT   rl  ©r‹  ÚfuncpresrT   rU   rù   -  r›   zProbably %i classes: %sz%5i)rÂ  ÚziprO   rÈ   )rc  r‹  r�  ZidlstÚclassesrÁ   ÚprrT   rŒ  rU   Ú
IPID_count"  s    
(r‘  é{   r  c                 C   sv  d}t | tƒ ddd�}|t||d�|  }t ¡ }d}	i }
�z |d u sL|�rZ|d urft|tƒrf|d8 }zÐ|	sv| |¡ t |gg g |¡d }|s”W q>| 	d¡}t|t ƒs¬W q>t|j
tƒs¼W q>t|j
j
tƒsÎW q>|j
j
j| kràW q>|j| krötd|jƒ | tj¡�sW q>| tj¡j}||
v�r4d |
|< t||d	� W q> t�yV   |	�rN‚ d}	Y q>0 q>W n t�yp   Y n0 d S )
NZXXXXYYYYYYYYYYó(                                           rb   )r>  rÁ   rê   r9  )r†  r‡  r   i@  z	leak from©Úonlyasc)r5  r=   r”  r!   ZL3socketrV   r  r_  Úselectrs  rK  rL  r§  r>  rP   rO   r9  rº  rÝ  r[  r   ÚKeyboardInterrupt)r÷  r†  r‡  r  r•  Úcountr[  r˜   rú   ZintrÚfoundr)  r‡  ÚleakrT   rT   rU   Úfragleak4  sN    




r›  çš™™™™™Ù?c                 C   s¤   i }zˆ|d u s|rŠ|d ur,t |tƒr,|d8 }t| ddd�}|d }t||dd�}|sVqtj|v r|tj j}||vrd ||< t||d� qW n tyž   Y n0 d S )	Nrb   r“  éÈ   )r>  rê   r<  ZXXXXYYYYYYYYYYYYr   r  r”  )	rV   r  r5  rC   r!   rº  r[  r   r8  )r÷  r  r•  r˜  r™  r˜   r£   rš  rT   rT   rU   Ú	fragleak2_  s"    
rž  c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚICMPEcho_amz%Responds to ICMP Echo-Requests (ping)Z	icmpechodc                 C   s&   |  t¡r"| t¡}|jdkr"dS dS )Nrx   TF)r9  rL  rÝ  rM  )rS   ÚreqZicmp_reqrT   rT   rU   Ú
is_requesty  s
    


zICMPEcho_am.is_requestc                 C   s   t d| t¡j|jf ƒ d S )NzReplying %s to %s)rO   rÝ  r5  r>  ©rS   r   ZreplyrT   rT   rU   Úprint_reply�  s    zICMPEcho_am.print_replyc                 C   sN   t |t  jd�tƒ  }d|t _|t j|t _|t j|t _d |t _|S )Nr	  r   )r5  rP   rL  rM  r‰  rÁ   r=  r¢  rT   rT   rU   Ú
make_reply„  s    

zICMPEcho_am.make_replyN)ri   rj   rk   rl   Zfunction_namer¡  r£  r¤  rT   rT   rT   rU   rŸ  u  s
   rŸ  )rY  )rx   N)F)r’  r’  r  r   N)rœ  r   N)¯rl   r-  rÆ   rý   rò   r–  rI  Úcollectionsr   Zscapy.utilsr   r   r   r   r   r   r	   Zscapy.ansmachiner
   Zscapy.base_classesr   r   Z
scapy.datar   r   r   r   r   r   r   r   Zscapy.layers.l2r   r   r   r   r   r   r   Zscapy.compatr   r   r   r   r    Zscapy.configr!   Zscapy.fieldsr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   Zscapy.packetr9   r:   r;   r<   Zscapy.volatiler=   r>   r?   r@   rA   Zscapy.sendrecvrB   rC   Zscapy.plistrD   rE   rF   Zscapy.automatonrG   rH   Zscapy.errorrI   rJ   Zscapy.pton_ntoprK   Zscapy.as_resolversrW   Zscapy.libs.sixZlibsrõ   ÚobjectrL   r�   rŠ   r’   r°   r²   r³   r´   rº   r¼   r½   r¾   r¿   rÀ   rÂ   rË   rÌ   rÎ   r÷   ræ   rì   rí   r	  r!  r3  r5  rt  rv  rx  r|  r‚  r„  r…  r”  r©  rª  r£  rL  r§  r®  r°  r±  rR  Zl2typesÚregisterZregister_num2layerZl3typesrµ  ZneighborZregister_l3Úcommandsrj  r·  r¿  rÉ  r»  rÍ  rç  Ztimeskew_graphrè  rq   rU  rV  r‰  r‘  r›  rž  rŸ  Zstats_classic_protocolsZstats_dot11_protocolsrT  Zscapy.layers.inet6rT   rT   rT   rU   Ú<module>   sâ  $($dç	
	óóí$		'b &Q8çòýÿÿûé=(*

7   k#
 3
*