
    hz}                        d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZ ddlmZ g dZ eed          e_        dZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ddddddZ( G d de)          Z* G d de)          Z+ G d d e)          Z, G d! d"e)          Z- G d# d$e)          Z. G d% d&e          Z/ e/ej                  Z0d' Z1d3d*Z2d+ Z3d, Z4d- Z5d. Z6d/ Z7d0 Z8	 	 d4d2Z9dS )5z+
Clone of p0f v3 passive OS fingerprinting
    N)KnowledgeBaseselect_path)conf)raworb)	NoPayload)IPTCP
TCPOptions)HTTPHTTPRequestHTTPResponse)IPv6)RandByte	RandShort
RandString)warning)z/etc/p0fz/usr/share/p0fz
/opt/localzp0f.fp(   <   #               msswssoksackts)r   r   r         c                   N    e Zd Zg dZd Zed             Zed             Zd ZdS )TCP_Signatureolayoutquirks
ip_opt_lenip_verttlr   winwin_typewscale	pay_classts1c                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        d S Nr$   )selfr%   r&   r'   r(   r)   r   r*   r+   r,   r-   r.   s               U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/modules/p0f.py__init__zTCP_Signature.__init__4   sS    $ "    c                    |j         }t                      fd}|dk    r|j        }|j        dz  dz
  }|j        dz  r |d           |j        j        r |d           |j        j        r |d           |j        r |d           nG|j        d	k    r |d
           n0|j	        }d	}|j
        r |d           |j        dz  r |d           |t                   }|j        }|j        dz  r |d           |j        d	k    r |d           |j        j        r|j        d	k    r |d           n|j        r |d           |j        j        r |d           n|j        r |d           |j        j        r |d           |j        rdnd	}d	}	d	}
d	}d}|j        dz  dz
  }t-          |          | d         }|r%t/          |d	                   }|d	k    rA|dd         }|dt1          |          z  z  }|                    d          r |d           n|dk    r|dd         }|dz  }u	 t/          |d                   }n# t4          $ r  |d           Y nw xY w|d|         }|t6          v r4t8          d	         |         d         }|dt6          |         z  z  }|rdt;          j        |          z   nd}t1          |          |k     r |d           n|dk    r|dk     s|dk    r |d           nn||k    r |d           n|r0t;          j        ||          }t1          |          dk    r|d	         }|dk    r|}	n|dk    r|}
|
d k    r |d!           nr|d"k    r@|d	         }|s |d#           |d         r#|j        j         r|j        j        s |d$           n+|dk     s|d%k    s|t1          |          k    r |d           n||d         }|%|dd&         } | |||||	|d|
||          S )'zi
        Receives a TCP packet (assuming it's valid), and returns
        a TCP_Signature object
        c                 2                         |            d S r0   )add)namer&   s    r2   addqz'TCP_Signature.from_packet.<locals>.addqK   s    JJtr4   r      r   ecn0+dfid+r   id-flow   seq-ack-ack+urgf+uptr+pushf+r    r   Nzeol+%i,    opt+znop,badz%s,r    
   "      exwsr!   ts1-ts2+r   )!versionsetr)   ihltosflagsevilDFidhlimfltcr
   windowseqAackUurgptrPpayloaddataofsr   r   lenstrip
IndexErrortcp_options_p0fr   structcalcsizeunpackS)clspktr(   r9   r)   r'   tcpr*   r-   r   r,   r.   r%   optlenxonumolenovalofmtoptsizer&   s                       @r2   from_packetzTCP_Signature.from_packetB   s    	 	 	 	 	 Q;;'C'A++Jw+& Uy~ T


y| T


