
    h/O                        d Z ddlm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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 ddlmZ ddlmZmZm Z  ddl!m"Z"m#Z# dd	l$m%Z%m&Z& dd
l'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 e4rddl5m6Z6 ese r ej7        ej8                  Z9n ej7        ej:                  Z9eZ;e;r G d dej<                  Z=n)e r G d dej<                  Z=n G d dej<                  Z= G d dej<                  Z> ej7        e>          Z? G d de+          Z@ G d de@          ZA G d deA          ZB G d deB          ZCddZDdS )z)
Scapy *BSD native support - BPF sockets
    )selectN)get_dev_bpfattach_filter)	BIOCGBLENBIOCGDLT
BIOCGSTATSBIOCIMMEDIATEBIOCPROMISC	BIOCSBLENBIOCSDLT	BIOCSETIFBIOCSHDRCMPLTBIOCSTSTAMPBPF_BUFFER_LENGTHBPF_T_NANOTIME)conf)DARWINFREEBSDNETBSD)	ETH_P_ALLDLT_IEEE802_11_RADIO)Scapy_Exceptionwarning)network_name_GlobInterfaceType)SuperSocket)raw)AnyListOptionalTupleTypeTYPE_CHECKING)Packetc                   2    e Zd Zdej        fdej        fgZdS )bpf_timevaltv_sectv_nsecN__name__
__module____qualname__ctypesc_ulong_fields_     ^/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/arch/bpf/supersocket.pyr&   r&   E   s)        v~./1r1   r&   c                   2    e Zd Zdej        fdej        fgZdS r&   r'   tv_usecNr)   r0   r1   r2   r&   r&   J   s)        v~./1r1   c                   2    e Zd Zdej        fdej        fgZdS r4   )r*   r+   r,   r-   c_uint32r/   r0   r1   r2   r&   r&   N   s)        v/02r1   c                   H    e Zd Zdefdej        fdej        fdej        fgZdS )bpf_hdr	bh_tstamp	bh_caplen
bh_datalen	bh_hdrlenN)r*   r+   r,   r&   r-   r7   c_uint16r/   r0   r1   r2   r9   r9   S   s;        k*fo.v/fo.0HHHr1   r9   c                       e Zd ZdZdgZdZdZdeddddfdZd	 Z	d
 Z
d ZddZd Zd Zd Zd Zej        d             Zej        efd            Zedd            ZdS )_L2bpfSocketz"Generic Scapy BPF Super Socketbpf_fdzread/write packets using BPFTNr   Fc           	         |rt          d          d | _        || _        d| _        |t          j        }|| _        t          |pt          j                  | _        t                      \  | _        | _
        t          r_	 t          j        | j        t          t          j        dt"                               n%# t$          $ r t          d| j
        z            w xY w	 t          j        | j        t&          t          j        dt(                               n%# t$          $ r t          d| j
        z            w xY w	 t          j        | j        t*          t          j        d| j                                                             n%# t$          $ r t          d| j        z            w xY w| j        r|                     d           t0          r|r	 t3          j                    d	                             d
          }d |D             }|d	         dz  }||d         dz  |d         z   z  }n2# t8          t:          f$ r t=          d           t>          j         }Y nw xY w|dk     rat          j        dtB                    }		 t          j        | j        tD          |	           n4# t$          $ r t          d| j        z            w xY wt=          d           	 t          j        | j        tF          t          j        dd                     n%# t$          $ r t          d| j
        z            w xY w	 t          j        | j        tH          t          j        dd                     n%# t$          $ r t          d| j
        z            w xY wd}
