
    h4                        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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 ddlmZ ddlmZ ddlmZmZ ddlmZ dd	l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&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 dZ5d Z6 e0d          Z7 G d de(e7                   Z8 G d d          Z9 G d d          Z: G d d          Z; G d d          Z< G d d          Z= G d d          Z> G d  d!          Z? G d" d#e          Z@ G d$ d%          ZA G d& d'eB          ZC G d( d)eC*          ZDdS )+zn
Automata with states, transitions and actions.

TODO:
    - add documentation for ioevent, as_supersocket...
    N)deque)conf)WINDOWS)MTU)log_runtimewarning)_GlobInterfaceType)Packet)
PacketList)SuperSocketStreamSocket)do_graph)AnyCallableDequeDictGenericIterableIteratorListOptionalSetTupleTypeTypeVarUnioncast)DecoratorCallable   c                 4   t           st          j        | g g |          d         S t          |           } g }g }t                      }| D ]7}t	          |dd          rt
          j        j                                        }|	                    |           t
          j        j        
                    t          j        |                                          |t                    }|dk    r|	                    |           |	                    |                                           |                                dk     r|                    |           d}|	                    |                                           9|r^t          ||dz  nd          }t!          |          dk    r>t
          j        j                            t          j        |d                   |          }nPt
          j        j                            t!          |          t          j        t!          |          z  | d|          }|dk    r|dk    r|                    | |                    t!          |          dk    rmt)          |          D ]]\  }}t
          j        j                            t          j        |          d          }|dk    r|                    | |                    ^|D ]&}t
          j        j                            |           't          |          S )	a  
    Select objects. Same than:
    ``select.select(inputs, [], [], remain)``

    But also works on Windows, only on objects whose fileno() returns
    a Windows event. For simplicity, just use `ObjectPipe()` as a queue
    that you can select on whatever the platform is.

    If you want an object to be always included in the output of
    select_objects (i.e. it's not selectable), just make fileno()
    return a strictly negative value.

    Example:

        >>> a, b = ObjectPipe("a"), ObjectPipe("b")
        >>> b.send("test")
        >>> select_objects([a, b], 1)
        [b]

    :param inputs: objects to process
    :param remain: timeout. If 0, poll. If None, block.
    r   __selectable_force_select__FNi  l    r   i  )r   selectlistsetgetattrctypeswindllws2_32WSACreateEventappendWSAEventSelectc_void_pfilenoFD_READaddintlenkernel32WaitForSingleObjectWaitForMultipleObjects	enumerateWSACloseEvent)	inputsremaineventscreatedresultsievtresremainmss	            S/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/automaton.pyselect_objectsrA   @   s   0  8}VRV44Q77&\\FFGeeG & &13U;; 	&-&5577CNN3-&55

++ C
 axxc"""" ahhjj))))XXZZ!^^
 KKNNNFFMM!((**%%%% /(:v}}
KKv;;!-(<<q	** CC -(??F3v;;.  C *
!2!2KKs$$$6{{Q'// / /FAs -0DD,, C axxF1I... 0 0**3////==    _Tc                       e Zd ZddZerd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ej        d          fdZddZd Zd Zd Zd Zeej        fd            ZdS )
ObjectPipeNc                     |pd| _         d| _        t          j                    \  | _        | _        t                      | _        t          r| 	                                 d S d S )NrE   F)
nameclosedospipe_ObjectPipe__rd_ObjectPipe__wrr   _ObjectPipe__queuer   
_wincreate)selfrG   s     r@   __init__zObjectPipe.__init__   s\    (L	!wyy	49ww 	OO	 	rB   c                     t          t          t          j        j                            d ddt          j        dt          j                    z                                | _        d S )NTFs   ObjectPipe %f)	r   r0   r&   r'   r2   CreateEventAcreate_string_bufferrandom_fdrO   s    r@   rN   zObjectPipe._wincreate   sQ    C!7!D!DdE+,<v},NOO" "  DHHHrB   c                     t           j        j                            t          j        | j                            dk    r4t          t          j        t          j                                         d S d S Nr   )	r&   r'   r2   SetEventr,   rU   r   FormatErrorGetLastErrorrV   s    r@   _winsetzObjectPipe._winset   s]    }%..vtx/H/HIIQNN*6+>+@+@AABBBBB ONrB   c                     t           j        j                            t          j        | j                            dk    r4t          t          j        t          j                                         d S d S rX   )	r&   r'   r2   
ResetEventr,   rU   r   rZ   r[   rV   s    r@   	_winresetzObjectPipe._winreset   s]    }%001J1JKKqPP*6+>+@+@AABBBBB QPrB   c                     t           j        j                            t          j        | j                            dk    r4t          t          j        t          j                                         d S d S rX   )	r&   r'   r2   CloseHandler,   rU   r   rZ   r[   rV   s    r@   	_winclosezObjectPipe._winclose   s^    }%11&/$(2K2KLLPQQQ*6+>+@+@AABBBBB RQrB   c                 ,    t           r| j        S | j        S N)r   rU   rK   rV   s    r@   r-   zObjectPipe.fileno   s     	8OyrB   c                     | j                             |           t          r|                                  t	          j        | j        d           dS )N   Xr   )rM   r*   r   r\   rI   writerL   rO   objs     r@   sendzObjectPipe.send   sF    C    	LLNNN
D!!!qrB   c                 0    |                      |           d S rd   rj   rh   s     r@   rg   zObjectPipe.write   s    		#rB   c                 ,    t          | j                   S rd   )boolrM   rV   s    r@   emptyzObjectPipe.empty   s    %%%%rB   c                     d S rd    rV   s    r@   flushzObjectPipe.flush   s    rB   r   c                    | j         rt          |t          j        z  r| j        r| j        d         S d S t          j        | j        d           | j                                        }t          r| j        s| 
                                 |S )Nr   r   )rH   EOFErrorsocketMSG_PEEKrM   rI   readrK   popleftr   r_   )rO   noptionselts       r@   recvzObjectPipe.recv   s    ; 	NV_$ 	| '|A&4
	1l""$$ 	4< 	NN
rB   c                 ,    |                      |          S rd   r|   rO   ry   s     r@   rw   zObjectPipe.read   s    yy||rB   c                     | j         s>|                                 s,|                                  |                                 (d S d S d S rd   )rH   ro   r|   rV   s    r@   clearzObjectPipe.clear   sY    { 	jjll 		 jjll   	 	 rB   c                     | j         shd| _         t          j        | j                   t          j        | j                   t
          r*	 |                                  d S # t          $ r Y d S w xY wd S d S NT)rH   rI   closerK   rL   r   rb   ImportErrorrV   s    r@   r   zObjectPipe.close   s    { 		DKHTYHTY NN$$$$$"   DD		 		 s   	A 
A-,A-c                 8    d| j         dt          |           dS )N<z at >)rG   idrV   s    r@   __repr__zObjectPipe.__repr__   s     #yyy"T((((33rB   c                 .    |                                   d S rd   )r   rV   s    r@   __del__zObjectPipe.__del__  s    

rB   c                 p    g }| D ]}|j         r|                    |           |r|S t          | |          S rd   )rH   r*   rA   )socketsr8   r;   ss       r@   r"   zObjectPipe.select  sR      	" 	"Ax "q!!! 	Ngv...rB   rd   r   )__name__
__module____qualname__rP   r   rN   r\   r_   rb   r-   rj   rg   ro   rr   ru   MsgFlagr|   rw   r   r   r   r   staticmethodr   recv_poll_rater"   rq   rB   r@   rE   rE      s`            C	 	 		C 	C 	C
	C 	C 	C
	C 	C 	C
      & & &   q 1 1           4 4 4   #2 	/ 	/ 	/ \	/ 	/ 	/rB   rE   c                   .    e Zd ZdZdZdZdZdZd Zd Z	dS )MessageNc                 :    | j                             |           d S rd   )__dict__update)rO   argss     r@   rP   zMessage.__init__  s    T"""""rB   c                 t    dd                     d | j                                        D                       z  S )Nz<Message %s> c              3   T   K   | ]#\  }}|                     d           |d|V  $dS )_=N)