6  DKKK1U(CJv Vv% U #hj9*+ 	DKKK7a<<DLLL9; 	w!||VW 	DLLL9; 	DMMMMZ 	DMMM9; 	DNNN+AA!	 +"b(HHfWXX 6	qt99DqyyabbE9s1vv--777## !DLLLqyyabbE6!1Q4yy   U QtV9D&&!!}T*1-5?4#8887;B!fod3333q66G##DKKK199byyD2IIU %. wU +%}T488t99>>#'7Dqyy"!%!B;; DLLL"1g" ) DLLL7 )	 )CIK ) DLLL!88tbyyD3q66MMDKKK$%%Am  6	n #2#,s7FJS#tVU^`cddds   6I I%$I%c                    t          |d          \  }}}}}}}}	|                    d          \  }}
}|dk    rdnt          |          }|d         dk    rt          |dd                   dfnt          |          df\  }}t          |          }|dk    rdnt          |          }|dk    r
d	t          }}n|dd
         dk    rt          |dd                   t          }}nn|d	         dk    rt          |dd                   t
          }}nC|dd
         dk    rt          |dd                   t          }}nt          |          t          }}|dk    rdnt          |          }|r-t          d |	                    d          D                       }nt                      }|	dk    rdnt          |	dk              } | ||||||||||d          }||fS )z|
        Parses a TCP sig line and returns a tuple consisting of a
        TCP_Signature object and bad_ttl as bool
        r!   ,*rR   -NTFr   r   r   r   %r   mtuc              3      K   | ]}|V  d S r0    .0qs     r2   	<genexpr>z-TCP_Signature.from_raw_sig.<locals>.<genexpr>   s"      <<Qq<<<<<<r4   +)
lparse	partitionintWIN_TYPE_ANYWIN_TYPE_MSSWIN_TYPE_MODWIN_TYPE_MTUWIN_TYPE_NORMAL	frozensetsplit)ro   sig_lineverr)   ru   r   wsizer%   r&   pclass_scaler(   bad_ttlr'   r*   r+   r,   r-   sigs                       r2   from_raw_sigzTCP_Signature.from_raw_sig   s    ?EXq>Q>Q;S$UGVV//#..q%czzs3xx03B3CHt,,SXXuDUWYY
3JJbbCHHC<<CC2A2Y% qrr^^\CC1X__ qrr^^\CC2A2Y% qrr^^\CC ZZC||U 	!<<&,,s*;*;<<<<<FF[[F C--BBS3-?-?	c'6:vsChPVXacghhG|r4   c                     d                     d | j        D                       }d}|| j        | j        t	          | j                  | j        | j        | j        | j        | j	        || j
        f
z  }|S )Nr{   c              3      K   | ]}|V  d S r0   r   r   s     r2   r   z(TCP_Signature.__str__.<locals>.<genexpr>   s"      11!111111r4   z%i:%i+%i:%i:%i:%i,%i:%s:%s:%i)joinr&   r(   r)   
guess_distr'   r   r*   r,   r%   r-   )r1   r&   fmtss       r2   __str__zTCP_Signature.__str__   so    11T[11111-4;*TX*>*>?DHdh<9 9 r4   N	__name__
__module____qualname__	__slots__r3   classmethodry   r   r   r   r4   r2   r#   r#   0   s        I I II   ve ve [vep   [@    r4   r#   c                   N    e Zd Zg dZd Zed             Zed             Zd ZdS )HTTP_Signaturehttp_verhdrhdr_sethabsentswc                 L    || _         || _        || _        || _        || _        d S r0   r   )r1   r   r   r   r   r   s         r2   r3   zHTTP_Signature.__init__   s)     r4   c                    t          |t                   j                  }d}|                    |          }|dk    r|d|t	          |          z            }n|}|                                }|                    dd          \  }}d|v rd}nd|v rd}nt          d	          d
}g }	t                      }
|                    d          D ]c}|	                    d          \  }}}|rF|
                                }|	                    ||f           |
                    |           |dv r|}dt          |	          } | |||
d|          S )zl
        Receives an HTTP packet (assuming it's valid), and returns
        a HTTP_Signature object
        s   

rR   Nz
r   z1.0r   z1.1zHTTP version is not 1.0/1.1rH   :)
User-AgentServer)r   r
   re   findrg   decoder   