|s}t          j%        r%|rd|dt          j%        d}ndt          j%        z  }|J	 tM          | j        || j                   d}
n+# tN          t           f$ r}t          d|z            d }~ww xY wtP          rL|
du rHd}	 tM          | j        || j                   n)# tN          $ r}t=          d|z             Y d }~nd }~ww xY w| )                                | _*        d S )NzaWe do not natively support monitor mode on BPF. Please turn on libpcap using conf.use_pcap = TrueIz BIOCSTSTAMP failed on /dev/bpf%izBIOCSBLEN failed on /dev/bpf%i16s16xzBIOCSETIF failed on %sTr   .c                 ,    g | ]}t          |          S r0   )int).0nums     r2   
<listcomp>z)_L2bpfSocket.__init__.<locals>.<listcomp>   s    "G"G"G3s88"G"G"Gr1   i'     d      z'Could not determine your macOS version!i| zCan't set %s into monitor mode!zKScapy won't activate 802.11 monitoring, as it will crash your macOS kernel!z"BIOCIMMEDIATE failed on /dev/bpf%iiz"BIOCSHDRCMPLT failed on /dev/bpf%iF(z) and not ()znot (%s)zCannot set filter: %sz	greater 0)+r   fd_flagstyperA   r   sniff_promiscpromiscr   ifacer   dev_bpfr   fcntlioctlr   structpackr   IOErrorr   r   r   encodeset_promiscr   platformmac_versplit
IndexError
ValueErrorr   sysmaxintr   r   r	   r   except_filterr   ImportErrorr   	guess_clsguessed_cls)selfrV   rS   rU   filternofiltermonitortmp_mac_versionmacos_versiondlt_radiotapfilter_attachedexs               r2   __init__z_L2bpfSocket.__init__g   sO     	!D  
 	 ?(G!%"54:66
 %0MM!T\ 		44KK^44     4 4 4%&H&*l'3 4 4 44	0KYC!233     	0 	0 	0!"B"&,#/ 0 0 0	0
	IKYHdj&7&7&9&9::     	I 	I 	I!":TZ"GHHH	I < 	#T"""
  	?g 	?+"*"2"4"4Q"7"="=c"B"B"G"G"G"G"G / 2U :!3c!9OA<N!NN
+ + + +ABBB #
+
 v%%%{30DEE6KX|DDDD 6 6 6)*K*.*+5 6 6 66  > ? ? ?	0K]FKQ4G4GHHHH 	0 	0 	0!"F"&,#/ 0 0 0	0	0K]FKQ4G4GHHHH 	0 	0 	0!"F"&,#/ 0 0 0	0
   	H! = = =4:FFD<N<N<NOFF'$*<<F!H!$+vtzBBB&*OO#_5 H H H)*AB*FGGGH 		6o..
 !F6dk64:>>>> 6 6 6/"4555555556  >>++s   ?8B8 8"C8D "D9=A
F "F*AH0 0,II J$ $"K3L "L/33M' '"N	O" "P
3PP
P7 7
QQQc                     	 t          j        | j        t          t	          j        d|                     dS # t          $ r t          d| j        z            w xY w)z%Set the interface in promiscuous moderO   z.Cannot set promiscuous mode on interface (%s)!N)	rX   rY   rA   r
   rZ   r[   r\   r   rV   )rj   values     r2   r^   z_L2bpfSocket.set_promisc   sk    	8K[&+c52I2IJJJJJ 	8 	8 	8! #*,0J#7 8 8 8	8s	   37 "Ac                 6    | |                                   dS dS )z#Close the file descriptor on deleteN)closerj   s    r2   __del__z_L2bpfSocket.__del__   s#    
 JJLLLLL r1   c                    	 t          j        | j        t          t	          j        dd                    }t	          j        d|          d         }n3# t          $ r& t          j	        }t          d|j                   |cY S w xY w	 t          j        j        |         S # t          $ r' t          j	        }t          d||j                   |cY S w xY w)z9Guess the packet class that must be used on the interfacerD   r   z1BIOCGDLT failed: unable to guess type. Using %s !z(Unable to guess type (type %i). Using %s)rX   rY   rA   r   rZ   r[   unpackr\   r   
default_l2r   namel2types	num2layerKeyError)rj   retlinktypeclss       r2   rh   z_L2bpfSocket.guess_cls   s    
	+dk8V[a5H5HIIC}S#..q1HH 	 	 	/CGH  JJJ			<)(33 	 	 	/C>#(SSSJJJ	s$   AA -B BB .CCc                    | j         K	 t          j        | j        t          j                  | _         n # t          $ r t          d           Y dS w xY w|r| j         t          j        z  }n| j         t          j         z  }	 t          j        | j        t          j        |           || _         dS # t          $ r t          d           Y dS w xY w)z'Set the non blocking flag on the socketNz*Cannot get flags on this file descriptor !z)Can't set flags on this file descriptor !)
rR   rX   rA   F_GETFLr\   r   os
O_NONBLOCKF_SETFL	Exception)rj   set_flagnew_fd_flagss      r2   set_nonblockz_L2bpfSocket.set_nonblock  s    
 =  %DK G G   DEEE
  	:=2=8LL=BM>9L	AKU]LAAA(DMMM 	A 	A 	A?@@@@@@	As!   )3 AA ,B. .C