startswith.0kvs      r@   	<genexpr>z#Message.__repr__.<locals>.<genexpr>!  sW       )
 )
1<<$$)
qq!!)
 )
 )
 )
 )
 )
rB   )joinr   itemsrV   s    r@   r   zMessage.__repr__  sI     )
 )
++--)
 )
 )
 !
 !
 
 	
rB   )
r   r   r   typepktresultstateexc_inforP   r   rq   rB   r@   r   r     sK        D
CFEH# # #
 
 
 
 
rB   r   c                   X    e Zd Zd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S )Timerr   Fc                     t          |          | _        d| _        d| _        d| _        || _        t                      | _        || _        d S Nr   T)	float_timeout_time_just_expired_expired_prio_StateWrapper_func_autoreload)rO   timeprio
autoreloads       r@   rP   zTimer.__init__)  sE    d
!
"__
%rB   c                     | j         S rd   r   rV   s    r@   getz	Timer.get3  s
    }rB   c                     || _         d S rd   r   )rO   vals     r@   r$   z	Timer.set7  s    rB   c                 :    | j         | _        d| _        d| _        d S NF)r   r   r   r   rV   s    r@   _resetzTimer._reset;  s     ]
"rB   c                     d| _         d S r   r   rV   s    r@   _reset_just_expiredzTimer._reset_just_expiredA  s    "rB   c                     | j         dk    S rX   )r   rV   s    r@   _runningzTimer._runningE  s    zA~rB   c                 ,    t          | j        d          S rX   )maxr   rV   s    r@   
_remainingzTimer._remainingI  s    4:q!!!rB   c                     | xj         |z  c_         | j         dk    r;| j        s6d| _        | j        r| j        | j         z   | _         d S d| _        d| _         d S d S d S r   )r   r   r   r   r   )rO   r   s     r@   
_decrementzTimer._decrementM  sq    

d

:??= #%)"# #!%!;DJJJ$(DM!"DJJJ ?# #rB   c                 b    | j         |j         k    r| j         |j         k     n| j        |j        k     S rd   r   r   rh   s     r@   __lt__zTimer.__lt__Z  0    ,0J#),C,Cci''j39,	/rB   c                 b    | j         |j         k    r| j         |j         k    n| j        |j        k    S rd   r   rh   s     r@   __gt__zTimer.__gt___  r   rB   c                     t          |t                    st                      | j        |j        k    o| j        |j        k    S rd   )
isinstancer   NotImplementedErrorr   r   rh   s     r@   __eq__zTimer.__eq__d  s=    #u%% 	(%'''
ci'FdjCI.EFrB   c                 $    d| j         | j        fz  S )Nz<Timer %f(%f)>)r   r   rV   s    r@   r   zTimer.__repr__j  s    4:t}"===rB   N)r   F)r   r   r   rP   r   r$   r   r   r   r   r   r   r   r   r   rq   rB   r@   r   r   (  s        & & & &    # # ## # #  " " "# # #/ / /
/ / /
G G G> > > > >rB   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )
_TimerListc                     g | _         d S rd   )timersrV   s    r@   rP   z_TimerList.__init__p  s    rB   c                 :    | j                             |           d S rd   )r   r*   )rO   timers     r@   	add_timerz_TimerList.add_timert  s    5!!!!!rB   c                 B    | j         D ]}|                                 d S rd   )r   r   )rO   ts     r@   resetz_TimerList.resetx  s,     	 	AHHJJJJ	 	rB   c                 D    | j         D ]}|                    |           d S rd   )r   r   )rO   r   r   s      r@   	decrementz_TimerList.decrement}  s2     	 	ALL	 	rB   c                     d | j         D             }|                    d d           |D ]}|                                 |S )Nc                      g | ]}|j         	|S rq   r   r   r   s     r@   
<listcomp>z&_TimerList.expired.<locals>.<listcomp>  s    999Q9q999rB   c                     | j         S rd   )r   xs    r@   <lambda>z$_TimerList.expired.<locals>.<lambda>  s    qw rB   T)keyreverse)r   sortr   )rO   lstr   s      r@   expiredz_TimerList.expired  sZ    99$+999&&555 	$ 	$A!!####
rB   c                 b    	 t          d | j        D                       S # t          $ r Y d S w xY w)Nc                 ^    g | ]*}|                                 |                                +S rq   )r   r   r   s     r@   r   z)_TimerList.until_next.<locals>.<listcomp>  s-    LLL1qzz||LLLLrB   )minr   
ValueErrorrV   s    r@   
until_nextz_TimerList.until_next  sH    	LLLLLMMM 	 	 	44	s     
..c                 *    t          | j                  S rd   )r1   r   rV   s    r@   countz_TimerList.count  s    4;rB   c                 4    | j                                         S rd   )r   __iter__rV   s    r@   r   z_TimerList.__iter__      {##%%%rB   c                 4    | j                                         S rd   )r   r   rV   s    r@   r   z_TimerList.__repr__  r   rB   N)r   r   r   rP   r   r   r   r   r   r   r   r   rq   rB   r@   r   r   o  s          " " "  
  
         & & && & & & &rB   r   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	_instance_statec                 b    |j         | _         |j        | _        |j         j        | j         _        d S rd   )__self____func__	__class__)rO   instances     r@   rP   z_instance_state.__init__  s,     ) )"*"3"=rB   c                 ,    t          | j        |          S rd   )r%   r  )rO   attrs     r@   __getattr__z_instance_state.__getattr__  s    t}d+++rB   c                 .     | j         | j        g|R i |S rd   )r  r  rO   r   kargss      r@   __call__z_instance_state.__call__  s&    t}T];T;;;U;;;rB   c                 @    | j                             | j                  S rd   )r  add_breakpointsr  rV   s    r@   breaksz_instance_state.breaks  s    },,T];;;rB   c                 @    | j                             | j                  S rd   )r  add_interception_pointsr  rV   s    r@   
interceptsz_instance_state.intercepts  s    }44T]CCCrB   c                 @    | j                             | j                  S rd   )r  remove_breakpointsr  rV   s    r@   unbreaksz_instance_state.unbreaks  s    }//>>>rB   c                 @    | j                             | j                  S rd   )r  remove_interception_pointsr  rV   s    r@   uninterceptsz_instance_state.unintercepts  s    }77FFFrB   N)
r   r   r   rP   r	  r  r  r  r  r  rq   rB   r@   r  r    s        > > >, , ,< < << < <D D D? ? ?G G G G GrB   r  c                   N    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S )r   N)r   r   r   	atmt_type
atmt_stateatmt_initial
atmt_final	atmt_stop
atmt_erroratmt_origfunc	atmt_prioatmt_as_supersocketatmt_condnameatmt_ionameatmt_timeout	atmt_cond__code__r  rq   rB   r@   r   r     s_        HIJLJIJMIMKLIHHHHrB   r   c                      e Zd ZdZdZdZdZdZdZdZ	 G d d	e
          Ze	 	 	 	 dd            Zedd            Zedd            Zedd            Ze	 	 dd            Zed             Zedd            Zed             ZdS )ATMTStateAction	ConditionzReceive conditionzTimeout conditionzEOF conditionz	I/O eventc                   &    e Zd Zd Zd Zd Zd ZdS )ATMT.NewStateRequestedc                 $   || _         |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _
        t                              | d| j        z             || _        || _        || _        |                                  d S )NzRequest state [%s])funcr  r   r  initialr   errorr  stopr  final	ExceptionrP   	automatonr   r  action_parameters)rO   