ValueErrorrT   r   rh   appendr7   tuple)ro   rp   http_payloadcrlfcrlfcrlfcrlfIndexheaders
first_liner   r   headers_foundr   header_liner8   r   valuer   s                   r2   ry   zHTTP_Signature.from_packet   st    3s8+,,$))(33B"#AMCMM$A#ABGG"G..""%mmFA66
GJHHj  HH:;;;%%"==00 	 	K(22377ND!U $$dE]333D!!!333BM""s8S'4444r4   c                    t          |d          \  }}}}|dk    rdnt          |          }g }t          j        d|          D ]p}|                    d          \  }	}
}|	d         dk    r)|                    |	dd	         |dd         d
f           P|                    |	|dd         df           qt          |          }t          d |D                       }t          |                    d                    } | |||||          S )zM
        Parses an HTTP sig line and returns a HTTP_Signature object
        r   r|   rR   z,(?![^\[]*\])=r   ?r   NTFc              3   6   K   | ]}|d          
|d         V  dS )r   r   Nr   )r   headers     r2   r   z.HTTP_Signature.from_raw_sig.<locals>.<genexpr>&  s/      II&vayIF1IIIIIIIr4   r{   )r   r   rer   r   r   r   r   )ro   r   r   horderr   expswr   
new_horderr   r8   r   r   r   r   s                 r2   r   zHTTP_Signature.from_raw_sig  s*   
 '-Xq&9&9#VWe22S 
h/88 	> 	>F#--c22ND!UAw#~~!!48U1R4[$"?@@@@!!4qte"<====JIICIIIIIGMM#..//s8S'7E:::r4   c                     dd                     fd| j        D                       }d}|| j        || j        fz  }|S )N)Hostr   DatezContent-Typer   r{   c              3   :   K   | ]\  }}|v r|n|d |dV  dS )z=[]Nr   )r   nvskipvals      r2   r   z)HTTP_Signature.__str__.<locals>.<genexpr>-  s@      VVTQALLqq111aaa.@VVVVVVr4   z	%i:%s::%s)r   r   r   r   )r1   r   r   r   r   s       @r2   r   zHTTP_Signature.__str__*  sO    JhhVVVVTXVVVVV4=#tw//r4   Nr   r   r4   r2   r   r      st        ???I   #5 #5 [#5J ; ; [;(    r4   r   c                       e Zd ZddgZd ZdS )
MTU_Recordlabel_idr   c                 <    || _         t          |          | _        d S r0   )r   r   r   r1   r   r   s      r2   r3   zMTU_Record.__init__7  s     x==r4   Nr   r   r   r   r3   r   r4   r2   r   r   4  s-        U#I! ! ! ! !r4   r   c                       e Zd Zg dZd ZdS )
TCP_Record)r   r   r   c                 j    || _         t                              |          \  }}|| _        || _        d S r0   )r   r#   r   r   r   )r1   r   r   r   r   s        r2   r3   zTCP_Record.__init__?  s2     $11(;;Wr4   Nr   r   r4   r2   r   r   <  s.        ...I    r4   r   c                       e Zd ZddgZd ZdS )HTTP_Recordr   r   c                 R    || _         t                              |          | _        d S r0   )r   r   r   r   r   s      r2   r3   zHTTP_Record.__init__I  s"     !..x88r4   Nr   r   r4   r2   r   r   F  s-        U#I9 9 9 9 9r4   r   c                   8    e Zd ZdZd Zd Zd	dZd Zd Zd Z	dS )
p0fKnowledgeBasez
    self.base = {
        "mtu" (str): [sig(tuple), ...]
        "tcp"/"http" (str): {
            direction (str): [sig(tuple), ...]
            }
    }
    self.labels = (label(tuple), ...)
    c                    	 t          | j                  }n&# t          $ r t          d| j                   Y d S w xY wi | _        g | _        |                     |           t          | j                  | _        |                                 d S )NzCan't open base %s)	openfilename	Exceptionr   baselabels_parse_filer   close)r1   fs     r2   	lazy_initzp0fKnowledgeBase.lazy_initX  s    	T]##AA 	 	 	($-888FF	 	DK((						s    ::c                    d}|D ]}|d         dv r|                                 }|d         dk    rt          |dd         d          \  }}|dk    rg | j        |<   | j        |         }g|| j        vr|g i| j        |<   n|| j        |         vrg | j        |         |<   | j        |         |         }|                    d          \  }}}	|                                 }|d	k    rJ|dk    rt          }
