o
    àý°j) ã                   @   sœ  d dl Z d dlmZ e jdej edd d dlZd dlZd dlm	Z	m
Z
 d dlmZmZ d dlmZmZmZmZmZmZmZ d d	lmZ d d
lmZ dZdZdd„ ZG dd„ dƒZG dd„ dƒ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!G dd„ deƒ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&G d%d&„ d&ƒ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+G d/d0„ d0e*ƒZ,G d1d2„ d2ƒZ-G d3d4„ d4e$ƒZ.G d5d6„ d6e$ƒZ/G d7d8„ d8e(ƒZ0G d9d:„ d:e$ƒZ1G d;d<„ d<e(ƒZ2G d=d>„ d>e$ƒZ3G d?d@„ d@e(ƒZ4G dAdB„ dBe$ƒZ5G dCdD„ dDe%ƒZ6G dEdF„ dFe6ƒZ7G dGdH„ dHe6ƒZ8G dIdJ„ dJe6ƒZ9G dKdL„ dLe6ƒZ:G dMdN„ dNe6ƒZ;G dOdP„ dPe6ƒZ<G dQdR„ dReƒZ=G dSdT„ dTeƒZ>G dUdV„ dVeƒZ?G dWdX„ dXeƒZ@G dYdZ„ dZeƒZAG d[d\„ d\eƒZBG d]d^„ d^e$ƒZCG d_d`„ d`e(ƒZDG dadb„ dbe$ƒZEG dcdd„ dde(ƒZFG dedf„ dfe$ƒZGG dgdh„ dhe)ƒZHG didj„ djƒZIG dkdl„ dlƒZJG dmdn„ dnƒZKdS )oé    N)ÚversionÚ
é   )Ú
stacklevel)ÚxrangeÚreduce)Ú	lookupdevÚ	open_live)ÚUDPÚ	TCPOptionÚDataÚTCPÚIPÚICMPÚEthernet)Ú
EthDecoder)ÚLOGznmap-os-fingerprintsz
nmap-os-dbc                 C   s8   | |k r
| }|} |}d|kr| |@ }|} |}d|ks| S ©Nr   © )ÚaÚbÚcr   r   ú/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/os_ident.pyÚmy_gcd$   s   ýr   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Úos_id_exceptionc                 C   ó
   || _ d S ©N)Úvalue)Úselfr   r   r   r   Ú__init__1   ó   
zos_id_exception.__init__c                 C   s
   t | jƒS r   )Úreprr   ©r   r   r   r   Ú__str__3   r!   zos_id_exception.__str__N)Ú__name__Ú
__module__Ú__qualname__r    r$   r   r   r   r   r   0   s    r   c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )Ú
os_id_testc                 C   s   || _ d | _i | _d S r   )Ú_os_id_test__idÚ_os_id_test__my_packetÚ_os_id_test__result_dict©r   Úidr   r   r   r    8   ó   
zos_id_test.__init__c                 C   s   | j jS r   )Ú	__class__r%   r#   r   r   r   Útest_id=   s   zos_id_test.test_idc                 C   s
   | j  ¡ S r   )r*   Ú
get_packetr#   r   r   r   Úget_test_packet@   r!   zos_id_test.get_test_packetc                 C   r   r   ©r*   ©r   Úpacketr   r   r   Ú
set_packetC   r!   zos_id_test.set_packetc                 C   ó   | j S r   r3   r#   r   r   r   r1   F   ó   zos_id_test.get_packetc                 C   ó   d S r   r   r4   r   r   r   ÚprocessI   ó   zos_id_test.processc                 C   s   || j |< d S r   ©r+   )r   Únamer   r   r   r   Ú
add_resultL   s   zos_id_test.add_resultc                 C   r7   r   )r)   r#   r   r   r   Úget_idO   r8   zos_id_test.get_idc                 C   r9   r   r   r4   r   r   r   Úis_mineQ   r;   zos_id_test.is_minec                 C   r7   r   r<   r#   r   r   r   Úget_result_dictT   r8   zos_id_test.get_result_dictc                 C   ó   dS )údReturns a string representation of the final result of this test or None if no response was receivedNr   r#   r   r   r   Úget_final_resultW   s   zos_id_test.get_final_resultN)r%   r&   r'   r    r0   r2   r6   r1   r:   r>   r?   r@   rA   rD   r   r   r   r   r(   6   s    r(   c                   @   sH   e Zd Zejejejejejej	ej
ejiZdd„ Zdd„ Zdd„ ZdS )Úicmp_requestc                 C   s‚   t  | |¡ tƒ | _tƒ | _tƒ | _| j |d ¡ | j 	|d ¡ || _
| j |¡ | j | j¡ | j | j¡ |  | j¡ d S ©Nr   é   )r(   r    r   Úer   Úir   ÚicmpÚ
set_ip_srcÚ
set_ip_dstÚ_icmp_request__typeÚset_icmp_typeÚcontainsr6   )r   r-   Ú	addressesÚtyper   r   r   r    b   s   zicmp_request.__init__c                 C   sl   |  ¡ tjkr	dS | ¡ }|r| ¡ tjkrdS | ¡ }|r(| ¡ tj	| j
 kr*dS | ¡ |  ¡ kr4dS dS rF   )Úget_ether_typer   Ú	ethertypeÚchildÚget_ip_pr   ÚprotocolÚget_icmp_typerE   Útype_filterrM   Úget_icmp_idr?   ©r   r5   ÚiprJ   r   r   r   r@   r   s   zicmp_request.is_minec                 C   r9   r   r   r4   r   r   r   r:   †   r;   zicmp_request.processN)r%   r&   r'   r   Ú	ICMP_ECHOÚICMP_ECHOREPLYÚ	ICMP_IREQÚICMP_IREQREPLYÚICMP_MASKREQÚICMP_MASKREPLYÚICMP_TSTAMPÚICMP_TSTAMPREPLYrX   r    r@   r:   r   r   r   r   rE   \   s    ýrE   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )Únmap2_icmp_echo_probe_1i'  ixV  c                 C   st   t  | ||tj¡ | j d¡ | j d¡ | j d¡ | j 	t
j¡ | j t
j¡ | j t
j¡ | j tdƒ¡ d S )NTr   é	   ÚxIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII©rE   r    r   r\   rI   Ú	set_ip_dfÚ
set_ip_tosrJ   Úset_icmp_codeÚset_icmp_seqrd   Úsequence_numberÚ	set_ip_idr-   Úset_icmp_idrO   r   ©r   r-   rP   r   r   r   r    ’   s   z nmap2_icmp_echo_probe_1.__init__c                 C   r9   r   r   r4   r   r   r   r:   œ   r;   znmap2_icmp_echo_probe_1.processN)r%   r&   r'   rl   r-   r    r:   r   r   r   r   rd   Š   s
    
rd   c                   @   r   )Únmap2_icmp_echo_probe_2c                 C   s€   t  | ||tj¡ | j d¡ | j d¡ | j d¡ | j 	t
jd ¡ | j t
jd ¡ | j t
jd ¡ | j tdƒ¡ d S )NFé   r   rG   Ú–IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIrg   ro   r   r   r   r    ¥   s   z nmap2_icmp_echo_probe_2.__init__c                 C   r9   r   r   r4   r   r   r   r:   ¯   r;   znmap2_icmp_echo_probe_2.processN)r%   r&   r'   r    r:   r   r   r   r   rp   Ÿ   s    
rp   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Úudp_closed_probei4  c                 C   s–   t  | |¡ tƒ | _tƒ | _tƒ | _| j |d ¡ | j 	|d ¡ | j 
tj¡ | j |¡ | j |¡ | j | j¡ | j | j¡ |  | j¡ d S rF   )r(   r    r   rH   r   rI   r
   ÚurK   rL   rm   rs   Úip_idÚset_uh_sportÚset_uh_dportrO   r6   )r   r-   rP   Ú