state_funcr7  r   r  s        r@   rP   zATMT.NewStateRequested.__init__  s    "DI#.DJ%2DL#.DJ",DI#.DJt%9DJ%FGGG&DNDIDJ""$$$$$rB   c                 "    || _         || _        | S rd   )action_argsaction_kargsr  s      r@   r8  z(ATMT.NewStateRequested.action_parameters  s    #D %DKrB   c                 B     | j         | j        g| j        R i | j        S rd   )r1  r7  r   r  rV   s    r@   runzATMT.NewStateRequested.run  s*    49T^FdiFFF4:FFFrB   c                     d| j         z  S )NzNewStateRequested(%s)r   rV   s    r@   r   zATMT.NewStateRequested.__repr__  s    *TZ77rB   N)r   r   r   rP   r8  r>  r   rq   rB   r@   NewStateRequestedr/    sS        	% 	% 	%	 	 		G 	G 	G	8 	8 	8 	8 	8rB   rA  r   c                     | |ffd	}|S )Nc                 N    t           j         _         j         _        | _        | _         _         _         fd}t          t          |          }d j        z  |_        t           j        |_         j        |_        ||_        ||_        |_        |_         |_        |S )Nc                 0    t          j        | g|R i |S rd   )r*  rA  )rO   r   r  fs      r@   _state_wrapperz0ATMT.state.<locals>.deco.<locals>._state_wrapper  s&    -aFFFFFFFrB   z
%s_wrapper)r*  STATEr  r   r  r  r  r  r   r   r   r!  )rE  r2  r5  rF  state_wrapperr3  r4  s   `    r@   decozATMT.state.<locals>.deco  s    *AK:AL$AN ALAK ALG G G G G !??M%1AJ%>M"&*jM#'(zM$)0M&',M$&*M#',M$*+M'  rB   rq   )r2  r5  r4  r3  rI  s     `` r@   r   z
ATMT.state  s5     $5 	! 	! 	! 	! 	! 	! 	!. rB   c                     | ffd	}|S )Nc                 v    t          | d          si | _        t          j        | _        | j        |j        <   | S )Nr  )hasattrr'  r*  ACTIONr  r$  )rE  condr   s     r@   rI  zATMT.action.<locals>.deco  s9    1k** ! +AK.2AK*+HrB   rq   )rN  r   rI  s    ` r@   actionzATMT.action  s-      	 	 	 	 	 	 rB   c                     | ffd	}|S )Nc                 h    t           j        | _        |j        | _        | j        | _        | _        | S rd   )r*  	CONDITIONr  r  r   r$  r"  rE  r   r   s     r@   rI  zATMT.condition.<locals>.deco*  s+    .AK +ALjAOAKHrB   rq   r   r   rI  s    ` r@   	conditionzATMT.condition'  -       	 	 	 	 	 	 rB   c                     | ffd	}|S )Nc                 h    t           j        | _        |j        | _        | j        | _        | _        | S rd   )r*  RECVr  r  r   r$  r"  rS  s     r@   rI  z$ATMT.receive_condition.<locals>.deco6  s+    )AK +ALjAOAKHrB   rq   rT  s    ` r@   receive_conditionzATMT.receive_condition3  rV  rB   Nc                     | ffd	}|S )Nc                     t           j        | _        |j        | _        | j        | _        | _        | _        | _        | S rd   )	r*  IOEVENTr  r  r   r$  r%  r"  r#  )rE  r   as_supersocketrG   r   s     r@   rI  zATMT.ioevent.<locals>.decoF  s:    ,AK +ALjAO AMAK$2A!HrB   rq   )r   rG   r   r^  rI  s    ``` r@   ioeventzATMT.ioevent?  s9       	 	 	 	 	 	 	 	 rB   c                 ,    | t          |          fd}|S )Nc                 ~    t           j        | _        |j        | _        || _        | | j        _        | j        | _        | S rd   r*  TIMEOUTr  r  r&  r   r   r$  rE  r   timeouts      r@   rI  zATMT.timeout.<locals>.decoT  4    ,AK +AL$AN#$AN jAOHrB   r   )r   re  rI  s      r@   re  zATMT.timeoutQ  s*      w 	 	 	 	 rB   c                 2    | t          ||d          fd}|S )NT)r   r   c                 ~    t           j        | _        |j        | _        || _        | | j        _        | j        | _        | S rd   rb  rd  s      r@   rI  zATMT.timer.<locals>.decoa  rf  rB   rg  )r   re  r   rI  s       r@   r   z
ATMT.timer^  s3      wTd)S)S)S 	 	 	 	 rB   c                     | fd}|S )Nc                 X    t           j        | _        |j        | _        | j        | _        | S rd   )r*  EOFr  r  r   r$  )rE  r   s     r@   rI  zATMT.eof.<locals>.decon  s#    (AK +ALjAOHrB   rq   )r   rI  s     r@   eofzATMT.eofk  s"       	 	 	 	 rB   )r   r   r   r   r   )r   N)r   r   r   rG  rM  rR  rY  rc  rl  r]  r6  rA  r   r   rO  rU  rZ  r_  re  r   rm  rq   rB   r@   r*  r*    sk       EFID!G
CG8 8 8 8 8I 8 8 8:    \> 	 	 	 \	 	 	 	 \	 	 	 	 \	  #   \" 
 
 \
 
 
 
 \
   \  rB   r*  c                   B    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S )_ATMT_CommandRUNNEXTFREEZESTOP	FORCESTOPEND	EXCEPTION