n|d
k    rt
          }
n|dk    rt          }
|                     |
||	                     -|dk    r\|dz  }|dk    r| j                            |	           Zt          |	d          \  }}}}| j                            ||||f           |dk    rBt          d |	
                    d          D                       }| j        |xx         |fz  cc<   dS )zS
        Parses p0f.fp file and stores the data with described structures.
        rR   r   );
[r   r   r    = r   rq   httplabelr   sysc              3      K   | ]}|V  d S r0   r   r   r8   s     r2   r   z/p0fKnowledgeBase._parse_file.<locals>.<genexpr>  s"      %F%Ftd%F%F%F%F%F%Fr4   r{   N)rh   r   r   r   r   r   r   r   r   r   r   )r1   filer   linesection	directioncurr_recordsparamr   valrecord_classtcr8   flavor	sys_namess                   r2   r   zp0fKnowledgeBase._parse_filee  s*     (	: (	:DAw+%%::<<DAw#~~%+D2J%:%:"e##)+DIg&#'9W#5LLdi//.7_	'**"$)G*<<<8:	'*95#'9W#5i#@LL $u 5 5q#E>>%'''1 E))'1 F**'2 ''Xs(C(CDDDDg%%MH%''**3/// )/Q&Aq$K&&1dF';<<<<e^^ %%F%Fsyy~~%F%F%F F FIK)))i\9)))Q(	: (	:r4   Nc                     g }| j         d         |         D ]g}| j        |j                 }|d         |d         }}|rA||k    r;|r||v r|                    |j                   M|                    |j                   h|S )a{  Get TCP signatures that match an OS genre and details (if specified).
        If osdetails isn't specified, then we pick all signatures
        that match osgenre.

        Examples:
            >>> p0fdb.get_sigs_by_os("request", "Linux", "2.6")
            >>> p0fdb.get_sigs_by_os("response", "Windows", "8")
            >>> p0fdb.get_sigs_by_os("request", "FreeBSD")
        rq   r   r   )r   r   r   r   r   )	r1   r   osgenre	osdetailssigs
tcp_recordr   r8   r   s	            r2   get_sigs_by_oszp0fKnowledgeBase.get_sigs_by_os  s     )E*95 	0 	0JK
 34E 8U1X&D 07d?? 0 F**JN333KK
///r4   c                 D   t          |          \  }}d}d}| j        d         |         D ]}|j        }d}	|j        }
|j        |j        k    r$|j        dk    r|
|j        dk    rdhnh dz  }
|
|j        k    r2|
|j        z  |
z  }|
|j        z  |j        z  }|s|dd	hz
  s|d