Cc           	          	 t          j        | j        t          t	          j        ddd                    }t	          j        d|          S # t          $ r t          d           Y dS w xY w)z!Get received / dropped statistics2Ir   zUnable to get stats from BPF !)NN)	rX   rY   rA   r   rZ   r[   r{   r\   r   rj   r   s     r2   	get_statsz_L2bpfSocket.get_stats)  sm    	 +dk:v{4A7N7NOOC=s+++ 	  	  	 4555<<	 s   AA A('A(c                     	 t          j        | j        t          t	          j        dd                    }t	          j        d|          d         S # t          $ r t          d           Y dS w xY w)zGet the BPF buffer lengthrD   r   z#Unable to get the BPF buffer lengthN)	rX   rY   rA   r   rZ   r[   r{   r\   r   r   s     r2   get_blenz_L2bpfSocket.get_blen4  sp    	+dk9fk#q6I6IJJC=c**1-- 	 	 	9:::44	s   AA A-,A-c                     | j         S )z"Get the underlying file descriptor)rA   rx   s    r2   filenoz_L2bpfSocket.fileno?  s     {r1   c                     | j         s4| j        dk    r+t          j        | j                   d| _         d| _        dS dS dS )zClose the Super SocketrC   TN)closedrA   r   rw   rx   s    r2   rw   z_L2bpfSocket.closeD  sN     { 	t{b00HT[!!!DKDKKK	 	00r1   c                 :    t          d| j        j        z            )zDummy send methodzCan't send anything with %sr   	__class__r*   rj   xs     r2   sendz_L2bpfSocket.sendM  #     )DN,CC
 
 	
r1   c                 :    t          d| j        j        z            )zDummy recv methodzCan't recv anything with %sr   r   s     r2   recv_rawz_L2bpfSocket.recv_rawU  r   r1   c                 "    t          | |          S )zcThis function is called during sendrecv() routine to select
        the available sockets.
        )
bpf_select)socketsremains     r2   r   z_L2bpfSocket.select]  s     '6***r1   )TN)r*   r+   r,   __doc__	__slots__descnonblocking_socketr   rs   r^   ry   rh   r   r   r   r   rw   abcabstractmethodr   r   r   staticmethodr   r0   r1   r2   r@   r@   `   s@       ))
I)D @, @, @, @,D8 8 8    ,A A A A0	  	  	 	 	 	  
   	
 
 
 	* 
 
 
 
 + + + \+ + +r1   r@   c                   T     e Zd ZdZ fdZd Zd Zed             Zd Z	e
fdZ xZS )L2bpfListenSocketz!"Scapy L2 BPF Listen Super Socketc                 V    g | _          t          t          |           j        |i | d S r   )received_framessuperr   rs   )rj   argskwargsr   s      r2   rs   zL2bpfListenSocket.__init__j  s4    !/&&/@@@@@@r1   c                 *    t          | j                  S )z)Return the number of frames in the buffer)lenr   rx   s    r2   buffered_framesz!L2bpfListenSocket.buffered_frameso  s     4'(((r1   c                 H    | j         r| j                             d          S dS )z,Get a frame or packet from the received listr   NNN)r   poprx   s    r2   	get_framezL2bpfListenSocket.get_framet  s,      	$'++A...##r1   c                 :    | |z   t           dz
  z   t           dz
   z  S )z1Return the index to the end of the current packetrL   )BPF_ALIGNMENT)bh_hbh_cs     r2   	bpf_alignzL2bpfListenSocket.bpf_align|  s%     !239J7KKKr1   c                    t          |          }|t          k     rdS t                              |          }|j        dk    rdS ||j        |j        |j        z            }t          r|j        j	        d|j        j
        z  z   }n|j        j	        d|j        j        z  z   }| j                            | j        ||f           |                     |j        |j                  }||z
  dk    r|                     ||d                    dS dS )zY
        Extract all frames from the buffer and stored them in the received list
        Nr   g&.>gư>   )r   _bpf_hdr_lenr9   from_buffer_copyr<   r=   r;   	_NANOTIMEr:   r'   r(   r5   r   appendri   r   extract_frames)rj   
bpf_bufferlen_bbbh_hdr	frame_strtsends          r2   r   z L2bpfListenSocket.extract_frames  s)    ZL  F ))*55!!F V-0@@@
	  	K!(4&2B2J+JJBB!(4&2B2J+JJB##y"-	
 	
 	

 nnV-v/?@@SLR
344 011111  r1   c                    t          |t                    }|                                 r|                                 S 	 t	          j        | j        |          }n># t          $ r1}|j        t          j	        k    rt          dd           Y d}~dS d}~ww xY w|                     |           |                                 S )z Receive a frame from the networkzBPF recv_raw()T)exc_infoNr   )minr   r   r   r   readrA   EnvironmentErrorerrnoEAGAINr   r   )rj   r   r   excs       r2   r   zL2bpfListenSocket.recv_raw  s     $%%!! 	$>>###	$a00JJ 	$ 	$ 	$yEL(((48888######	$ 	J'''~~s   A 
B$&BB)r*   r+   r,   r   rs   r   r   r   r   r   r   r   __classcell__r   s   @r2   r   r   g  s        ++A A A A A
) ) )
$ $ $ L L \L2 2 2B +                r1   r   c                       e Zd ZdZd Zd ZdS )L2bpfSocketz"Scapy L2 BPF Super Socketc                 P    t          j        | j        t          |                    S )zSend a frame)r   writerA   r   r   s     r2   r   zL2bpfSocket.send  s     xSVV,,,r1   c                     |                                  rt                              |           S |                     d           t                              |           }|                     d           |S )zNon blocking receiveTF)r   r   recvr   )rj   pkts     r2   nonblock_recvzL2bpfSocket.nonblock_recv  sn     !! 	0$))$/// 	$$$T**%   
r1   N)r*   r+   r,   r   r   r   r0   r1   r2   r   r     s8        $$- - -
    r1   r   c                   n     e Zd Zdeddddf fd	Zefdededed         fd	Z	d
 Z