SINGLESTEP
BREAKPOINT	INTERCEPTACCEPTREPLACEREJECTN)r   r   r   rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  rq   rB   r@   ro  ro  w  sO        
CDFDI
CIJJIFGFFFrB   ro  c                   T    e Zd Zd Zd Zd ZefdZd Ze	e
j        fd            ZdS )_ATMT_supersocketc                 >   || _         || _        || _        t          t                   d          t          t                   d          c| _        | _        || j        | j        fi|d<   d|d<   | j         |d<    ||i || _        | j                                         d S )Nspaspbexternal_fdTis_atmt_socketatmt_socket)	rG   r_  protorE   r   r  r  atmtrunbg)rO   rG   r_  r7  r  r   r  s          r@   rP   z_ATMT_supersocket.__init__  s     	
'_U33sOE"" 	$( '$(DH)=>m"&#ymIt-u--		rB   c                 6    | j                             |          S rd   )r  rj   )rO   r   s     r@   rj   z_ATMT_supersocket.send  s    x}}QrB   c                 4    | j                                         S rd   )r  r-   rV   s    r@   r-   z_ATMT_supersocket.fileno  s    x   rB   c                 h    | j                             |          }| j        | | j        |fi |}|S rd   )r  r|   r  )rO   ry   kwargsrs       r@   r|   z_ATMT_supersocket.recv  s?    HMM!:!am
1''''ArB   c                     | j         sm| j                                         | j                                         | j                                         | j                                         d| _         d S d S r   )rH   r  r4  destroyr  r   r  rV   s    r@   r   z_ATMT_supersocket.close  sk    { 	INNIHNNHNNDKKK	 	rB   c                 "    t          | |          S rd   )rA   )r   r8   s     r@   r"   z_ATMT_supersocket.select  s     gv...rB   N)r   r   r   rP   rj   r-   r   r|   r   r   r   r   r"   rq   rB   r@   r~  r~    s          *     ! ! !        #2 / / / \/ / /rB   r~  c                       e Zd Zd Zd ZdS )_ATMT_to_supersocketc                 0    || _         || _        || _        d S rd   )rG   r_  r7  )rO   rG   r_  r7  s       r@   rP   z_ATMT_to_supersocket.__init__  s    	"rB   c                 F    t          | j        | j        | j        |g|R i |S rd   )r~  rG   r_  r7  )rO   r  r   r  s       r@   r  z_ATMT_to_supersocket.__call__  s>     It|T^

 
 
!
 
 	
rB   N)r   r   r   rP   r  rq   rB   r@   r  r    s2        # # #
 
 
 
 
rB   r  c                   *     e Zd Z fdZd Zd Z xZS )Automaton_metaclassc                 	   t          t          |                               | |||          } i | _        i | _        i | _        i | _        i | _        i | _        i | _	        g | _
        d | _        g | _        g | _        i }| g}|rV|                    d          }|t          |j                  z  }|j                                        D ]\  }}||vr|||<   |Vd |                                D             }	|	D ]}
|
j        t*          j        k    r|
j        }|
| j        |<   g | j        |<   g | j        |<   g | j        |<   t1                      | j        |<   |
j        r| j
                            |
           |
j        r| j        t9          d          |
| _        |
j        t*          j        t*          j        t*          j        t*          j         t*          j!        fv rg | j	        |
j"        <   |	D ]}
|
j        t*          j        k    r&| j        |
j                                     |
           >|
j        t*          j        k    r&| j        |
j                                     |
           y|
j        t*          j!        k    r|
| j        |
j        <   |
j        t*          j         k    rg| j        |
j                                     |
           | j                            |
j#                   |
j$        | j                            |
           |
j        t*          j        k    r,| j        |
j                 %                    |
j&                   [|
j        t*          j'        k    r*|
j(        D ]"}| j	        |                             |
           #tS          j*        | j                                        | j                                        | j                                                  D ]}|+                    d            | j	                                        D ]\  }|+                    fd           | j        D ]J}tY          | |j$        t[          |j$        |j#        t]          t^          d         |                                K	 dd l0}|1                    | j2                  | _3        n# th          tj          f$ r Y nw xY wt]          t^          d         |           S )Nr   c                 2    g | ]}t          |d           |S )r  )rL  )r   r   s     r@   r   z/Automaton_metaclass.__new__.<locals>.<listcomp>  s6     1 1 11;//1Q 1 1 1rB   z'There can only be a single stop state !c                     | j         S rd   )r"  r   s    r@   r   z-Automaton_metaclass.__new__.<locals>.<lambda>  s     rB   )r   c                     | j                  S rd   )r'  )r   condnames    r@   r   z-Automaton_metaclass.__new__.<locals>.<lambda>  s    ak(&; rB   	Automaton)6superr  __new__statesrecv_conditions
conditionsioeventsre  eofsactionsinitial_states
stop_stateionamesiosupersocketspopr#   	__bases__r   r   valuesr  r*  rG  r  r   r  r*   r  r   rR  rY  rc  r]  rl  r$  r%  r#  r   r&  rM  r'  	itertoolschainr   setattrr  r   r   inspect	signature
parse_args__signature__r   AttributeError)clsrG   basesdctmembersclassescr   r   	decoratedmr   coactlstioevr  r  r  s                   @r@   r  zAutomaton_metaclass.__new__  s   '--55uc
 
 
 % 	#AAtAK(((G
((** # #1G##!"GAJ  	#1 1 0 0 1 1 1	  	2 	2A{dj((L !
1)+#A&"$Q$&q!!+A> 1&--a000; '~1()RSSS%&CNDL$,X\X` aaa/1AO, 	. 	.A{dn,,q|,33A6666	))#AL188;;;;(()*&&,,Q\*11!444""1=111(4&--a000,,AL)33ANCCCC+++ . .BKO**1----N!!##&&((L!!
 
 	. 	.A
 FF,,F---- # 1 1 3 3 	= 	=HfKK;;;;K<<<<& 	7 	7DC1(0(T+.446 67 7 7 7	NNN ' 1 1#. A AC^, 	 	 	D	 D%s+++s   #R, ,S ?S c                    d| j         j        z  }d}| j                                        D ]U}|j        rd|j        z  |z   }|j        r|d|j        z  z  },|j        r|d|j        z  z  }A|j        r|d|j        z  z  }V||z  }| j                                        D ]}t          |j
        j        j        |j
        j        j        z             }|r|                                }|| j        v r|d|j        d|d	z  }nw|| j        v rnt!          | j        |                   rT|                    | j        |         j        j                   |                    | j        |         j        j                   |d
 | j                                        D             d | j                                        D             z   d | j                                        D             z   d | j                                        D             z   D ]'\  }}}}	|	D ]}
t          |
j        j        |
j        j        z             }|r|                                }|| j        v r?|
j        }| j        |
j                 D ]}|d|j        z  z  }|d|d|d|d|d|dz  }n|| j        v rt!          | j        |                   rot3          | j        |         d          rT|                    | j        |         j        j                   |                    | j        |         j        j                   |)| j                                        D ]\  }}|D ]}|j        j        j        |j        j        j        z   D ]d}|| j        v rYd|j        j        |                                fz  }| j        |j        j                 D ]}|d|j        z  z  }|d|d|d|dz  }e|dz  }|S )Nzdigraph "%s" {
 z=	"%s" [ style=filled, fillcolor=blue, shape=box, root=true];
z8	"%s" [ style=filled, fillcolor=green, shape=octagon ];
z6	"%s" [ style=filled, fillcolor=red, shape=octagon ];
z@	"%s" [ style=filled, fillcolor=orange, shape=box, root=true ];
z	"z" -> "z" [ color=green ];
c                      g | ]\  }}d d||fS )purplesolidrq   r   s      r@   r   z3Automaton_metaclass.build_graph.<locals>.<listcomp>F  s%    KKK41ahA&KKKrB   c                      g | ]\  }}d d||fS )redr  rq   r   s      r@   r   z3Automaton_metaclass.build_graph.<locals>.<listcomp>G  s%    MMM1eWa#MMMrB   c                      g | ]\  }}d d||fS )oranger  rq   r   s      r@   r   z3Automaton_metaclass.build_graph.<locals>.<listcomp>H  s%    III41ahA&IIIrB   c                 "    g | ]\  }}d d||gfS )blackdashedrq   r   s      r@   r   z3Automaton_metaclass.build_graph.<locals>.<listcomp>I  s'    GGGTQgxQC(GGGrB   z\l>[%s]z
" [label="z	", color=z, style=z];
r(  z%s/%.1fsz",color=blue];
z}
)r  r   r  r  r  r  r  r   r  r#   r!  r(  co_names	co_constsr  r   callableextendr  r   r  r  r  r$  r  rL  re  r   r   )rO   r   sestnamesry   r  styr   r   rE  liner   r   r   s                  r@   build_graphzAutomaton_metaclass.build_graph&  s   !88+$$&& 	k 	kB kWZ\Zggkmm kRUWUbbb kPSUS``` kZ]_]jjj	R+$$&& 	J 	JB )2 )34 E  JIIKK##AqqqQQAA$-''a 011 JT]1%5%>%GHHHT]1%5%>%HIII  J LK4?3H3H3J3JKKKMM0D0J0J0L0LMMMNII4=3F3F3H3HIIIJ HGTY__5F5FGGGH	N 	NLAsAq  N NQZ01:3GGHH N		ADK'' !%ao!> < <A J$;;DDAAAA DDAACC  dm++#DM!$455 N'$-PQBRT^:_:_ N!LLq)9)B)KLLL!LLq)9)B)LMMM#  NN( ++-- 		X 		XIAv X X+.7+.89 X XADK'')U[-F-2YY[[-:  :!%ek.G!H < <A J$;;DDAAAqqqRVRVRVWWXX 	
U
rB   c                 D    |                                  }t          |fi |S rd   )r  r   )rO   r  r   s      r@   graphzAutomaton_metaclass.graphl  s)    ##U###rB   )r   r   r   r  r  r  __classcell__)r  s   @r@   r  r    s`        W, W, W, W, W,rD D DL$ $ $ $ $ $ $rB   r  c                      e Zd Zi ZdZi Zi Zi Zi Zi Z	i Z
g ZdZg Zg Zej        ZeZd Zd@dZe	 	 dAdedee         ded	ed
eej                 f
d            Zd Zd Zd Z d Z! G d d          Z" G 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* G d  d!e)          Z+ G d" d#e)          Z, G d$ d%e%          Z-d& Z.d' Z/d( Z0d) Z1d* Z2d+ Z3d, Z4d- Z5d. Z6d/ Z7d0 Z8d1 Z9d2 Z:d3 Z;d4 Z<	 	 dBd6Z=dAd7Z>d8 Z?d9 Z@d: ZAdCd;ZBdCd<ZCd= ZD	 	 dAd>ZE	 dDd?ZFdS )Er  Nc                 N   |                     di           }d|v r|d         | _        nQd | _        |                     dt          j                  | _        |                     dt          j                  | _        d | _        d | _        |                     dd          | _	        |                     dd           | _
        t          j                    | _        d | _        d | _        t!                      | _        t!                      | _        d | _        d| _        || _        || _        t.                              t.          d	d
i           | _        t.                              t.          d	d
i           | _        t7          t8                   d          | _        t7          t8                   d          | _        i | _        i | _         tC                      | _"        | j#        j$        D ]}|%                    |          }tM          |tN                    s||f}|\  }}|t7          d          }n| (                    |d           }|t7          d          }n| (                    d |          }|| j        |<   || j         |<   ||_)        ||_)        tU          | j        || +                    ||                     tU          | j        || +                    ||                     | j,        D ].}tU          | |t[          t]          | |                               /| /                                 d S )Nr  sockllrecvsockr  Fr  r   IOnamespacerq   cmdincmdoutioinioout)0r  r  r   L3socketsend_sock_classL2listenrecv_sock_classlisten_sock	send_sockr  r  	threadingLockstartedthreadidbreakpointedr$   breakpointsinterception_pointsintercepted_packetdebug_level	init_args
init_kargsr   r  iooirE   r   r  r  r  r  r   packetsr  r  r   r   tuple_IO_fdwrapperionamer  	_IO_mixerr  r  r%   start)	rO   r   r  r  ry   extfdr  r  stnames	            r@   rP   zAutomaton.__init__  s   iir22U??fDII DI#(99T4=#A#AD #(99Z#G#GD #ii(8%@@ 99]D99 ~'' 55#&55 "&,,t]B;;,,t]B;;(11
 )(33	
!||' 	= 	=AOOA&&EeU++ 'KD%|!&))))$55}"7++**477DIaL!DJqMDKELDGQud ; ;<<<DGQtU ; ;<<<<k 	< 	<FD&#GD&$9$9::< < < < 	

rB   r   c                 `    || _         |rt          j        t          _        || _        || _        d S rd   )r  loggingDEBUGr   logLevelsocket_kargsstore_packets)rO   debugstorer  s       r@   r  zAutomaton.parse_args  s1      	*#MDM!"rB   Fportifacebgr  returnc           	         	 ddl m} t          j        t          j        t          j                  	 |pt
          j                  }	 	                    t          j        t          j	        d           n# t          $ r Y nw xY w	                    ||f           	                    d           g                     dd          r9t          t
          j                            d j        d||f                     d 	fd}|r)t%          j        |                                           	S  |             d
S )a  
        Spawn a TCP server that listens for connections and start the automaton
        for each new client.

        :param port: the port to listen to
        :param bg: background mode? (default: False)

        Note that in background mode, you shall close the TCP server as such::

            srv = MyAutomaton.spawn(8080, bg=True)
            srv.shutdown(socket.SHUT_RDWR)  # important
            srv.close()
        r   )get_if_addrr      verbTzServer z started listening on r  Nc                  v   	 	 d } 	                                 \  }}                    dd          r<t          t          j                            dt          |          z                       	 j                            |j                  }n|} d|d} ny# t          $ rl | | 
                                                     dd          rt          d                               dd          dk    rt          j                     Y w xY w                    | |f           |                                  D ]-\  }}|                                s|
                                 .s# t           $ r1 t          d           	                    t$          j                   Y nKt          $ r? t          d	                               dd          dk    rt          j                     Y nw xY wD ]\  }}	 |                    d
           |
                                 n# t*          $ r Y nw xY w	 |                    t$          j                   |                                 v# t*          $ r Y w xY w	                                 d S # D ]\  }}	 |                    d
           |
                                 n# t*          $ r Y nw xY w	 |                    t$          j                   |                                 v# t*          $ r Y w xY w	                                 w xY w)NTr  u   ┃ Connection received from %s)r  r  zX Connection aborted.r  r   z
X Exiting.zX Server closed.F)waitrq   )acceptr   printr   color_themegoldrepr	socketclspkt_clsOSErrorr  	traceback	print_excr*   r  	isrunningKeyboardInterruptshutdownru   	SHUT_RDWR	forcestopr6  r   )
atmt_serverclientsocketaddressr  r  clientsr  r  r  ssocks
        r@   _runzAutomaton.spawn.<locals>._run  s   4+"&K,1LLNN)L'zz&$// d.33@4==P    !=4#&==s{#K#KDD#/D&)c '!%"'' '+1' ' # ! ! !&2'//111!::fd33 ;!"9:::!::gq11A55%/111 ! NNK#>???%%'''.5 + +*l#~~// + LLNNN?+@ % 1 1 1l###v/00000 * * *()))::gq))A--')))*
 +2 
 