dhz
  rd}	|j        |j        k    r|j        r|j        |j        k     rn*|j        |j        k     s|j        |j        z
  t          k    rd}	|j
        dk    r|j
        |j
        k    s6|j        dk    r|j        |j        k    s|j        dk    r|j        |j        k    r(|j        t          k    r|j        |j        k    rJna|j        t           k    r|j        |j        z  rln?|j        t"          k    r|s|j        |k    rn|j        t$          k    r|r|j        |k    r| j        |j                 }||j        |j        z
  |	f}|	s|d         dk    r|c S |s|}|s|}|r|S |r|S dS )a;  
        Finds the best match for the given signature and direction.
        If a match is found, returns a tuple consisting of:
        - label: the matched label
        - dist: guessed distance from the packet source
        - fuzzy: whether the match is fuzzy
        Returns None if no match was found
        Nrq   FrR   r   r@   >   r=   r>   r?   r=   r>   r?   r;   Tr   r   )detect_win_multir   r   r&   r%   r(   r'   r   r)   MAX_DISTr   r,   r-   r+   r   r*   r   r   r   r   r   )r1   r   r   	win_multiuse_mtugmatchfmatchr  rsfuzzy
ref_quirksdeletedaddedr   matchs                  r2   tcp_find_matchzp0fKnowledgeBase.tcp_find_match  s    .b11	7)E*95 8	 8	JBEJzRZ''yB")q..vhh>R>R>RR
RY&&%	1Z?#bi/29< w$6 EUEN<R }--! !6BF?? # 6BF??bfrvo&@&@ E2"&BF"2"2	RBI$:$:""r|r|'C'C{o--6RV## $,,6BF? ,, rv22  3,, 26Y#6#6 K
 34EBFRVOU3E 8s?? LLL #"F  	M 	Mtr4   c                   	 d}| j         d         |         D ]}|j        		j        dk    r	j        j        k    r%j        	j        z  	j        k    s>t	          	j        j        z            dk    r_	fd} |            sp| j        |j                 }	j        oj        o	j        j        v}||f}|d         dk    r|c S |s|}|r|ndS )a  
        Finds the best match for the given signature and direction.
        If a match is found, returns a tuple consisting of:
        - label: the matched label
        - dishonest: whether the software was detected as dishonest
        Returns None if no match was found
        Nr   rR   r   c                     d} t          j                  }j        D ]}| }| |k     rE|d         j        |          d         k    r(| dz  } | |k     r|d         j        |          d         k    (| |k    r.|d         s dS j        D ]}|d         |d         k    r  dS |} |d         j        |          d         vr dS | dz  } dS )Nr   r   r   FT)rg   r   )phihdr_lenkhorig_phiphr  r   s        r2   headers_correlz8p0fKnowledgeBase.http_find_match.<locals>.headers_correl  s   bf++
 &  B"H==a5BF3KN22q ==a5BF3KN22 g~~!!u )#(55"$& - -B!!u1~~',uuu  . ' !uBF3KN22$uu1HCCtr4   r   )	r   r   r   r   rg   r   r   r   r   )
r1   r   r   r  http_recordr  r   	dishonestr  r  s
    `       @r2   http_find_matchz p0fKnowledgeBase.http_find_match  s$    9V,Y7 5	 5	KB{b  R[BK%?%? J+
:: 2:
*++a//     : ">##  K 45E>"%>BE,>II&EQx3 )vvT)r4   c                 d    | j         d         D ]!}||j        k    r| j        |j                 c S "dS )z
        Finds a match for the given MTU.
        If a match is found, returns the label string.
        Returns None if no match was found
        r   N)r   r   r   r   )r1   r   
mtu_records      r2   mtu_find_matchzp0fKnowledgeBase.mtu_find_match9  sG     )E* 	8 	8Jjn$${:#67777 %tr4   r0   )
r   r   r   __doc__r   r   r  r  r  r!  r   r4   r2   r   r   N  s           .: .: .:`   ,K K KZ?* ?* ?*B	 	 	 	 	r4   r   c                 *    dD ]}| |k    r|| z
  c S d S )N)    @         r   )r)   ottls     r2   r   r   H  s9    "  $;;#:  r4   r   rH   c              #      K   |                      |          d|         }|D ]}|V  t          |t          |          z
            D ]}|V  dS )z&
    Parsing of 'a:b:c:d:e' lines
    N)r   rangerg   )r   r   	delimiterdefaultaeltr   s          r2   r   r   N  sr       	

9bqb!A  				1s1vv:   r4   c                     |                                  } |                     t                    o3|                     t                    p|                     t                    }|st          d          | S )z
    Validate that the packet is an IPv4/IPv6 and TCP packet.
    If the packet is valid, a copy is returned. If not, TypeError is raised.
    zNot a TCP/IP packet)copyhaslayerr
   r	   r   	TypeError)rp   valids     r2   validate_packetr4  Y  s`    
 ((**CLLJ3<<#3#3#Is||D7I7IE /-...Jr4   c                    | j         }| j        }|r|dk     rdS |dfdt          z
  dfdt          z
  dz
  df|t          z   dfdg}| j        r|                    |dz
  df           | j        dk    r`|                    dt          z
  df           |                    dt          z
  dz
  df           |                    |t          z   df           |D ]\  }}||z  s	||z  |fc S dS )	z
    Figure out if window size is a multiplier of MSS or MTU.
    Receives a TCP signature and returns the multiplier and
    whether mtu should be used
    d   )rR   FF     T)r7  T   )r   r*   MIN_TCP4r.   r   r(   MIN_TCP6)r   r   r*   optionsdivr
  s         r2   r  r  e  s)    &C