udp_closedr   r   r   r    ¶   s   zudp_closed_probe.__init__c                 C   sx   |  ¡ tjkr	dS | ¡ }|r| ¡ tjkrdS | ¡ }|r%| ¡ tjkr'dS | 	¡ tj
kr0dS | ¡ | _| js:dS dS rF   )rR   r   rS   rT   rU   r   rV   rW   ÚICMP_UNREACHÚget_icmp_codeÚICMP_UNREACH_PORTÚerr_datarZ   r   r   r   r@   È   s   
zudp_closed_probe.is_mineN)r%   r&   r'   ru   r    r@   r   r   r   r   rs   ²   s    rs   c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú	tcp_probec                 C   sÊ   d| _ t | |¡ tƒ | _tƒ | _tƒ | _| j 	|d ¡ | j 
|d ¡ | j d¡ | j |¡ |r9|d | _n|d | _| j | j¡ | j | j¡ | j | j¡ |  | j¡ |d | _|d | _d S )Nz[]r   rG   i##  )Úresult_stringr(   r    r   rH   r   rI   r   ÚtrK   rL   rm   Úset_th_sportÚtarget_portÚset_th_dportrO   r6   Ú	source_ipÚ	target_ip©r   r-   rP   Ú	tcp_portsÚ	open_portr   r   r   r    à   s$   

ztcp_probe.__init__c                 C   sF   |  ¡ | jks| ¡ | jkrdS | ¡ | jks| ¡ |  ¡ kr!dS dS rF   )Ú
get_ip_srcr…   Úget_th_sportr‚   Ú
get_ip_dstr„   Úget_th_dportr?   )r   r[   Útcpr   r   r   Úsocket_matchú   s
   ztcp_probe.socket_matchc                 C   sL   |  ¡ tjkr	dS | ¡ }|r| ¡ tjkrdS | ¡ }|  ||¡r$dS dS rF   )rR   r   rS   rT   rU   r   rV   rŽ   ©r   r5   r[   r   r   r   r   r@     s   ztcp_probe.is_mineN)r%   r&   r'   r    rŽ   r@   r   r   r   r   r~   Þ   s    	r~   c                   @   r   )Únmap_tcp_probec                 C   sB   t  | ||||¡ | j |¡ |  d¡ |D ]}| j |¡ qd S )NF)r~   r    r€   Ú
set_th_seqÚset_respÚ
add_option)r   r-   rP   r‡   rˆ   ÚsequenceÚoptionsÚopr   r   r   r      s   
ÿznmap_tcp_probe.__init__c                 C   r9   r   r   ©r   Úrespr   r   r   r’     r;   znmap_tcp_probe.set_respN)r%   r&   r'   r    r’   r   r   r   r   r     s    r   c                   @   sn   e Zd ZdZdZeejdƒeejƒeejeƒeej	dƒeej
ƒeej
ƒgZdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Únmap1_tcp_probeéS„  é	  é
   i????c              	   C   ó   t  | ||||| j| j¡ d S r   )r   r    r”   Útcp_optionsr†   r   r   r   r    2  ó   ÿznmap1_tcp_probe.__init__c                 C   ó$   |r
|   dd¡ d S |   dd¡ d S ©NÚRespÚYÚN©r>   r—   r   r   r   r’   6  ó   znmap1_tcp_probe.set_respc                 C   sÜ  |  ¡ }|  ¡ }|  d¡ | ¡ r|  dd¡ n|  dd¡ |  d| ¡ ¡ | ¡ | jd kr6|  dd¡ n| ¡ | jkrD|  dd	¡ n|  dd
¡ g }| ¡ rU| d¡ | 	¡ r^| d¡ | 
¡ rg| d¡ | ¡ rp| d¡ | ¡ ry| d¡ | ¡ r‚| d	¡ | ¡ r‹| d¡ |  d|¡ g }| ¡ D ]N}| ¡ tjkr¦| d¡ q—| ¡ tjkr¿| d¡ | ¡ | jkr¾| d¡ q—| ¡ tjkrÌ| d¡ q—| ¡ tjkrÙ| d¡ q—| ¡ tjkrå| d¡ q—|  d|¡ d S )NTÚDFr£   r¤   ÚWrG   ÚACKzS++ÚSÚOÚBÚUÚAÚPÚRÚFÚFLAGSÚLÚMÚEÚTÚOPTIONS)rT   r’   Ú	get_ip_dfr>   Ú
get_th_winÚ
get_th_ackr”   Úget_ECEÚappendÚget_URGÚget_ACKÚget_PSHÚget_RSTÚget_SYNÚget_FINÚget_optionsÚget_kindr   Ú
TCPOPT_EOLÚTCPOPT_MAXSEGÚget_mssÚmssÚ
TCPOPT_NOPÚTCPOPT_TIMESTAMPÚTCPOPT_WINDOW)r   r5   r[   r   Úflagsr•   r–   r   r   r   r:   <  sZ   









€
€znmap1_tcp_probe.processc                 C   ó   |   ¡ |  ¡ iS r   ©r0   rA   r#   r   r   r   rD   v  ó   z nmap1_tcp_probe.get_final_resultN)r%   r&   r'   r”   rÈ   r   rË   rÉ   rÆ   rÊ   rÅ   rž   r    r’   r:   rD   r   r   r   r   r™     s    


ú	:r™   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Únmap2_tcp_probei{Oc              	   C   s(   t  | ||||||¡ | j | j¡ d S r   )r   r    r€   Ú
set_th_ackÚacknowledgment)r   r-   rP   r‡   rˆ   r”   r•   r   r   r   r    }  s   ÿznmap2_tcp_probe.__init__c                 C   r    ©Nr°   r£   r¤   r¥   r—   r   r   r   r’   ‚  s   znmap2_tcp_probe.set_respc                 C   s    |  ¡ }|  ¡ }|  d¡ t||| j| jƒ}|  d| ¡ ¡ |  d| ¡ ¡ |  d| ¡ ¡ |  d| 	¡ ¡ |  d| 
¡ ¡ |  d| ¡ ¡ |  d| ¡ ¡ d S )	NTr§   r¨   rª   r®   r±   r«   ÚQ)rT   r’   Únmap2_tcp_testsr”   rÒ   r>   Úget_dfÚget_winÚget_seqÚget_ackÚ	get_flagsrÃ   Ú
get_quirks©r   r5   r[   r   Útestsr   r   r   r:   Œ  s   
znmap2_tcp_probe.processc                 C   rÍ   r   rÎ   r#   r   r   r   rD     rÏ   z nmap2_tcp_probe.get_final_resultN)r%   r&   r'   rÒ   r    r’   r:   rD   r   r   r   r   rÐ   z  s    
rÐ   c                   @   sl   e Zd ZeejdƒeejƒeejdƒeejƒeejƒeejƒgZdd„ Z	dd„ Z
dd„ Zd	d
„ Zdd„ ZdS )Únmap2_ecn_proberœ   é´  c              	   C   sj   t  | |||dd| j¡ | j ¡  | j ¡  | j ¡  | j d¡ | j d¡ | j 	d¡ | j 
d¡ d S )NrG   ij‹  i   iõ÷  r   é   )r   r    rž   r€   Úset_SYNÚset_CWRÚset_ECEÚ	set_flagsÚ
set_th_urprÑ   Ú
set_th_win©r   r-   rP   r‡   r   r   r   r    À  s   ÿ