&D,E222$   $--f.>???$**,,,,$    +2 
 
&D,E222$   $--f.>???$**,,,,$   s   A,E7 00B!  E7 !A2DE7 DA E7 78G9/J 1AG96J 8G99J *H//
H<;H< 3I44
J JL8#*KL8
K	L8K	L83LL8
L 	L8L 	 L8)target)r  N)
scapy.archr	  ru   AF_INETSOCK_STREAMr   r  
setsockopt
SOL_SOCKETSO_REUSEADDRr  bindlistenr   r  r  greenr   r  Threadr  )
r  r  r  r  r  r	  local_ipr"  r   r!  s
   ` ` `   @@r@   spawnzAutomaton.spawn  s   & 	+*****fnf.@AA;u2
33	V.0CQGGGG 	 	 	D	

Hd#$$$Q::fd## 	$"(((LLLt$$    6	 6	 6	 6	 6	 6	 6	 6	 6	 6	n  	D)))//111L DFFF4s   +A9 9
BBc                     dS r   rq   )rO   r   s     r@   master_filterzAutomaton.master_filter-  s    trB   c                 X    | j         st          d           | j         j        |fi | d S )Nzsend_sock is None !)r  r   rj   )rO   r   r  s      r@   my_sendzAutomaton.my_send1  s>    ~ 	42333C**6*****rB   c                 d    || _         | j        | j         | _        | j        r| j         | _        dS dS )zn
        Update the socket used by the automata.
        Typically used in an eof event to reconnect.
        N)r  r  r  )rO   r  s     r@   update_sockzAutomaton.update_sock7  s?     	'#yD> 	'!YDNNN	' 	'rB   c                 z    | j                                         D ] \  }}|D ]}|j        j        |k    r|c c S !d S rd   )re  r   r   r$  )rO   rG   r   r   r   s        r@   timer_by_namezAutomaton.timer_by_nameC  s`    ++-- 	! 	!IAv ! !;,44 LLLLL 5! trB   c                   6    e Zd Zd Zd Zd	dZd Zd	dZd ZdS )