&C #))y 
e	% 	2	u%	xG 
v *b%()))	yA~~x/000x",e4555h-... & &WSy 	&9g%%%%	&9r4   c                 R   t          |           } |                     t          |                     } | t                   j        j        r7| t                   j        j        rd}nd}t                              |           }n| t                   j	        rt                                          t          | t                   j	                            }|t          k    rd}n|t          k    rd}nt          d          t                              |           }nt          d          ||fS )zz
    Returns a p0f signature of the packet, and the direction.
    Raises TypeError if the packet isn't valid for p0f
    responserequestzNot an HTTP payloadz"Not a SYN, SYN/ACK, or HTTP packet)r4  	__class__r   r
   rW   rn   r`   r#   ry   re   r   guess_payload_classr   r   r2  r   )rp   r   r   r   s       r2   
packet2p0frC    s   
 #

C
--C
!
!C
3x~ >s8> 	""II!I'',,	S	 >++CC0@,A,ABB[  !II|##"II1222((--<===	>r4   c                 &   t          |           } d}| j        j        D ]\  }}|dk    r|}|sdS | j        dk    r
|t          z   n	|t
          z   }t                                          st          d           dS t          	                    |          S )z
    Fingerprints the MTU based on the maximum segment size specified
    in TCP options.
    If a match was found, returns the label. If not returns None
    r   MSSNr   p0f base empty.)
r4  re   r<  rS   r:  r;  p0fdbget_baser   r!  )rp   r   r8   r   r   s        r2   fingerprint_mturI    s     #

C
C{*  e5==C t!kQ..3>>S8^C>> !"""t$$$r4   c                    t          |           \  }}t                                          st          d           d S t	          |t
                    rt                              ||          S t                              ||          S )NrF  )rC  rG  rH  r   
isinstancer#   r  r  )rp   r   r   s      r2   p0frL    su    __NC>> !"""t#}%% 5##C333$$S)444r4   c                    	 t          |           }n# t          $ r Y dS w xY wt          |           \  }}t          |t                    }|dk    }|r|rdnd}n|rdnd}|                     d|z   dz             }g fd	}|rd
nd}	 ||	|                     d                     |r|d         }
|
d         dk    rdnd} |||
d         dz   |
d         z              t          |
          dk    r/ |dd                    d |
d         D                                  |r |d|d                    n|rdnd} ||d            |dt          |                     |d                              z  }|dz  }t          |           dS )z+Calls p0f and prints a user-friendly outputNr@  SYNzSYN+ACKzHTTP RequestzHTTP Responsez2.-[ %IP.src%:%TCP.sport% -> %IP.dst%:%TCP.dport% (z) ]-
|
c                 B                         d| dd|d           d S )Nz| 8r   r   )r   )r8   r   fieldss     r2   	add_fieldzprnp0f.<locals>.add_field  s,    uuu566666r4   Clientr   z%IP.src%:%TCP.sport%r   r   !AppOSr    r   r    Sysz, c              3      K   | ]}|V  d S r0   r   r   s     r2   r   zprnp0f.<locals>.<genexpr>  s"      &A&At&A&A&A&A&A&Ar4   r   DistanceUNKNOWNzRaw sigrH   z`____
)
rL  r   rC  rK  r#   sprintfrg   r   strprint)rp   rr   r   
is_tcp_sig	to_serverpkt_typeresrR  
cli_or_svrr   	app_or_osrQ  s               @r2   prnp0frf    s   HH     __NCC//JY&I D%4559%.C>>O
++JXUXcc
d
dCF7 7 7 7 7 '4HJIj#++&<==>>> 
(!"1X__EE$		)U1X^eAh6777u::??IeTYY&A&Aa&A&A&AAABBB 	(Ij!A$'''&1DDE		)Y'''IiS"""2776??C9C	#JJJJJs    
!!r7  c           	          t                      |s|st          d           t                   }|j        dz  }|rBt	          |t
                    rt                              |          \  }	}