znmap2_ecn_probe.__init__c                 C   rB   )NÚECNr   r#   r   r   r   r0   Ì  r;   znmap2_ecn_probe.test_idc                 C   r    rÓ   r¥   r—   r   r   r   r’   Ï  r¦   znmap2_ecn_probe.set_respc                 C   s|   |  ¡ }|  ¡ }|  d¡ t||ddƒ}|  d| ¡ ¡ |  d| ¡ ¡ |  d| ¡ ¡ |  d| ¡ ¡ |  d| ¡ ¡ d S )NTr   r§   r¨   r«   ÚCCrÔ   )	rT   r’   rÕ   r>   rÖ   r×   rÃ   Úget_ccrÛ   rÜ   r   r   r   r:   Õ  s   
znmap2_ecn_probe.processc                 C   rÍ   r   rÎ   r#   r   r   r   rD   ä  rÏ   z nmap2_ecn_probe.get_final_resultN)r%   r&   r'   r   rË   rÉ   rÆ   ÚTCPOPT_SACK_PERMITTEDrž   r    r0   r’   r:   rD   r   r   r   r   rÞ   ¡  s    

ú
rÞ   c                   @   óT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )rÕ   c                 C   ó   || _ || _|| _|| _d S r   )Ú_nmap2_tcp_tests__ipÚ_nmap2_tcp_tests__tcpÚ_nmap2_tcp_tests__sequenceÚ _nmap2_tcp_tests__acknowledgment)r   r[   r   r”   rÒ   r   r   r   r    è  ó   
znmap2_tcp_tests.__init__c                 C   s   | j  ¡ rdS dS )Nr£   r¤   )rî   r¸   r#   r   r   r   rÖ   î  s   
znmap2_tcp_tests.get_dfc                 C   s   d| j  ¡  S )Nú%X)rï   r¹   r#   r   r   r   r×   ú  s   znmap2_tcp_tests.get_winc                 C   óB   | j  ¡ | jd krdS | j  ¡ | jkrdS | j  ¡ dkrdS dS )NrG   zS+rª   r   ÚZr«   )rï   rº   rð   r#   r   r   r   rÙ   ÿ  s   
znmap2_tcp_tests.get_ackc                 C   rô   )NrG   zA+r®   r   rõ   r«   )rï   Ú
get_th_seqrñ   r#   r   r   r   rØ     s   znmap2_tcp_tests.get_seqc                 C   s†   d}| j  ¡ r|d7 }| j  ¡ r|d7 }| j  ¡ r|d7 }| j  ¡ r&|d7 }| j  ¡ r/|d7 }| j  ¡ r8|d7 }| j  ¡ rA|d7 }|S )	NÚ rµ   r­   r®   r¯   r°   rª   r±   )rï   r»   r½   r¾   r¿   rÀ   rÁ   rÂ   )r   rÌ   r   r   r   rÚ   &  s    






znmap2_tcp_tests.get_flagsc                 C   sÖ   d}| j  ¡ D ]a}| ¡ tjkr|d7 }q| ¡ tjkr%|d| ¡  7 }q| ¡ tjkr1|d7 }q| ¡ tjkrM|dt	| 
¡ dkƒt	| ¡ dkƒf 7 }q| ¡ tjkr]|d| ¡  7 }q| ¡ tjkrh|d7 }q|S )	Nr÷   r³   zM%Xr¤   zT%i%ir   zW%Xrª   )rï   rÃ   rÄ   r   rÅ   rÆ   rÇ   rÉ   rÊ   ÚintÚget_tsÚget_ts_echorË   Úget_shift_cntrë   )r   r•   r–   r   r   r   rÃ   I  s$   


ÿ€znmap2_tcp_tests.get_optionsc                 C   s>   | j  ¡ | j  ¡ }}|r|sdS |s|sdS |r|rdS dS )Nr£   r¤   rª   r«   )rï   r»   Úget_CWR)r   ÚeceÚcwrr   r   r   rê   i  s   znmap2_tcp_tests.get_ccc                 C   sJ   d}| j  ¡ d? d@ dkr|d7 }| j  ¡ dkr#| j  ¡ dkr#|d7 }|S )Nr÷   é   é   r   r°   r­   )rï   Úget_th_flagsr½   Ú
get_th_urp)r   Úquirksr   r   r   rÛ   ‚  s   znmap2_tcp_tests.get_quirksN)r%   r&   r'   r    rÖ   r×   rÙ   rØ   rÚ   rÃ   rê   rÛ   r   r   r   r   rÕ   ç  s    # rÕ   c                   @   óN   e Zd ZdZdZeejdƒeejƒeejeƒeej	dƒeej
ƒgZdd„ ZdS )Únmap2_tcp_probe_2_6rš   r›   rœ   ì   ÿÿ c              	   C   r   r   ©rÐ   r    r”   rž   r†   r   r   r   r    ¶  rŸ   znmap2_tcp_probe_2_6.__init__N©r%   r&   r'   r”   rÈ   r   rË   rÉ   rÆ   rÊ   rë   rž   r    r   r   r   r   r    s    


ûr  c                   @   r  )Únmap2_tcp_probe_7rš   r›   r   r  c              	   C   r   r   r  r†   r   r   r   r    É  rŸ   znmap2_tcp_probe_7.__init__Nr  r   r   r   r   r	  º  s    


ûr	  c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Únmap_port_unreachablec                 C   s"   t  | |||d ¡ |  d¡ d S )Nr   F)rs   r    r’   ©r   r-   rP   Úportsr   r   r   r    Ï  s   znmap_port_unreachable.__init__c                 C   r9   r   r   r#   r   r   r   r0   Ó  r;   znmap_port_unreachable.test_idc                 C   r9   r   r   r—   r   r   r   r’   Ö  r;   znmap_port_unreachable.set_respc                 C   r9   r   r   r4   r   r   r   r:   Ù  r;   znmap_port_unreachable.processN)r%   r&   r'   r    r0   r’   r:   r   r   r   r   r  Í  s
    r  c                   @   ó4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Únmap1_port_unreachablec                 C   s$   t  | |||¡ | j tdƒ¡ d S )NÁ,  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)r  r    rt   rO   r   r  r   r   r   r    Þ  s   znmap1_port_unreachable.__init__c                 C   rB   )NÚPUr   r#   r   r   r   r0   â  r;   znmap1_port_unreachable.test_idc                 C   r    r¡   r¥   r—   r   r   r   r’   å  r¦   znmap1_port_unreachable.set_respc           	      C   sÐ  | j }| ¡ tjkrd S | ¡ }|sd S | ¡ }|  d¡ | ¡ r(|  dd¡ n|  dd¡ |  d| ¡ ¡ |  d| 	¡ ¡ |  d| 	¡ ¡ | 
¡ }d|krU|  d	d
¡ ntj|kra|  d	d¡ n|  d	d¡ | ¡ }| d¡ | | ¡ ¡}d|kr‚|  dd
¡ n||kr|  dd¡ n|  dd¡ | ¡ }| d¡ d|_| ¡  d|kr®|  dd
¡ n| j ¡ |kr¼|  dd¡ n|  dd¡ |  d| ¡ ¡ | ¡  ¡  ¡  ¡ | ¡ krà|  dd¡ d S |  dd¡ d S )NTr§   r£   r¤   ÚTOSÚIPLENÚRIPTLr   ÚRIDÚ0rµ   r±   ÚRIPCKrG   ÚUCKÚULENÚDAT)r|   rU   r
   rV   rT   r’   r¸   r>   Ú