Automaton._IO_fdwrapperc                 r    || _         || _        t          | j         t          j                  r	d| _        d S d S r   )rdwrr   ru   r!   rO   r;  r<  s      r@   rP   z Automaton._IO_fdwrapper.__init__M  s@    
 DGDG$'6=11 8370008 8rB   c                     t          | j        t                    r| j        S | j        r| j                                        S dS rX   )r   r;  r0   r-   rV   s    r@   r-   zAutomaton._IO_fdwrapper.filenoW  s>    $'3'' (w (w~~'''1rB     c                     t          | j        t                    rt          j        | j        |          S | j        r| j                            |          S d S rd   )r   r;  r0   rI   rw   r|   r   s     r@   rw   zAutomaton._IO_fdwrapper.read_  sK    $'3'' 'wtw*** 'w||A&4rB   c                     t          | j        t                    rt          j        | j        |          S | j        r| j                            |          S dS rX   )r   r<  r0   rI   rg   rj   rO   msgs     r@   rg   zAutomaton._IO_fdwrapper.writeg  sM    $'3'' )x--- )w||C(((1rB   c                 ,    |                      |          S rd   )rw   r   s     r@   r|   zAutomaton._IO_fdwrapper.recvo      99Q<<rB   c                 ,    |                      |          S rd   )rg   rB  s     r@   rj   zAutomaton._IO_fdwrapper.sends  s    ::c??"rB   N)r?  )	r   r   r   rP   r-   rw   rg   r|   rj   rq   rB   r@   r  r9  L  sx        	8 	8 	8	 	 		 	 	 		 	 		  	  	  	 	# 	# 	# 	# 	#rB   r  c                   6    e Zd Zd Zd ZddZddZd Zd ZdS )	Automaton._IO_mixerc                 "    || _         || _        d S rd   )r;  r<  r=  s      r@   rP   zAutomaton._IO_mixer.__init__x  s    
 DGDGGGrB   c                 v    t          | j        t                    r| j                                        S | j        S rd   )r   r;  rE   r-   rV   s    r@   r-   zAutomaton._IO_mixer.fileno  s/    $':.. (w~~'''7NrB   Nc                 6    | j                             |          S rd   )r;  r|   r   s     r@   r|   zAutomaton._IO_mixer.recv  s    7<<??"rB   c                 ,    |                      |          S rd   r~   r   s     r@   rw   zAutomaton._IO_mixer.read  rE  rB   c                 6    | j                             |          S rd   )r<  rj   rB  s     r@   rj   zAutomaton._IO_mixer.send  s    7<<$$$rB   c                 ,    |                      |          S rd   rl   rB  s     r@   rg   zAutomaton._IO_mixer.write  s    99S>>!rB   rd   )	r   r   r   rP   r-   r|   rw   rj   rg   rq   rB   r@   r  rH  w  sx        	 	 		 	 		# 	# 	# 	#	  	  	  	 	% 	% 	%	" 	" 	" 	" 	"rB   r  c                       e Zd ZddZdS )Automaton.AutomatonExceptionNc                 X    t                               | |           || _        || _        d S rd   )r6  rP   r   r   )rO   rC  r   r   s       r@   rP   z%Automaton.AutomatonException.__init__  s*    tS)))DJ DKKKrB   )NNr   r   r   rP   rq   rB   r@   AutomatonExceptionrP    s(        	! 	! 	! 	! 	! 	!rB   rS  c                       e Zd ZdS )Automaton.AutomatonErrorNr   r   r   rq   rB   r@   AutomatonErrorrU            rB   rW  c                       e Zd ZdS )Automaton.ErrorStateNrV  rq   rB   r@   