edd            Z xZS )L3bpfSocketNr   Fc                     t          t          |                               ||||||           || _        t	          | j                  | i| _        d S )N)rV   rS   rU   rk   rl   rm   )r   r   rs   rk   r   rV   
send_socks)rj   rV   rS   rU   rk   rl   rm   r   s          r2   rs   zL3bpfSocket.__init__  sa     	k4  )) 	* 	
 	
 	
 '
33T:r1   r   r   returnr$   c                 `    t          j        | |fi |}|r|j        |j        _        |j        S |S )zReceive on layer 3)r   r   timepayload)rj   r   r   rs       r2   r   zL3bpfSocket.recv  s<    T1//// 	VAIN9r1   c                 f   ddl m} |                                d         }|t          t          j                  }|| j        vr*t          || j        | j	        | j
                  | j        |<   | j        |         }t          r#|                    d          r| j        |k    r|}nZt          r<|                    d          s|                    d          rt          d|           dS |                                |z  }t!          j                    |_        t$                              ||          S )zSend a packetr   )LoopbackN)rV   rS   rk   rU   tuntapz2Cannot write to %s according to the documentation!)scapy.layers.l2r   router   r   rV   r   r   rS   rk   rU   r   
startswithri   r   r   r   	sent_timer   r   )rj   r   r   ifffdframes         r2   r   zL3bpfSocket.send  s7    	-,,,,, iikk!n;tz**C do%%#.Y{	$ $ $DOC  _S!6  	+cnnU++ 	+0@H0L0LEE 
	+#..// 
	+3>>%3H3H 
	+ H#NNNFNN$$s*E	 E***r1   c                     g }| D ]I}t          |t                    r||j                                        z  }4|                    |           Jt
                              ||          S )N)r   )
isinstancer   r   valuesr   r   r   )r   r   sockssocks       r2   r   zL3bpfSocket.select0  sr      	# 	#D$,, #//111T""""!!%!777r1   r   )r*   r+   r,   r   rs   r   rH   r   r    r   r   r   r   r   r   s   @r2   r   r     s         ; ; ; ; ; ;& .  c  (AS    >+ >+ >+@ 8 8 8 \8 8 8 8 8r1   r   c                 2   t                      }t                      }| D ]V}t          |t                    r*|                                r|                    |           A|                    |           W|r|d}t          |g g |          \  }}}||z   S |S )zA call to recv() can return several frames. This functions hides the fact
       that some frames are read from the internal buffer.Ng?)listr   r   r   r   r   )fds_listtimeoutbpf_scks_buffered
select_fdstmp_fd
ready_list_s          r2   r   r   >  s     J " " f/00 	V5K5K5M5M 	$$V,,, 	&!!!! !?G!*b"g>>
Aq :--  r1   r   )Er   r   r   r-   r   rX   r   r_   rZ   rd   r   scapy.arch.bpf.corer   r   scapy.arch.bpf.constsr   r   r   r	   r
   r   r   r   r   r   r   r   scapy.configr   scapy.constsr   r   r   
scapy.datar   r   scapy.errorr   r   scapy.interfacesr   r   scapy.supersocketr   scapy.compatr   typingr   r   r    r!   r"   r#   scapy.packetr$   sizeofc_longr   c_int32r   	Structurer&   r9   r   r@   r   r   r   r   r0   r1   r2   <module>r     s'          



    				   



  : : : : : : : :                                  0 0 0 0 0 0 0 0 0 0 6 6 6 6 6 6 6 6 0 0 0 0 0 0 0 0 = = = = = = = = ) ) ) ) ) )                       $######  2f 2!FM&-00MM "FM&.11M	 21 1 1 1 1f& 1 1 1 1  21 1 1 1 1f& 1 1 1 12 2 2 2 2f& 2 2 2
0 0 0 0 0f 0 0 0 v}W%%
D+ D+ D+ D+ D+; D+ D+ D+NR  R  R  R  R  R  R  R j    #   .f8 f8 f8 f8 f8+ f8 f8 f8V! ! ! ! ! !r1   