get_ip_tosÚ
get_ip_lenÚ	get_ip_idrs   ru   Ú
get_ip_sumÚ
set_ip_sumÚcompute_checksumÚ	get_bytesÚ
get_uh_sumÚ
set_uh_sumÚauto_checksumÚcalculate_checksumrt   Úget_uh_ulen)	r   r5   Úip_origÚudpr[   Ú
recv_ip_idÚip_sumÚchecksumÚudp_sumr   r   r   r:   ë  sR   



znmap1_port_unreachable.processc                 C   rÍ   r   rÎ   r#   r   r   r   rD   *  rÏ   z'nmap1_port_unreachable.get_final_resultN©r%   r&   r'   r    r0   r’   r:   rD   r   r   r   r   r  Ü  s    ?r  c                   @   r  )Únmap2_port_unreachablec                 C   s0   t  | |||¡ | j tdƒ¡ | j d¡ d S )NÁ,  CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCéB  )r  r    rt   rO   r   rI   rm   r  r   r   r   r    6  s   znmap2_port_unreachable.__init__c                 C   rB   )NÚU1r   r#   r   r   r   r0   ;  r;   znmap2_port_unreachable.test_idc                 C   r    rÓ   r¥   r—   r   r   r   r’   >  r¦   znmap2_port_unreachable.set_respc           	      C   s   | j }| ¡ tjkrd S | ¡ }|sd S | ¡ }| ¡ }| ¡ r'|  dd¡ n|  dd¡ |  dd| ¡  ¡ |  dd| ¡  ¡ |  dd| 	¡  ¡ | ¡ dkrX|  d	d
¡ n
|  d	d| ¡  ¡ d| 
¡ kro|  dd
¡ n
|  dd| 
¡  ¡ | ¡ }| d¡ | | ¡ ¡}d|kr”|  dd¡ n||krŸ|  dd
¡ n|  dd¡ | ¡ }| d¡ d|_| ¡  | j ¡ |krÃ|  dd
¡ n|  dd| ¡ | ¡ dkrØ|  dd
¡ n
|  dd| ¡  ¡ | ¡  ¡  ¡  ¡ | ¡ krø|  dd
¡ d S |  dd¡ d S )Nr§   r£   r¤   r  ró   ÚIPLÚUNéH  ÚRIPLÚGr0  r  r   r  rõ   ÚIrG   ÚRUCKé4  ÚRULÚRUD)r|   rU   r
   rV   rT   r¸   r>   r  r  Úget_icmp_voidr  r  r  r   r!  r"  r#  r$  r%  rt   r&  )	r   r5   r'  r(  r[   rJ   r*  r+  r,  r   r   r   r:   D  sR   -

	

znmap2_port_unreachable.processc                 C   rÍ   r   rÎ   r#   r   r   r   rD   Ú  rÏ   z'nmap2_port_unreachable.get_final_resultNr-  r   r   r   r   r.  -  s    	 r.  c                   @   rì   )ÚOS_IDc                 C   sx   t ƒ }t|dddƒ| _| j ¡ | _|| _| j d|| jf dd¡ | j d¡ tƒ | _	g | _
d| _i | _d| _|| _d S )	NiX  r   i¸  zsrc host %s and dst host %srG   l    ÿ rœ   i90  )r   r	   ÚpÚ
getlocalipÚ_OS_ID__sourceÚ_OS_ID__targetÚ	setfilterÚsetmintocopyr   ÚdecoderÚ
tests_sentÚoutstanding_countÚresultsÚ
current_idÚ_OS_ID__ports)r   Útargetr  Úpcap_devr   r   r   r    ß  s   
zOS_ID.__init__c                 C   s   | j d ur| j  ¡  d S d S r   )r>  Úcloser#   r   r   r   ÚreleasePcapñ  s   
ÿzOS_ID.releasePcapc                 C   s&   | j }|  j d7  _ |  j dM  _ |S )NrG   éÿÿ  )rH  r,   r   r   r   Ú
get_new_idõ  s   zOS_ID.get_new_idc                 C   sà   d| _ |D ]J}|jjjjdkr||  ¡ | j| jg| jƒ}n||  ¡ | j| jgƒ}| j	 
| ¡ ¡ |  j d7  _ | j |¡ | j	 ¡ rO| j	 d| j¡ | j	 ¡ sBq| j dkrn| j	 ¡ d }|re|  d|¡ nd S | j dksUd S d S )Nr   rq   rG   )rF  r    Úim_funcÚ	func_codeÚco_argcountrO  r@  rA  rI  r>  Ú
sendpacketr2   rE  r¼   Ú	readreadyÚdispatchÚpacket_handlerÚnext)r   rÝ   Út_classÚtestÚdatar   r   r   Ú
send_testsû  s$   

ÿ€
ûzOS_ID.send_testsc                 C   r9   r   r   r#   r   r   r   Úrun  r;   z	OS_ID.runc                 C   r7   r   )r@  r#   r   r   r   Ú
get_source  r8   zOS_ID.get_sourcec                 C   r7   r   )rA  r#   r   r   r   Ú
get_target  r8   zOS_ID.get_targetc                 C   r7   r   )rI  r#   r   r   r   Ú	get_ports  r8   zOS_ID.get_portsc                 C   s>   | j  |¡}| jD ]}| |¡r| |¡ |  jd8  _q	d S ©NrG   )rD  ÚdecoderE  r@   r:   rF  )r   ÚlenrZ  r5   r€   r   r   r   rV     s   


€ýzOS_ID.packet_handlerN)r%   r&   r'   r    rM  rO  r[  r\  r]  r^  r_  rV  r   r   r   r   r=  Ý  s    r=  c                   @   r}   )Únmap1_tcp_open_1c                 C   s*   t  | |||d¡ | j ¡  | j ¡  d S r`  )r™   r    r€   rã   rá   rç   r   r   r   r    *  s   
znmap1_tcp_open_1.__init__c                 C   rB   ©NÚT1r   r#   r   r   r   r0   /  r;   znmap1_tcp_open_1.test_idc                 C   sH   t  | |¡r"| ¡ }|sdS | ¡ }|sdS | ¡ r | ¡ r dS dS dS rF   )r~   r@   rT   rÁ   r¾   r   r   r   r   r@   2  s   znmap1_tcp_open_1.is_mineN©r%   r&   r'   r    r0   r@   r   r   r   r   rc  )  s    rc  c                   @   r   )Únmap1_tcp_open_2c                 C   s   t  | |||d¡ d S r`  )r™   r    rç   r   r   r   r    C  ó   znmap1_tcp_open_2.__init__c                 C   rB   ©NÚT2r   r#   r   r   r   r0   F  r;   znmap1_tcp_open_2.test_idN©r%   r&   r'   r    r0   r   r   r   r   rg  B  s    rg  c                   @   r   )Únmap2_tcp_open_2c                 C   s.   t  | |||d¡ | j d¡ | j d¡ d S )NrG   é€   )r  r    rI   rh   r€   ræ   rç   r   r   r   r    O  s   znmap2_tcp_open_2.__init__c                 C   rB   ri  r   r#   r   r   r   r0   T  r;   znmap2_tcp_open_2.test_idNrk  r   r   r   r   rl  I  s    rl  c                   @   r   )Únmap1_tcp_open_3c                 C   s>   t  | |||d¡ | j ¡  | j ¡  | j ¡  | j ¡  d S r`  )r™   r    r€   rá   Úset_FINÚset_URGÚset_PSHrç   r   r   r   r    X  s
   


znmap1_tcp_open_3.__init__c                 C   rB   ©NÚT3r   r#   r   r   r   r0   _  r;   znmap1_tcp_open_3.test_idNrk  r   r   r   r   rn  W  s    rn  c                   @   r   )Únmap2_tcp_open_3c                 C   sV   t  | |||d¡ | j ¡  | j ¡  | j ¡  | j ¡  | j d¡ | j 	d¡ d S )NrG   é   r   )
r  r    r€   rá   ro  rp  rq  ræ   rI   rh   rç   r   r   r   r    g  s   