ErrorStaterZ    rX  rB   r[  c                       e Zd ZdS )Automaton.StuckNrV  rq   rB   r@   Stuckr]    rX  rB   r^  c                       e Zd ZdS )Automaton.AutomatonStoppedNrV  rq   rB   r@   AutomatonStoppedr`    rX  rB   ra  c                       e Zd ZdS )Automaton.BreakpointNrV  rq   rB   r@   
Breakpointrc    rX  rB   rd  c                       e Zd ZdS )Automaton.SinglestepNrV  rq   rB   r@   
Singlesteprf    rX  rB   rg  c                       e Zd ZddZdS )Automaton.InterceptionPointNc                 Z    t           j                            | |||           || _        d S )Nr   r   )r  ra  rP   packet)rO   rC  r   r   rl  s        r@   rP   z$Automaton.InterceptionPoint.__init__  s-    &//cv/VVV DKKKrB   )NNNrR  rq   rB   r@   InterceptionPointri    s(        	! 	! 	! 	! 	! 	!rB   rm  c                       e Zd ZdS )Automaton.CommandMessageNrV  rq   rB   r@   CommandMessagero    rX  rB   rp  c                 H    | j         |k    rt          j        |           d S d S rd   )r  r   r  )rO   lvlrC  s      r@   r  zAutomaton.debug  s/    s""c""""" #"rB   c                 4    | j                                         S rd   )r  lockedrV   s    r@   r  zAutomaton.isrunning  s    |""$$$rB   c                    | j         j         | j        v rc|                     dd|                                z             || _        | j                            t          t          j	        | j         |                     | j
                                        }|s|                     dd           d S d | _        |j        t          j        k    r|                     dd           d S |j        t          j        k    r3|j        }|                     dd|                                z             nI|j        t          j        k    r|                     dd           n|                     d|j        z             | j        |fi | |                     dd	|                                z             | j        r.| j                            |                                           d S d S )
N   z!INTERCEPT: packet intercepted: %s)r   r   r   	CANCELLEDzINTERCEPT: packet rejectedz!INTERCEPT: packet replaced by: %szINTERCEPT: packet acceptedzINTERCEPT: unknown verdict: %rz	SENT : %s)r   r  r  summaryr  r  rj   r   ro  ry  r  r|   r   r|  r{  r   rz  rW  r3  r  r  r*   copy)rO   r   r  cmds       r@   rj   zAutomaton.send  s   :t777JJq=MNNN&)D#K]4"jc3 3 3   *//##C 

1k***&*D#x=///

1:;;;]222g

1ACKKMMQRRRR]111

1:;;;;))*JSX*UVVVS##F###

1kCKKMM1222 	,L

+++++	, 	,rB   c                     | S rd   rq   rV   s    r@   r   zAutomaton.__iter__  s    rB   c                 .    |                                   d S rd   )r  rV   s    r@   r   zAutomaton.__del__  s    rB   c           
         	 |                      dd|j        d|j        d            || g|R i | |                      d|j        d|j        d           d S # t          j        $ r}|                      d|j        d|j        d|j        d           |j        t          j        k    r'| j        r | j        	                    |d                    | j
        |j                 D ]6}|                      dd	|j        z              || g|j        R i |j         7 d }~wt          $ r/}|                      d|j        d|j        d
|d            d }~ww xY w)Nr
  zTrying  []   z] not takenz] taken to state [r   z   + Running action [%s]z] raised exception [)r  r  r$  r*  rA  r   rY  r  r  r*   r  r   r;  r<  r6  )rO   rN  r   r  	state_reqrO  es          r@   _run_conditionzAutomaton._run_condition  s   	VJJqqdnnnd>P>P>PQRRRD&&&&&&& JJqASASASTUUUUU % 	 	 	JJq4>>>4K]K]K]_h_n_n_noppp~**% 1L''Q000,t'9: O O

186?JKKKtNi3NNNy7MNNNN 	 	 	JJqT^^^TM_M_M_abababcddd	s$   3A E,B4D  E-*EEc                     t          j                    }t          j        | j        |f|z   |d          }d|_        |                                 |                                 d S )Nzscapy.automaton _do_start)r#  r   r  rG   T)r  Eventr-  _do_controldaemonr  r  )rO   r   r  ready_ts        r@   	_do_startzAutomaton._do_start  sc    !!#T",	
 
 
 	





rB   c                    | j         5  t          j                    j        | _        | j        d| _        || j        t          |          d          z   }| j                                        }|	                    |            | j
        |i |  | j        d         |           | _        | j        p | j        di | j        | _        | j        r| j        p | j        di | j        | _        t)          d| j        j        z            | _        d}|                                 }|                     dd| j        z             |                                 	 	 | j                                        }|	 d d d            d S |                     dd|j        z             |j        t<          j        k    rd	}n|j        t<          j         k    rd}nw|j        t<          j!        k    r|j        t<          j"        k    r6| j#        r.| #                                | _        |                                 }nn|j        t<          j$        k    rn	 tK          |          }	tM          |	| j'                  rntM          |	| j(                  r6tS          t<          j*        |	
          }| j+        ,                    |           n9|r6tS          t<          j-        |	
          }| j+        ,                    |           nn# t\          t^          f$ r= tS          t<          j0        | j1                  }| j+        ,                    |           Y ntd          $ r}
tg          j4                    }|                     dd| j        d5                    tm          j7        |           fz             tS          t<          j8        |
|          }| j+        ,                    |           Y d }
~
nd }
~
ww xY w|                     dd| j        z             d | _        | j        r| j        9                                 | j        r| j        9                                 d d d            d S # 1 swxY w Y   d S )Nr   zsession[%s])rG   Trv  z Starting control thread [tid=%i]r
  zReceived command %sF)r   r   )r   r   z&Transferring exception from tid=%i:
%sr  )r   	exceptionr   z Stopping control thread (tid=%i)rq   ):r  r  current_threadidentr  r  r1   r  ry  r   r  r  r   r  r  r   r  r  r  r  r   r  r   r  _do_iterr  r$   r  r|   r   ro  rp  rq  rr  rs  r  rt  nextr   rp  rd  r   rx  r  rj   rw  StopIterationRuntimeErrorru  final_state_outputr6  sysr   r   r  format_exceptionrv  r   )rO   r  r   r  ar   
singlestepiteratorr  r   r  r   r  s                r@   r  zAutomaton._do_control	  s   \ H	' H	'%466<DM}$ ! t~c$iijj11A$$&&AHHUOOODOQ$!$$$ 0,Q/55DJ!YS*>$*>*S*SAR*S*SDN# Z#'9#Y0D0D0Y0YtGX0Y0Y %=4>;R+RSSSDLJ}}HJJq<t}LMMMIIKKK*$ "
))Ay#9H	' H	' H	' H	' H	' H	' H	' H	': JJq"7!&"@AAAv!222%*

=#555%)

=#777 =#555? ")-):):DJ'+}}HH "=#:::" $X%eT-@AA "!'t?? " ']-EU S S SA K,,Q///!% " ']-EU S S SA K,,Q///!"+ "B "<0 $ $ $!2#'#:< < <  ##### $ $ $<>>

1G4=Z\ZaZabkb|  G  cH  [I  [I  KJ  J  K  K  K!8APXYYY  ########	$
 JJq<t}LMMM DM ) &&(((~ '$$&&&QH	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	' H	'sR   EQK3E1K32Q3AO>Q 	O	BOQOA(QQQc           	   #     K   	 	 |                      dd| j        j        z             | j        j        | j        v rV| j        j        | j        k    rA| j        j        | _        |                     d| j        j        z  | j        j                  V  d | _        | j                                        }| j        j        r3|                     d| j        j        d|d|| j        j        	          | j        j        r	|| _	        d S |d
}nt          |t                    s|f}| j        | j        j                 }t          | j        gd          s| j        | j        j                 D ]} | j        |g|R   t#          | j        | j        j                           dk    rot#          | j        | j        j                           dk    rG|                                dk    r/|                     d| j        j        z  | j        j        |          |                                 t/          j                    }| j        g}t          }| j        r=| j        | j        j                 r&|                    | j                   | j        j        }| j        | j        j                 D ]'}|                    | j        |j                            (	 t/          j                    }|                    ||z
             |}|                                D ]}	 | j        |	j        g|R   |                                 }
|                      dd|z              |||
          }|                      dd|z             |D ]}|                      dd|z             || j        k    r| !                    d          V  ?|| j        k    ro	 | j        "                                }n# tF          $ r | j        $                                 d| _        |%                    |           | j        j        | j&        v rU| j&        | j        j                 }|                      dd|j'        z              | j&        | j        j                 |           tG          d          w xY w|| (                    |          rV|                      dd|)                                z             | j        | j        j                 D ]} | j        ||g|R   |                      dd|)                                z             |                      dd|j*        z             | j        | j        j                 D ]!}|j        |j*        k    r | j        ||g|R   "# tV          j,        $ rA}|                      dd| j        j        d|j        d           || _        |V  Y d }~nd }~ww xY w)NTr   z## state=[%s]z breakpoint triggered on state %sr@  zReached z: [r  )r   r   rq   r   zstuck in [%s]rk  r
  zSelect on %rzSelected %rzLooking at %rzReceived command messageFr  zCondition EOF [%s] takenzSocket ended arbruptly.rv  z	RECVD: %s   z	FILTR: %szIOEVENT on %szswitching from [z] to [)-r  r   r  r  rd  r>  r3  r[  r5  r  r   r#   re  rA   r  r  r  r1   r  r  r   r^  r   r   r  r*   r"   r  r%  r   r   r   r   rp  r|   rt   r   remover  r   r1  rx  r  r*  rA  )rO   state_outputr   rN  time_previousfdsselect_funcr  time_currentr   r8   r  fdr   rm  rcvcondioevtr  s                     r@   r  zAutomaton._do_iterU  s_     e	 d 

1o
0@@AAA :#t'777DJ<LPTPa<a<a(,
(8D%//*LtzO_*_04
0@ * B B B B B$(!#z~~//:# W///
@P@P@PR^R^R^*_1=TZEU * W W W:# .:D+F'#%LL#L$77 1#/=Ldj&67 &tzlA66 > $
0@ A A A++D@<@@@@@ D01ABCCqHHDM$**:;<<AA"LLNNa//"jj4:;K)K/3z/?0< ) > > >
  $	zl,# :(<TZ=M(N :JJt/000"&"2"9K M$**:; < <DJJty)9:;;;;.R#'9;;L$$\M%ABBB$0M!'!1!1 H H++EKG,GGGGG#..00FJJq.3"6777#C00AJJq-!"3444 #R #R

1o&:;;;++"&"5"56P"Q"QQQQQ4#333N&*&6&;&;&=&=#+ N N N
 !% 0 6 6 8 8 838 0 #

2#':#3ty#@#@*.)DJ4D*EC$(JJq2Ls|2[$\$\$\*E$)DJ4D*Ed*K*K$K +33L*M*M$M!N"  ##'#5#5c#:#: !O$(JJq+2M$N$N$N373G
HX3Y %Y %Y(;(;GS(X<(X(X(X(X(X%Y %)JJq+2M$N$N$N JJq/BI*EFFF)-tz7G)H R R#(#4	#A#A$7D$7r$QL$Q$Q$Q$QRY.R` )      