nt          d          t          
                                sg }n&|dk    rdnd}t                              |||          } fd|D             }|st          d          t          j        |          }	|	j        d	k    r j        |	j        k    rt          d
          |	j        } j        dk    r|	j        |z
   _        |	j        dk    rt'          d           ng  _        d|v rB xj        dz  c_        d|v r& j        dk    rt          j        dd           _        nId _        nA xj        dz  c_        d|v rd _        n% j        dk    rt          j        dd           _        d|v r# xj        t          j        dd          z  c_        d|v r
 j        dz  n	 j        dz   _        nT|	j        |z
   _        d|v rt          j        dd           _        d|v r# xj        t          j        dd          z  c_        d t7          |j                  } |                    d                    } |                    d                    }fd|                    dd          D             }g }|	j                            d           D ]}|d!k    r|	j        t@          k    rd|	j!        z  }nd}|	j"        d	k    rW|r)d|cxk    r|k    rn n|#                    d|f           n|#                    dt          j        d"|          f           n|#                    d|	j"        f           nn|d#k    r|	j$        d	k    rd$}d%|v rZ|r)d&|cxk     r|k     rn n|#                    d|f           n,|#                    dt          j        d'|dz
            f           n|r)d|cxk    r|k     rn n|#                    d|f           n|#                    dtK                      f           n|#                    d|	j$        f           n|d(k    r|\  }}d)|v rd}n+||}n&|d|cxk     rd+k     sn t          j        d,d-          }d.|v r-|dk    r'|d|cxk     rd+k     sn t          j        dd/          }nd}|#                    d||ff           n|d0k    r|#                    d1           n|d2k    r|#                    d3           n|d*d         d4k    r)|#                    d5           d6|v rt'          d7           n|d8k    rt          j        g d9          dz
  }d:|dz  z  }tM          tO          j(        |                    )                                }|#                    d;tO          j*        ||          f           nt'          d<|           ||_        |	j        tV          k    r|	j!        |_,        n|	j        t@          k    r9d= |D             }|st          d>          |d         d         |	j!        z  |_,        n|	j        tZ          k    r+|	j!        t          j        dd|	j!        z            z  |_,        nS|	j        t\          k    r||	j!        z  |_,        n3|	j        t^          k    rta                      |_,        nt'          d?           d@|v rd|_1        n%|j1        dk    rt          j        dd/          |_1        dA|v r6|xj        dBz  c_        |j2        dk    rt          j        dd/          |_2        ndC|v r|xj        dDz  c_        d|_2        dE|v r6|xj        dFz  c_        |j3        dk    rt          j        dd          |_3        ndG|v r|xj        dHz  c_        dI|v r
|j        dJz  n	|j        dKz  |_        |	j4        r@|j5        s8 tm          j7        tM          t          j        ddL                    M          z   ntq                      |_5         S )Na  Modifies pkt so that p0f will think it has been sent by a
    specific OS. Either osgenre or signature is required to impersonate.
    If signature is specified (as a raw string), we use the signature.
    signature format:
        "ip_ver:ttl:ip_opt_len:mss:window,wscale:opt_layout:quirks:pay_class"

    If osgenre is specified, we randomly pick a signature with a label
    that matches osgenre (and osdetails, if specified).
    Note: osgenre is case sensitive ("linux" -> "Linux" etc.), and osdetails
    is a substring of a label flavor ("7", "8" and "7 or 8" will
    all match the label "s:win:Windows:7 or 8")

    For now, only TCP SYN/SYN+ACK packets are supported.z0osgenre or signature is required to impersonate!   zUnsupported signature typer   r@  r?  c                 J    g | ]}|j         d k    s|j         j        k    | S )rR   )r(   rS   )r   r   rp   s     r2   