znmap2_tcp_open_3.__init__c                 C   rB   rr  r   r#   r   r   r   r0   p  r;   znmap2_tcp_open_3.test_idNrk  r   r   r   r   rt  b  s    	rt  c                   @   r   )Únmap1_tcp_open_4c                 C   ó    t  | |||d¡ | j ¡  d S r`  ©r™   r    r€   Úset_ACKrç   r   r   r   r    t  ó   znmap1_tcp_open_4.__init__c                 C   rB   ©NÚT4r   r#   r   r   r   r0   x  r;   znmap1_tcp_open_4.test_idNrk  r   r   r   r   rv  s  s    rv  c                   @   r   )Únmap2_tcp_open_4c                 C   ó8   t  | |||d¡ | j ¡  | j d¡ | j d¡ d S )NrG   i   ©r  r    r€   ry  rI   rh   ræ   rç   r   r   r   r    €  ó   
znmap2_tcp_open_4.__init__c                 C   rB   r{  r   r#   r   r   r   r0   †  r;   znmap2_tcp_open_4.test_idNrk  r   r   r   r   r}  {  ó    r}  c                   @   sl   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZd	ZdZdZdZdZdZd	Zd
Zdd„ Zdd„ ZdS )Ú	nmap1_seqr   rG   r   rq   rÿ   é   é    rà   é   é   c                 C   s,   t  | |||d¡ | j ¡  | j |¡ d S r`  )r™   r    r€   rá   r‘   rç   r   r   r   r    ¢  s   
znmap1_seq.__init__c                 C   ó   t d| jj ƒ‚©Nz+Method process is meaningless for class %s.©Ú	Exceptionr/   r%   ©r   r>  r   r   r   r:   §  rÏ   znmap1_seq.processN)r%   r&   r'   ÚSEQ_UNKNOWNÚSEQ_64KÚSEQ_TDÚSEQ_RIÚSEQ_TRÚSEQ_i800ÚSEQ_CONSTANTÚTS_SEQ_UNKNOWNÚTS_SEQ_ZEROÚ
TS_SEQ_2HZÚTS_SEQ_100HZÚTS_SEQ_1000HZÚTS_SEQ_UNSUPPORTEDÚIPID_SEQ_UNKNOWNÚIPID_SEQ_INCRÚIPID_SEQ_BROKEN_INCRÚIPID_SEQ_RPIÚIPID_SEQ_RDÚIPID_SEQ_CONSTANTÚIPID_SEQ_ZEROr    r:   r   r   r   r   r‚  Š  s.    r‚  c                   @   sD   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdd	„ Zd
d„ ZdS )Ú	nmap2_seqr   rG   r…  r   rà   rq   r†  c              	   C   s$   t  | |||d||¡ | j ¡  d S r`  )rÐ   r    r€   rá   )r   r-   rP   r‡   r•   r   r   r   r    ¸  s   ÿznmap2_seq.__init__c                 C   r‡  rˆ  r‰  r‹  r   r   r   r:   ½  rÏ   znmap2_seq.processN)r%   r&   r'   r“  r”  r˜  r™  rš  r›  rœ  r  rž  rŸ  r    r:   r   r   r   r   r   «  s    r   c                   @   óF   e Zd ZeejdƒeejƒeejdƒeejdƒeejƒgZ	dd„ Z
dS )Únmap2_seq_1rœ   rß   r  c                 C   ó$   t  | |||| j¡ | j d¡ d S r`  ©r   r    rž   r€   ræ   rç   r   r   r   r    Ï  ó   znmap2_seq_1.__init__N)r%   r&   r'   r   rË   rÉ   rÆ   rÊ   rë   rž   r    r   r   r   r   r¢  À  ó    


ûr¢  c                   @   sF   e Zd ZeejdƒeejdƒeejƒeejdƒeejƒgZ	dd„ Z
dS )Únmap2_seq_2ix  r   r  c                 C   r£  )Né?   r¤  rç   r   r   r   r    â  r¥  znmap2_seq_2.__init__N)r%   r&   r'   r   rÆ   rË   rë   rÊ   rÅ   rž   r    r   r   r   r   r§  Ó  s    


ûr§  c                   @   sN   e Zd ZeejdƒeejƒeejƒeejdƒeejƒeejdƒgZdd„ Z	dS )Únmap2_seq_3r  r…  i€  c                 C   r£  ©Nrq   r¤  rç   r   r   r   r    ÷  r¥  znmap2_seq_3.__init__N)
r%   r&   r'   r   rÊ   rÉ   rË   rÆ   rž   r    r   r   r   r   r©  æ  s    
	

ú	r©  c                   @   s<   e Zd ZeejƒeejdƒeejdƒeejƒgZdd„ Z	dS )Únmap2_seq_4r  rœ   c                 C   r£  rª  r¤  rç   r   r   r   r      r¥  znmap2_seq_4.__init__N)
r%   r&   r'   r   rë   rÊ   rË   rÅ   rž   r    r   r   r   r   r«  û  s    

ür«  c                   @   r¡  )Únmap2_seq_5i  r  rœ   c                 C   r£  )Nrƒ  r¤  rç   r   r   r   r      r¥  znmap2_seq_5.__init__N)r%   r&   r'   r   rÆ   rë   rÊ   rË   rÅ   rž   r    r   r   r   r   r¬    r¦  r¬  c                   @   s4   e Zd ZeejdƒeejƒeejdƒgZdd„ ZdS )Únmap2_seq_6r›   r  c                 C   r£  )Ni   r¤  rç   r   r   r   r    *  r¥  znmap2_seq_6.__init__N)	r%   r&   r'   r   rÆ   rë   rÊ   rž   r    r   r   r   r   r­    s    

ýr­  c                   @   sÖ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
ejdejdejdejdejdejdiZdd„ ZejdejdejdejdejdiZdd„ Zejd ejd!ejd"ejd#ejdej d$iZ!d%d&„ Z"d'S )(Únmap1_seq_containerc                 C   ó@   t  | d¡ || _|| _t|ƒ| _|| _|| _|| _t	j
| _d S r   )r(   r    Únum_seq_samplesÚseq_responsesrb  Úseq_num_responsesÚ	seq_diffsÚts_diffsÚ
time_diffsr‚  r“  Úpre_ts_seqclass©r   r°  Ú	responsesr³  r´  rµ  r   r   r   r    /  ó   
znmap1_seq_container.__init__c                 C   rB   )NÚTSEQr   r#   r   r   r   r0   :  r;   znmap1_seq_container.test_idc                 C   r   r   ©r¶  ©r   Úts_seqclassr   r   r   Úset_ts_seqclass=  r!   z#nmap1_seq_container.set_ts_seqclassc                 C   s”   |   ¡ }tj| jkr| j}n|  ¡ }| jdkr=|  ¡ }tj|kr%|  |¡ tj	|kr/|  
|¡ tj|kr;|  |¡ d S d S t d| j| jf ¡ d S )Nrq   ú\Insufficient responses for TCP sequencing (%d out of %d), OS detection may be less accurate.)Úipid_sequencer‚  r“  r¶  Úts_sequencer²  Úseq_sequencerŒ  Úadd_seqclassr™  Úadd_ipidclassÚadd_tsclassr   Úerrorr°  )r   Úipid_seqclassr½  Úseq_seqclassr   r   r   r:   @  s    





ÿ

ÿznmap1_seq_container.processc                 C   rÍ   )rC   rÎ   r#   r   r   r   rD   S  s   z$nmap1_seq_container.get_final_resultc                 C   sv  | j dk rtjS t ddg| j d  ¡}d}td| j ƒD ]7}| j|d   ¡ }| j|  ¡ }||k r?|dks:|dk r?tj  S |dksG|dkrId}t|| ƒ||d < q|rYtj	S td| j d ƒD ]}|| dkrntj
  S || dkrytj  S qad}d}td| j d ƒD ]'}|| dkr“tj  S |r¥|| dk r¥|| d	 dkr¥d}|| d
kr­d}q†|r³tjS |r¸tjS tjS )Nr   ÚHr   rG   iô  ièý  éè  i 
  ru  re   )r²  r‚  r™  Úarrayr   r±  Úget_ipidr  ÚabsrŸ  rœ  rž  rš  r›  )r   Ú
ipid_diffsÚ
null_ipidsrI   Ú	prev_ipidÚcur_ipidÚis_incrementalÚis_msr   r   r   rÀ  W  sF   



ÿ
 €z!nmap1_seq_container.ipid_sequencec                 C   s¸   | j dk rtjS d}td| j d ƒD ]}| j| | j|  }||| j d  7 }qt d| ¡ d|  k r;dk r<tjS  d|  k rHdk rItj	S  d	|  k rUd
k rYtj
S  tjS tjS )Nr   ç        r   rG   úThe avg TCP TS HZ is: %fg333333@éU   és   i„  iL  )r²  r‚  r“  r   r´  rµ  r   Úinfor•  r–  r—  )r   Úavg_freqrI   Údhzr   r   r   rÁ  ‡  s"   
	ÿÿÿznmap1_seq_container.ts_sequencec                 C   s†  t t| jƒ| _d}tj}d| jkrJt| jfdd„| jƒ td| jd ƒD ]%}t	| j
|d   ¡ | j
|  ¡  ƒdkrBtj}d| _ n|| j| 7 }q$d| jkrWtj}d| _|S d| jd krftj}d| _|S d| jd krutj}d	| _|S tj|krÁtd
|| jd   ƒ}d}td| jd ƒD ]}t	| j| | ƒ}|t|| ƒ7 }q|| jd  }td
t |¡ ƒ| _| jdk r¾tj}|S tj}|S )Nr   c                 S   s   | | S r   r   )ÚxÚgcdr   r   r   Ú<lambda>¨  s    z2nmap1_seq_container.seq_sequence.<locals>.<lambda>rG   i€ðúi–˜ i ú  i   rœ   ç      à?rÔ  éK   )r   r   r³  Úseq_gcdr‚  rŒ  Úmapr   r²  rÍ  r±  rØ   r  Úindexr’  r  r‘  rø   ÚrangeÚfloatÚmathÚsqrtrŽ  r  )r   Úavg_incrÚseqclassrI   Úsum_incrÚdr   r   r   rÂ  ¢  sH   
(
íð
ó
þz nmap1_seq_container.seq_sequenceÚ64KÚTDÚRIÚTRÚi800ÚCc                 C   sv   |   dtj| ¡ tj|kr|   dd| jd  ¡  ¡ d S |tjtjfv r9|   dd| j	 ¡ |   dd| j
 ¡ d S d S )NÚCLASSÚVALz%ir   ÚGCDÚSI)r>   r®  Ú
seqclassesr‚  r’  r±  rØ   rŽ  r  rà  râ  r,   r   r   r   rÃ  Ñ  s   
þz nmap1_seq_container.add_seqclassr  Ú2HZÚ100HZÚ1000HZr­   c                 C   ó   |   dtj| ¡ d S )NÚTS)r>   r®  Ú	tsclassesr,   r   r   r   rÅ  â  rh  znmap1_seq_container.add_tsclassr7  ÚBIÚRPIÚRDrõ   c                 C   rù  )NÚIPID)r>   r®  Úipidclassesr,   r   r   r   rÄ  î  rh  z!nmap1_seq_container.add_ipidclassN)#r%   r&   r'   r    r0   r¾  r:   rD   rÀ  rÁ  rÂ  r‚  r  rŽ  r  r  r‘  r’  rõ  rÃ  r”  r•  r–  r—  r˜  rû  rÅ  rš  r›  rœ  r  rž  rŸ  r   rÄ  r   r   r   r   r®  .  s@    0'ú	
ûú	r®  c                   @   óL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )Únmap2_seq_containerc                 C   r¯  r   )r(   r    r°  r±  rb  r²  r³  r´  rµ  r   r“  r¶  r·  r   r   r   r    ó  r¹  znmap2_seq_container.__init__c                 C   rB   )NÚSEQr   r#   r   r   r   r0   þ  r;   znmap2_seq_container.test_idc                 C   r   r   r»  r¼  r   r   r   r¾    r!   z#nmap2_seq_container.set_ts_seqclassc                 C   sL   | j dkr|  ¡  |  ¡  |  ¡  d S |  dd¡ t d| j | jf ¡ d S )Nrq   r°   r¤   r¿  )r²  Úcalc_tiÚcalc_tsÚcalc_spr>   r   rÆ  r°  r#   r   r   r   r:     s   


ÿznmap2_seq_container.processc                 C   rÍ   r   rÎ   r#   r   r   r   rD     rÏ   z$nmap2_seq_container.get_final_resultc           
      C   s`  | j dk rd S tjdtjdtjdtjdtjdtjdi}t dd	g| j d
  ¡}d
}t	d
| j ƒD ]N}| j
|d
   ¡ }| j