11tz?O?O?OQZQ`Q`Q`abbb&
 Ee	 s9   C>V J9V ?OV B7RC8V W7WWc                 \    d| j         j        dddg|                                          dS )Nz<Automaton r~  HALTEDRUNNINGz]>)r  r   r  rV   s    r@   r   zAutomaton.__repr__  s;      N###y!$.."2"2333
 	
rB   c                 r    |D ]3}t          |d          r|j        }| j                            |           4d S Nr  )rL  r  r  r/   rO   iptsipts      r@   r  z!Automaton.add_interception_points  sN     	. 	.CsL)) %n$((----	. 	.rB   c                 r    |D ]3}t          |d          r|j        }| j                            |           4d S r  )rL  r  r  discardr  s      r@   r  z$Automaton.remove_interception_points  sN     	2 	2CsL)) %n$,,S1111	2 	2rB   c                 r    |D ]3}t          |d          r|j        }| j                            |           4d S r  )rL  r  r  r/   rO   bpsbps      r@   r  zAutomaton.add_breakpoints  sN     	% 	%Br<(( #]  $$$$	% 	%rB   c                 r    |D ]3}t          |d          r|j        }| j                            |           4d S r  )rL  r  r  r  r  s      r@   r  zAutomaton.remove_breakpoints  sN     	) 	)Br<(( #]$$R((((	) 	)rB   c                 f    |                                  rt          d           | j        |i | d S )NzAlready started)r  r   r  r  s      r@   r  zAutomaton.start  s@    >> 	0.///&&&&&&rB   Tc                    |t          t          j                  }| j                            |           |r	 | j                                        }|d S nC# t          $ r6 | j                            t          t          j                             Y d S w xY w|j	        t          j
        k    r|j        S |j	        t          j        k    r'|                     d|j        j        |j                  |j	        t          j        k    r.|                     d|j        j        z  |j        j                  |j	        t          j        k    r.|                     d|j        j        z  |j        j                  |j	        t          j        k    re|j        d          |j        d                     n|j        d         }|j        |j        d	         ur |                    |j        d	                   |d S )
Nr   zpacket intercepted)r   rl  zsinglestep state=[%s]r@  z"breakpoint triggered on state [%s]r   r   r  )r   ro  rp  r  rj   r  r|   r  rr  r   ru  r   ry  rm  r   r   rw  rg  rx  rd  rv  r   __traceback__with_traceback)rO   resumer  r  values        r@   r>  zAutomaton.run  s   
 >-"3444F
 	K$$&&94 $   
]-A B B BCCCtt v***x=222,,-A_`_d,eee=333oo&=&MUVU\Uboccc=333oo&JQW]&Zbcbibooppp=222 ,-:a=+@
1ajQRm&ajm;;..qz!}===ts   A <BBc                 2    |                      ||           d S rd   )r>  )rO   r  r  s      r@   r  zAutomaton.runbg
  s    rB   c                 ^    |                      t          t          j                            S )Nr  )r  )r>  r   ro  rq  rV   s    r@   __next__zAutomaton.__next__  s$    xxwM,>???x@@@rB   c                 P    | j         | j        fD ]}|                                 d S rd   )r  r  r   )rO   rz  s     r@   _flush_inoutzAutomaton._flush_inout  s5     J, 	 	CIIKKKK	 	rB   c                    t          | d          sdS |                                 rt          d          | j                                         | j                                         |                                  t          j        | j	        
                                | j        
                                          D ]+}t          |t                    r|                                 ,dS )z
        Destroys a stopped Automaton: this cleanups all opened file descriptors.
        Required on PyPy for instance where the garbage collector behaves differently.
        r  Nz6Can't close running Automaton ! Call stop() beforehand)rL  r  r   r  r   r  r  r  r  r  r  r  r   rE   )rO   r<   s     r@   r  zAutomaton.destroy  s     tY'' 	F>> 	WUVVV
!1!1!3!3TZ5F5F5H5HII 	 	A!Z(( 				 	rB   c                     	 | j                             t          t          j                             n# t
          $ r Y nw xY w|r6| j        5  |                                  d d d            d S # 1 swxY w Y   d S d S Nr  )r  rj   r   ro  rs  r  r  r  rO   r  s     r@   r4  zAutomaton.stop+  s    	JOOG);<<<==== 	 	 	D	 	$ $ $!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $	$ 	$!   25 
AAA00A47A4c                     	 | j                             t          t          j                             n# t
          $ r Y nw xY w|r6| j        5  |                                  d d d            d S # 1 swxY w Y   d S d S r  )r  rj   r   ro  rt  r  r  r  r  s     r@   r  zAutomaton.forcestop5  s    	JOOG)@AAABBBB 	 	 	D	 	$ $ $!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $	$ 	$r  c                 H    |                                    | j        |i | d S rd   )r4  r  r  s      r@   restartzAutomaton.restart?  s,    		
D"E"""""rB   c                     t                      }|t          j        |_        nt          j        |_        ||_        |                     ||          S )Nr  r  )r   ro  rz  r   r{  r   r>  )rO   r   r  rsms       r@   accept_packetzAutomaton.accept_packetD  sE    
 ii;$+CHH$,CHCGxxsx...rB   c                 d    t          t          j                  }|                     ||          S )Nr  r  )r   ro  r|  r>  )rO   r  r  s      r@   reject_packetzAutomaton.reject_packetQ  s-     =/000xxsx...rB   )r   r   r   r   )T)F)Gr   r   r   r  r   r  r  r  r  re  r  r  r  r  r  r   	raw_layerr  r   r  rP   r  classmethodr0   r   r	   rn   r   ru   r/  r1  r3  r5  r7  r  r  r6  rS  rW  r[  r^  ra  rd  rg  rm  rp  r  r  rj   r   r   r  r  r  r  r   r  r  r  r  r  r>  r  r  r  r  r4  r  r  r  r  rq   rB   r@   r  r  r  s       FEOJDHGGNJGN nGI8 8 8t# # # #  59c cc01c c 	c !) 7	c c c [cJ  + + +
' 
' 
'  )# )# )# )# )# )# )# )#V" " " " " " " ">! ! ! ! !Y ! ! !    +       '       "       -       %       %   ! ! ! ! !, ! ! !    +   # # #
% % %, , ,<    V V V(  J' J' J'Xg  g  g R
 
 
. . .2 2 2% % %) ) )' ' '    B   A A A    &$ $ $ $$ $ $ $# # #  / / / / !/ / / / / /rB   r  )	metaclass)E__doc__r&   r  r  rI   rT   ru   r  r  r   r  typesr"   collectionsr   scapy.configr   scapy.constsr   
scapy.datar   scapy.errorr   r   scapy.interfacesr	   scapy.packetr
   scapy.plistr   scapy.supersocketr   r   scapy.utilsr   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.compatr   r.   rA   rC   rE   r   r   r   r  r   r*  ro  r~  r  r   r  r  rq   rB   r@   <module>r     sc          				   



                                          , , , , , , , , / / / / / /       " " " " " " 7 7 7 7 7 7 7 7                                             " + * * * * * Y Y Yx WT]]r/ r/ r/ r/ r/ r/ r/ r/j
 
 
 
 
 
 
 
(D> D> D> D> D> D> D> D>N,& ,& ,& ,& ,& ,& ,& ,&^G G G G G G G GH       &_ _ _ _ _ _ _ _D        3/ 3/ 3/ 3/ 3/ 3/ 3/ 3/l
 
 
 
 
 
 
 
c$ c$ c$ c$ c$$ c$ c$ c$Ld/ d/ d/ d/ d/- d/ d/ d/ d/ d/ d/rB   