<listcomp>z#p0f_impersonate.<locals>.<listcomp>  s1    MMMa18r>>QX5L5L5L5L5Lr4   zNo match in the p0f databaserR   z#Can't convert between IPv4 and IPv6r   r   zUnhandled IPv4 option fieldr=   r>   r   i  r?   r;   r   r<   r@   i c                 4    t          | t                    r| nd S r0   )rK  r   )r   s    r2   int_onlyz!p0f_impersonate.<locals>.int_onlyA  s     c**4ss4r4   rE  WScalec                 &    g | ]} |          S r   r   )r   orn  s     r2   rj  z#p0f_impersonate.<locals>.<listcomp>F  s!    MMMqxx{{MMMr4   	Timestamp)NNr{   r   r6  r      rO   rN      r   rP   Nl        x   l    w rQ   l    nop)NOPNr   )SAckOKrH   eol)EOLNrJ   zUnhandled opt+ quirkr   )rL   rh     rM   z!%iISAckzUnhandled TCP option %sc                 *    g | ]}|d          dk    |S )r   rE  r   )r   rs   s     r2   rj  z#p0f_impersonate.<locals>.<listcomp>  s!    333QQqTU]]q]]]r4   z5TCP window value requires MSS, and MSS option not setz#Unhandled window size specificationrB   rD   irC      rF   irE   r$  rG   r!   irL   )load)9r4  r   r
   rW   rK  r]  r#   r   r2  rG  rH  r  randomchoicer(   rS   r&   r)   r'   r   r<  rZ   randintrV   r[   r\   r]   dictgetr%   r   r+   r   r*   r   r   r,   r   r   rk   rl   _fixrm   r   r^   r   r   r   r   r_   ra   rc   r-   re   r   	raw_layerr   )rp   r  r  	signature	extrahopsr   uptimerq   tcp_typer   r   r  r   r&   	orig_optsmss_hintws_hintts_hintr<  optmaxmssmaxwsr.   ts2sack_len	optstructrand_valr   rn  s   `                           @r2   p0f_impersonater    s	    #

C M9 MKLLL
c(CyK(H "i%% 	:"//	::FC8999~~ 	GDD%-%5%5		:I''	7IFFD NMMM4MMM 	=;<<<mD!!
zRCK3:55>???ZF
{a'I%>Q12222CK6>>IIII6Q;;#^Ay99CFII II1955F??GGv~dD111GG(,CI$$CI<O		7Y&V^Ay11CFF??FFfnT4000FF5 5 5S[!!Ix	e,,--Hhy}}X..//GMMMMIMM+|$L$LMMMGG{  %% C C%<<||++#/#w"}} IX 7 7 7 7 7 7 7 7 7NNE8#45555NNE6>#v+F+F#GHHHHsw/0000D[[zRV## R2#7#7#7#7%#7#7#7#7#7'':;;;;&.UQY2O2O'PQQQQ ?1#7#7#7#7%#7#7#7#7#7'':;;;;(**'=>>>>#*56666D[[HC#Q____u____nS*BCC H$4$4;q3 .I66CNNK#s45555E\\NN=))))E\\NN>****!WNN=))).///F]]}%5%5%566:H(a-0I!&/)"<"<==BBDDHNNFFM)X$F$FGHHHH-s333
|&&W

		%	%33'333 	VTUUUVAY(

		%	%Wv~a)1GHHH

		%	%37]

		%	%[[

5666	A.I..		W		7a<<nQ	22CG	6				T		&		X		:??955CJ	F				U		$,$6$6	D  CI<OCI
} "{ 	J4>z&.B2G2G'H'HIIIICkkJr4   )r   rH   )NNNr   r7  N):r"  r   rk   r  
scapy.datar   r   scapy.configr   scapy.compatr   r   scapy.packetr   scapy.layers.inetr	   r
   r   scapy.layers.httpr   r   r   scapy.layers.inet6r   scapy.volatiler   r   r   scapy.errorr   	_p0fpathsp0f_baser:  r;  r  r   r   r   r   r   rj   objectr#   r   r   r   r   r   rG  r   r   r4  r  rC  rI  rL  rf  r  r   r4   r2   <module>r     s8    
			   1 1 1 1 1 1 1 1       ! ! ! ! ! ! ! ! " " " " " " 1 1 1 1 1 1 1 1 1 1 = = = = = = = = = = # # # # # # : : : : : : : : : :      888	Ix00  r r r r rF r r rjK K K K KV K K K^! ! ! ! ! ! ! !       9 9 9 9 9& 9 9 9t t t t t} t t tn 	''     	 	 	  >  <% % %0	5 	5 	5) ) )X BF26H H H H H Hr4   