|  ¡ }|d	ksI|d	krKd	}||krX|| ||d
 < n|| d d@ ||d
 < | j dkr}||d
  dkr}|  d|tj ¡  d S q/|r‹|  d|tj ¡ d S d
}t	d	| j d
 ƒD ]}|| d	kr¡d	} nq•|r¯|  d|tj ¡ d S t	d	| j d
 ƒD ]*}|| dkrá|| d d	ksÕ|| d d	krá|| dkrá|  d|tj ¡  d S q·d
}d
}	t	d	| j d
 ƒD ]#}|	r|| dks|| d d	krd	}	|r|| dkrd	}qî|	r |  d|tj ¡ d S |r.|  d|tj ¡ d S d S )Nr   r7  rü  rí  rþ  rð  rõ   rÉ  r   rG   i   rN  i N  ÚTIrÊ  ru  i d  i   re   )r²  r   rš  r›  rœ  r  rž  rŸ  rË  r   r±  rÌ  r>   )
r   r   rÎ  rÏ  rI   rÐ  rÑ  Úall_zerorÒ  rÓ  r   r   r   r    sn   
ú	€þ€&€ÿznmap2_seq_container.calc_tic                 C   s,  | j tjkr|  dd¡ n| j tjkr|  dd¡ n| jdk r!d S d}td| jd ƒD ]}| j| | j|  }||| jd  7 }q+t	 
d| ¡ |d	krT|  dd
¡ d S d|  k r^dkrhn n|  dd¡ d S d|  k rrdkr|n n|  dd¡ d S ttdt |¡t d¡  ƒƒ}|  dd| ¡ d S )Nrú  r  r­   r   rÔ  r   rG   rÕ  g¤p=
×£@Ú1éF   é–   Ú7i^  Ú8rÞ  ró   )r¶  r   r”  r>   r˜  r²  r   r´  rµ  r   rØ  rø   Úroundrå  Úlog)r   rÙ  rI   rÚ  Útsr   r   r   r  W  s&   
 znmap2_seq_container.calc_tsc           	      C   sZ  t t| jƒ}d}td| jd ƒD ]}|| j| | j|  7 }q|| jd  }|}d}d}d|kr3d}n`ttdt 	|¡t 	d¡ d  ƒƒ}d}|dkrM|}td| jd ƒD ]}| j| | j|  | ||  }||| 7 }qU|| jd  }t 
|¡}|dkrd}nttdt 	|¡t 	d¡ d  ƒƒ}|  d	d
| ¡ |  dd
| ¡ |  dd
| ¡ d S )NrÔ  r   rG   rÞ  r   rÿ   re   g       @ÚSPró   ró  ÚISR)r   r   r³  r   r²  rµ  rø   r  rå  r  ræ  r>   )	r   rà  Úseq_avg_raterI   Úseq_rateÚsi_indexÚ
seq_stddevÚdiv_gcdÚrtmpr   r   r   r  }  s6   $ÿ
$znmap2_seq_container.calc_spN)r%   r&   r'   r    r0   r¾  r:   rD   r  r  r  r   r   r   r   r  ò  s    
F&r  c                   @   r
  )
Únmap2_ops_containerc                 C   ó    t  | d¡ || _t|ƒ| _d S r   ©r(   r    r±  rb  r²  ©r   r¸  r   r   r   r    ¤  ó   znmap2_ops_container.__init__c                 C   rB   )NÚOPSr   r#   r   r   r   r0   ª  r;   znmap2_ops_container.test_idc                 C   ój   | j dkr|  dd¡ d S td| j ƒD ]}t| j|  ¡ | j|  ¡ ddƒ}|  d|d  | ¡ ¡ qd S )Nr†  r°   r¤   r   zO%irG   )r²  r>   r   rÕ   r±  Úget_ipÚget_tcprÃ   ©r   rI   rÝ   r   r   r   r:   ­  ó   
ýûznmap2_ops_container.processc                 C   ó   |   ¡ sd S |  ¡ |   ¡ iS r   ©rA   r0   r#   r   r   r   rD   ¹  ó   z$nmap2_ops_container.get_final_resultN©r%   r&   r'   r    r0   r:   rD   r   r   r   r   r  £  ó
    r  c                   @   r
  )
Únmap2_win_containerc                 C   r  r   r  r  r   r   r   r    À  r  znmap2_win_container.__init__c                 C   rB   )NÚWINr   r#   r   r   r   r0   Æ  r;   znmap2_win_container.test_idc                 C   r  )Nr†  r°   r¤   r   zW%irG   )r²  r>   r   rÕ   r±  r   r!  r×   r"  r   r   r   r:   É  r#  znmap2_win_container.processc                 C   r$  r   r%  r#   r   r   r   rD   Õ  r&  z$nmap2_win_container.get_final_resultNr'  r   r   r   r   r)  ¿  r(  r)  c                   @   r
  )
Únmap2_t1_containerc                 C   s&   t  | d¡ || _t|ƒ| _|| _d S r   )r(   r    r±  rb  r²  Úseq_base)r   r¸  r,  r   r   r   r    Ü  s   

znmap2_t1_container.__init__c                 C   rB   rd  r   r#   r   r   r   r0   ã  r;   znmap2_t1_container.test_idc                 C   sž   | j dk r|  dd¡ d S | jd }t| ¡ | ¡ | jtjƒ}|  dd¡ |  d| 	¡ ¡ |  d| 
¡ ¡ |  d| ¡ ¡ |  d	| ¡ ¡ |  d
| ¡ ¡ d S )NrG   r°   r¤   r   r£   r§   rª   r®   r±   rÔ   )r²  r>   r±  rÕ   r   r!  r,  rÐ   rÒ   rÖ   rØ   rÙ   rÚ   rÛ   )r   ÚresponserÝ   r   r   r   r:   æ  s   

ýznmap2_t1_container.processc                 C   r$  r   r%  r#   r   r   r   rD   ø  r&  z#nmap2_t1_container.get_final_resultNr'  r   r   r   r   r+  Û  s
    r+  c                   @   r
  )
Únmap2_icmp_containerc                 C   r  r   )r(   r    Úicmp_responsesrb  Úicmp_num_responsesr  r   r   r   r    ÿ  r  znmap2_icmp_container.__init__c                 C   rB   )NÚIEr   r#   r   r   r   r0     r;   znmap2_icmp_container.test_idc                 C   sJ  | j dkr|  dd¡ d S | jd  ¡ }| jd  ¡ }| ¡ }| ¡ }|  dd¡ | ¡ s8| ¡ s8|  dd¡ n$| ¡ rG| ¡ sG|  dd¡ n| ¡ rV| ¡ rV|  dd¡ n|  dd	¡ | ¡ dkro| ¡ dkro|  d
d¡ n,| ¡ dkr‚| ¡ dkr‚|  d
d¡ n| ¡ | ¡ kr•|  d
d| ¡  ¡ n|  d
d	¡ | ¡ dkr®| ¡ dkr®|  dd¡ n,| ¡ dkrÁ| ¡ dkrÁ|  dd¡ n| ¡ | ¡ krÔ|  dd| ¡  ¡ n|  dd	¡ | ¡ dkrî| ¡ dkrî|  dd¡ d S | ¡ tj	kr| ¡ tj	d kr|  dd¡ d S | ¡ | ¡ kr|  dd| ¡  ¡ d S |  dd	¡ d S )Nr   r°   r¤   r   rG   r£   ÚDFIrª   r«   ÚTOSIrõ   rq   ró   ÚCDre   rô  )
r0  r>   r/  rT   r¸   r  rz   Úget_icmp_seqrd   rl   )r   Úip1Úip2Úicmp1Úicmp2r   r   r   r:     sJ   
znmap2_icmp_container.processc                 C   r$  r   r%  r#   r   r   r   rD   N  r&  z%nmap2_icmp_container.get_final_resultNr'  r   r   r   r   r.  þ  s
    Fr.  c                   @   r}   )Únmap1_tcp_closed_1c                 C   rw  r   )r™   r    r€   rá   rç   r   r   r   r    U  rz  znmap1_tcp_closed_1.__init__c                 C   rB   ©NÚT5r   r#   r   r   r   r0   Y  r;   znmap1_tcp_closed_1.test_idc                 C   s@   t  | |¡r| ¡ }|sdS | ¡ }|sdS | ¡ rdS dS dS rF   )r~   r@   rT   rÀ   r   r   r   r   r@   \  s   znmap1_tcp_closed_1.is_mineNrf  r   r   r   r   r:  T  s    r:  c                   @   r   )Únmap2_tcp_closed_1c                 C   r~  )Nr   iiz  )r  r    r€   rá   rI   rh   ræ   rç   r   r   r   r    p  r€  znmap2_tcp_closed_1.__init__c                 C   rB   r;  r   r#   r   r   r   r0   v  r;   znmap2_tcp_closed_1.test_idNrk  r   r   r   r   r=  k  r  r=  c                   @   r   )Únmap1_tcp_closed_2c                 C   rw  r   rx  rç   r   r   r   r    |  rz  znmap1_tcp_closed_2.__init__c                 C   rB   ©NÚT6r   r#   r   r   r   r0   €  r;   znmap1_tcp_closed_2.test_idNrk  r   r   r   r   r>  z  s    r>  c                   @   r   )Únmap2_tcp_closed_2c                 C   s8   t  | |||d¡ | j ¡  | j d¡ | j d¡ d S )Nr   rG   i €  r  rç   r   r   r   r    ‰  r€  znmap2_tcp_closed_2.__init__c                 C   rB   r?  r   r#   r   r   r   r0     r;   znmap2_tcp_closed_2.test_idNrk  r   r   r   r   rA  „  r  rA  c                   @   r   )Únmap1_tcp_closed_3c                 C   s4   t  | |||d¡ | j ¡  | j ¡  | j ¡  d S r   )r™   r    r€   ro  rp  rq  rç   r   r   r   r    •  s   

znmap1_tcp_closed_3.__init__c                 C   rB   ©NÚT7r   r#   r   r   r   r0   ›  r;   znmap1_tcp_closed_3.test_idNrk  r   r   r   r   rB  “  s    rB  c                   @   r   )Únmap2_tcp_closed_3c                 C   sL   t  | |||d¡ | j ¡  | j ¡  | j ¡  | j d¡ | j d¡ d S )Nr   rN  )	r	  r    r€   ro  rp  rq  ræ   rI   rh   rç   r   r   r   r    ¤  s   


znmap2_tcp_closed_3.__init__c                 C   rB   rC  r   r#   r   r   r   r0   ¬  r;   znmap2_tcp_closed_3.test_idNrk  r   r   r   r   rE  Ÿ  s    rE  c                   @   r  )ÚNMAP2_OS_Classc                 C   rí   r   )Ú_NMAP2_OS_Class__vendorÚ_NMAP2_OS_Class__nameÚ_NMAP2_OS_Class__familyÚ_NMAP2_OS_Class__device_type)r   Úvendorr=   ÚfamilyÚdevice_typer   r   r   r    ±  rò   zNMAP2_OS_Class.__init__c                 C   r7   r   )rG  r#   r   r   r   Ú
get_vendor·  r8   zNMAP2_OS_Class.get_vendorc                 C   r7   r   )rH  r#   r   r   r   Úget_name¹  r8   zNMAP2_OS_Class.get_namec                 C   r7   r   )rI  r#   r   r   r   Ú
get_family»  r8   zNMAP2_OS_Class.get_familyc                 C   r7   r   )rJ  r#   r   r   r   Úget_device_type½  r8   zNMAP2_OS_Class.get_device_typeN)r%   r&   r'   r    rN  rO  rP  rQ  r   r   r   r   rF  °  s    rF  c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZddiddiddidœZdd„ Z	dd„ Z
dd„ ZdS )ÚNMAP2_Fingerprintc                 C   s   || _ || _|| _d S r   )Ú_NMAP2_Fingerprint__idÚ_NMAP2_Fingerprint__os_classÚ_NMAP2_Fingerprint__tests)r   r-   Úos_classrÝ   r   r   r   r    Á  r.   zNMAP2_Fingerprint.__init__c                 C   r7   r   )rS  r#   r   r   r   r?   Æ  r8   zNMAP2_Fingerprint.get_idc                 C   r7   r   )rT  r#   r   r   r   Úget_os_classÈ  r8   zNMAP2_Fingerprint.get_os_classc                 C   r7   r   )rU  r#   r   r   r   Ú	get_testsÊ  r8   zNMAP2_Fingerprint.get_testsc                 C   s˜   d| j  }|d| j ¡  7 }|d| j ¡  7 }|d| j ¡  7 }|d| j ¡  7 }| jD ]}|d| 7 }| j| D ]}|d|| j| | f 7 }q9q,|S )NzFP: [%s]z
 vendor: %sz

 name: %sz
 family: %sz
 device_type: %sz
  test: %sz
   %s = [%s])rS  rT  rN  rO  rP  rQ  rU  )r   ÚretrY  Úpairr   r   r   r$   Í  s   

ÿzNMAP2_Fingerprint.__str__r6  r4  r0  r9  )r5  r  r:  c                 C   sL   zt |dƒW S  ty%   |tjv r"|tj| v r"tj| |  Y S Y dS w )Nrƒ  r   )rø   Ú
ValueErrorrR  Úliteral_conv)r   Úfieldr   r   r   r   Ú	parse_intß  s   
üzNMAP2_Fingerprint.parse_intc                 C   sê   |  d¡}|D ]k}| d¡r"|  ||¡|  ||dd … ¡kr! dS q| d¡r;|  ||¡|  ||dd … ¡k r: dS q| d¡dkrg|  d¡}|  ||¡|  ||d ¡krf|  ||¡|  ||d ¡krf dS qt|ƒt|ƒkrr dS qd	S )
Nú|ú>rG   Tú<ú-éÿÿÿÿr   F)ÚsplitÚ
startswithr^  ÚfindÚstr)r   r]  Úrefr   r•   Úoptionrã  r   r   r   Úmatchè  s0   


ÿþ

ÿþ
€ÿzNMAP2_Fingerprint.matchc           
      C   s¨   d}d}| j D ]D}||vrq| j | D ]7}||| vs%||vs%||| vr&q| j | | }|| | }t|| | ƒ}	||	7 }|  |||¡rJ||	7 }qq|t|ƒ d S )Nr   éd   )rU  rø   rj  rä  )
r   ÚsampleÚmpÚ
max_pointsÚtotal_pointsrY  r]  rh  r   Úpointsr   r   r   Úcompareÿ  s&   
€ñzNMAP2_Fingerprint.compareN)r%   r&   r'   r    r?   rW  rX  r$   r\  r^  rj  rq  r   r   r   r   rR  À  s    þ	rR  c                   @   r  )ÚNMAP2_Fingerprint_Matcherc                 C   r   r   )Ú$_NMAP2_Fingerprint_Matcher__filename)r   Úfilenamer   r   r   r      r!   z"NMAP2_Fingerprint_Matcher.__init__c           
   
   C   sâ   g }zVt | jdƒ}|  |  |¡¡}|  |¡D ];}|  |¡}| ||¡}||krQtd| ¡ |f ƒ | 	|d | ¡ | 
¡  ¡ | 
¡  ¡ | 
¡  ¡ | 
¡  ¡ ff¡ q| ¡  W |S  typ }	 ztd|	ƒ W Y d }	~	|S d }	~	ww )NÚrz'"%s" matches with an accuracy of %.2f%%rk  zIOError: %s)Úopenrs  Úparse_mpÚmatchpointsÚfingerprintsÚparse_fprq  Úprintr?   r¼   rW  rN  rO  rP  rQ  rL  ÚIOError)
r   ÚresÚ	thresholdÚoutputÚinfilerm  ÚfingerprintÚfpÚ
similarityÚerrr   r   r   Úfind_matches  s6   

ÿ




ýþ€
ý€ýz&NMAP2_Fingerprint_Matcher.find_matchesc                 c   sz    d}d}|}g }|D ](}|  ¡ }||kr | |¡r|}|g}q||kr3|r,| |¡ q|}|V  g }q|r;|V  d S d S rF   )Ústripre  r¼   )r   r€  ÚtokenÚOUTÚINÚstater  Úliner   r   r   Úsections:  s,   €
€€
ÿz"NMAP2_Fingerprint_Matcher.sectionsc                 c   s    |   |d¡D ]}|V  qd S )NÚFingerprint)rŒ  )r   r€  Úsectionr   r   r   ry  R  s   €ÿz&NMAP2_Fingerprint_Matcher.fingerprintsc                 C   s   |   |d¡ ¡ S )NÚMatchPoints)rŒ  rW  )r   r€  r   r   r   rx  V  rÏ   z%NMAP2_Fingerprint_Matcher.matchpointsc                 C   sd   |d |  d¡… }||  d¡d |  d¡… }i }| d¡D ]}| d¡}|d ||d < q||fS )Nú(rG   ú)ú%ú=r   )rf  rd  )r   r‹  r=   ÚpairsrY  rZ  r   r   r   Ú
parse_lineY  s   
z$NMAP2_Fingerprint_Matcher.parse_linec                 C   s¬   i }|D ]K}|  d¡rq|  d¡r|tdƒd d … }q|  d¡rB|tdƒd d …  d¡\}}}}t| ¡ | ¡ | ¡ | ¡ ƒ}	q|  |¡}
|
d ||
d < qt||	|ƒS )Nú#r  rG   ÚClassr_  r   )re  rb  rd  rF  r†  r•  rR  )r   r‚  rÝ   r‹  r  rK  r=   rL  rM  rV  rY  r   r   r   rz  e  s(   


ýý
z"NMAP2_Fingerprint_Matcher.parse_fpc                 C   sD   i }|D ]}|  d¡rq|  d¡rq|  |¡}|d ||d < q|S )Nr–  r  rG   r   )re  r•  )r   r‚  rÝ   r‹  rY  r   r   r   rw  |  s   


z"NMAP2_Fingerprint_Matcher.parse_mpN)r%   r&   r'   r    r…  rŒ  ry  rx  r•  rz  rw  r   r   r   r   rr    s    rr  )LÚwarningsÚimpacketr   ÚwarnÚDEPRECATION_WARNING_BANNERÚDeprecationWarningrå  rË  Ú	six.movesr   r   Úpcapyr   r	   Úimpacket.ImpactPacketr
   r   r   r   r   r   r   Úimpacket.ImpactDecoderr   r   Úg_nmap1_signature_filenameÚg_nmap2_signature_filenamer   r   r(   rE   rd   rp   rs   r~   r   r™   rÐ   rÞ   rÕ   r  r	  r  r  r.  r=  rc  rg  rl  rn  rt  rv  r}  r‚  r   r¢  r§  r©  r«  r¬  r­  r®  r  r  r)  r+  r.  r:  r=  r>  rA  rB  rE  rF  rR  rr  r   r   r   r   Ú<module>   sŠ   ý$&.,2^'F 7Q 1L! E 2#V
[