
    h8              	          d 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 ddlmZmZmZmZ dd	lmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z  dd
l!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'  G d de          Z(dddddddZ)dddZ*ddiZ+ddiZ,ddddd Z-d!d"d#Z. G d$ d%e          Z/ G d& d'e          Z0 ee/e0dd(d)            G d* d+e          Z1 G d, d-e          Z2 ee/e2dd.dd/           d0D ]Z3 ee/e2de3dd/            G d1 d2e0          Z4 ee/e4ddd)            ee/e4ddd)            G d3 d4e          Z5 G d5 d6e          Z6 ee/e6dd7dd/            G d8 d9e          Z7 ee/e7d:;            ee/e7d:d(dd<            G d= d>e          Z8 ee/e8d?d7dd/            G d@ dAe          Z9 G dB dCe          Z: ee#e/dDE            ee#e/dDF            ee#e/dDdDG            ee#e9dHE            ee#e9dHF            ee#e9dHdHG            ee$e:dIE            ee$e:dIF            ee$e:dJE            ee$e:dJF            ee$e:dJdJK            G dL dMe          Z;dS )Nz&
NetBIOS over TCP/IP

[RFC 1001/1002]
    N)get_if_addr)Net)AnsweringMachine)bytes_encode)conf)Packetbind_bottom_upbind_layersbind_top_down)BitEnumFieldBitFieldByteEnumField	ByteFieldFieldLenField
FlagsFieldIPFieldIntFieldNetBIOSNameFieldPacketListFieldShortEnumField
ShortFieldStrFixedLenFieldXShortFieldXStrFixedLenField)IPUDPTCP)EtherSourceMACFieldc                       e Zd ZdZ eddddi           edd           edd           edd	           ed
d           edd           edd           e	dd           e	dd          g	Z
d ZdS )
NetBIOS_DSzNetBIOS datagram servicetype   direct_groupflagsr   idsrc	127.0.0.1sport   lenNofssrcname dstnamec                     ||z  }| j         =t          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S )N   
   !H   )r+   structpack)selfppaytmp_lens       X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/netbios.py
post_buildzNetBIOS_DS.post_build7   sR    	S8!ffrkG#2#T7333af<A    )__name__
__module____qualname__namer   r   r   r   r   r   fields_descr<    r=   r;   r!   r!   )   s        %Dfb2~"677	'1D!{##
7C  
5$
5!B''B''
K    r=   r!   workstationmessenger servicefile server servicedomain master browserdomain controllerbrowser election service)AA  iDA  iAC  iLB  iMB  iOB  NBNBSTAT)    !      INTERNET  z%Label String Pointer to QUESTION_NAMEzB nodezP nodezM nodezH node)r   rO         zUnique namez
Group name)r   rO   c                       e Zd ZdZ edd           eddd           eddd           eddd	g d
           eddd           edd           edd           edd           edd          g	Zd ZdS )
NBNSHeaderzNBNS HeaderNAME_TRN_IDr   RESPONSErO   OPCODE   NM_FLAGS   )Bres1res0RARDTCAARCODEQDCOUNTANCOUNTNSCOUNTARCOUNTc                 <    dt          j        d| j                  z   S )Ns   NBNSz!B)r5   r6   rX   r7   s    r;   hashretzNBNSHeader.hashret   s    T4;7777r=   N)	r>   r?   r@   rA   r   r   r   rB   rj   rC   r=   r;   rU   rU   q   s        D
=!$$Q""1a  
:q! &, &, &, 	- 	- 	!Q
9a  
9a  
9a  
9a  K$8 8 8 8 8r=   rU   c            	           e Zd ZdZ edd           edde           edd           edd	e           ed
de	          gZ
d ZdS )NBNSQueryRequestzNBNS query requestQUESTION_NAMEwindowsSUFFIXrJ   NULLr   QUESTION_TYPErM   QUESTION_CLASSrO   c                 >    d| j                             d          z  S )NzNBNSQueryRequest who has '\\%s'backslashreplaceerrorsrm   decoderi   s    r;   	mysummaryzNBNSQueryRequest.mysummary   s'    2%%-?%@@
 	
r=   N)r>   r?   r@   rA   r   r   _NETBIOS_SUFFIXESr   _NETBIOS_QRTYPES_NETBIOS_QRCLASSrB   ry   rC   r=   r;   rl   rl      s        D##OY??!>(F4EFF9VQ''!>/49IJJ!>"2A7GHH	JK
 
 
 
 
r=   rl   r#   )rX   rZ   rd   c            	       z    e Zd Z eddde           eddde           edddddi           ed	d
          gZdS )NBNS_ADD_ENTRYGr   rO   OWNER_NODE_TYPErR   UNUSED   Unused
NB_ADDRESSr(   N)r>   r?   r@   r   _NETBIOS_GNAMES_NETBIOS_OWNER_MODE_TYPESr   rB   rC   r=   r;   r~   r~      sg        S!Q00&A.	0 	0Xq"q(m44k**KKKr=   r~   c                       e Zd ZdZ edd           edde           edd           edd	e           ed
de	           e
dd           eddd           ed e            ged           gZd Zd ZdS )NBNSQueryResponsezNBNS query responseRR_NAMErn   ro   rJ   rp   r   rq   rM   rr   rO   TTLi RDLENGTHN
ADDR_ENTRY)	length_ofc                     | j         S N)r   pkts    r;   <lambda>zNBNSQueryResponse.<lambda>   s    3< r=   )length_fromc                 v    | j         sdS d| j                            d          d| j         d         j        S )Nr   zNBNSQueryResponse '\\rt   ru   z' is at r   )r   r   rx   r   ri   s    r;   ry   zNBNSQueryResponse.mysummary   sP     	'&&	' L'9::::OA))
 	
r=   c                 L    t          |t                    o|j        | j        k    S r   )
isinstancerl   rm   r   r7   others     r;   answerszNBNSQueryResponse.answers   s'    u.// 04</	
r=   )r>   r?   r@   rA   r   r   rz   r   r{   r|   r   r   r   r~   rB   ry   r   rC   r=   r;   r   r      s         D##Iy99!>(F4EFF9VQ''!>/49IJJ!>"2A7GHH8E7++ =T\JJJ"?<$2N$4$4#5~/G/GI I I
K
 
 

 
 
 
 
r=   r   P   )rX   rZ   rW   re   )X   p   x   c                        e Zd ZdZdZdZd ZdS )NBNSNodeStatusRequestzNBNS status requests   *              rN   c                 >    d| j                             d          z  S )Nz$NBNSNodeStatusRequest who has '\\%s'rt   ru   rw   ri   s    r;   ry   zNBNSNodeStatusRequest.mysummary   s'    7%%-?%@@
 	
r=   N)r>   r?   r@   rA   rm   rq   ry   rC   r=   r;   r   r      s2         D'MM
 
 
 
 
r=   r   c                       e Zd ZdZ eddd           eddddd	d
ddd           edd           eddddi          gZd ZdS )NBNSNodeStatusResponseServicez!NBNS Node Status Response ServiceNETBIOS_NAMEzWINDOWS            ro   r   rD   rE   rF   rG   rH   rI   )r   rS   rM            
NAME_FLAGSrY   r   unusedc                     t           j        S r   )r   padding_layer)r7   payloads     r;   default_payload_classz3NBNSNodeStatusResponseService.default_payload_class   s    !!r=   N)	r>   r?   r@   rA   r   r   r   rB   r   rC   r=   r;   r   r      s        .D##N4FKK =1-5H5J5L5H5O/1 /1 2 2 9\3// =1q(m<<	>K" " " " "r=   r   c                   4   e Zd ZdZ edd           edde           edd           edd	e           ed
de	           e
dd           edd           edddd           ed e            ged            ed           eddd          gZd ZdS )NBNSNodeStatusResponsezNBNS Node Status Responser   rn   ro   rJ   rp   r   RR_TYPErN   RR_CLASSrO   r   r   S   	NUM_NAMESNr\   	NODE_NAME)fmtcount_ofc                     | j         S r   )r   r   s    r;   r   zNBNSNodeStatusResponse.<lambda>  s    #- r=   )
count_fromMAC_ADDRESS
STATISTICSr=   .   c                 L    t          |t                    o|j        | j        k    S r   )r   r   rm   r   r   s     r;   r   zNBNSNodeStatusResponse.answers	  s'    u344 04</	
r=   )r>   r?   r@   rA   r   r   rz   r   r{   r|   r   r   r   r   r   r   r   rB   r   rC   r=   r;   r   r      s       &D##Iy99!>(F4EFF9VQ''!>)T3CDD!>*a1ABB8E1%%:j"-- =d*57 7 7"?;$A$A$C$C#D#@.G.GI I I ">-00$$\3;;=K 
 
 
 
 
r=   r   @   c                   l   e Zd ZdZ edd           edde           edd           edd	e           ed
de	           edde
           edd	e           edde	           edd           edd           eddde           eddde           edddddi           edd          gZd ZdS )NBNSRegistrationRequestzNBNS registration requestrm   Windowsro   rJ   rp   r   rq   rM   rr   rO   r   rQ   r   r   r   r      r   r   rR   r   r   r   r   r(   c                 ,    |                      d          S )Nz,Register %G% %QUESTION_NAME% at %NB_ADDRESS%)sprintfri   s    r;   ry   z!NBNSRegistrationRequest.mysummary+  s    ||JKKKr=   N)r>   r?   r@   rA   r   r   rz   r   r{   r|   _NETBIOS_RNAMESr   r   r   r   r   r   rB   ry   rC   r=   r;   r   r     s/       &D)44x):;;	&!.>??',<==y&/::y$(899z1&677
:q!!S!Q00&A.	0 	0Xq"q(m44k**K$L L L L Lr=   r      )rX   )rX   rZ   rd   rg   c                       e Zd ZdZ edd           edde           edd           edd	e           ed
de	           e
dd           edd           eddd          gZdS )NBNSWackResponsez&NBNS Wait for Acknowledgement Responser   rn   ro   rJ   rp   r   r   rM   r   rO   r   rR   r   RDATAi)     N)r>   r?   r@   rA   r   r   rz   r   r{   r|   r   r   r   rB   rC   r=   r;   r   r   7  s        3D##Iy99!>(F4EFF9VQ''!>)T3CDD!>*a1ABB8E1%%:j!,,8GUB//1KKKr=   r   r[   c                   >   e Zd ZdZ edd           edd           edd           edd	           ed
d           edd           edd           edd           edde	           edd           edd           edde	           edd          gZ
d ZdS )NBTDatagramzNBT Datagram PacketTyper   FlagsrR   IDr   SourceIPr(   
SourcePortr*   LengthNOffset
SourceNamern   SUFFIX1rJ   NULL1DestinationNameSUFFIX2NULL2c                     | j         =t          |          dz   }|d d         t          j        d|          z   |dd          z   }||z   S )ND   r2   r3   r4   )r   r+   r5   r6   r7   r   r9   lengths       r;   r<   zNBTDatagram.post_buildY  sN    ;XX]Fcrc(V[v666RSSACSyr=   )r>   r?   r@   rA   r   r   r   r   r   rz   rB   r<   rC   r=   r;   r   r   I  s         D9VT**9Wd++:dA&&7:{33:lC00:h--:h**##L)<<!>)V5FGG9Wa((##$5yAA!>)V5FGG9Wa((*K    r=   r   c                       e Zd ZdZdZ eddddddd	d
d           eddd           eddd          gZd Zd Z	e
d             ZdS )
NBTSessionzNBT Session Packeti TYPEr   zSession MessagezSession RequestzPositive Session ResponsezNegative Session ResponsezRetarget Session ResponsezSession Keepalive)r                  RESERVEDr[   LENGTHNr#   c                     | j         ?t          |          | j        z  }|d d         t          j        d|          dd          z   }||z   S )NrO   !I)r   r+   	MAXLENGTHr5   r6   r   s       r;   r<   zNBTSession.post_buildo  sM    ;XX.Fbqb'FKf55abb99CSyr=   c                 >    |d | j                  || j         d          fS r   )r   )r7   ss     r;   extract_paddingzNBTSession.extract_paddingu  s!    $+$+,,//r=   c                     t          |          dk     rd S t          j        d|d d                   d         | j        z  }t          |          |dz   k    r | |          S d S )NrY   r   r   )r+   r5   unpackr   )clsdataargskwargsr   s        r;   tcp_reassemblezNBTSession.tcp_reassemblex  sf    t99q==4tT"1"X..q1CMAt99
""3t99 #"r=   )r>   r?   r@   rA   r   r   r   rB   r<   r   classmethodr   rC   r=   r;   r   r   c  s        DI =3D3D3N3N3N3F-H -H I I 8Ja008HdB//1K  0 0 0   [  r=   r      )dport)r)   r)   r   r*   i     )r   r)   c                   2    e Zd ZdZdZddiZd	dZd Zd ZdS )
NBNS_amnbnsdzudp port 137storer   Nc                     t          |pd          | _        || _        t          |t                    rt          |          | _        dS || _        dS )z
        NBNS answering machine

        :param server_name: the netbios server name to match
        :param from_ip: an IP (can have a netmask) to filter on
        :param ip: the IP to answer with
        r.   N)r   
ServerNameipr   strr   from_ip)r7   server_namer  r   s       r;   parse_optionszNBNS_am.parse_options  sM     '{'8b99gs## 	#w<<DLLL"DLLLr=   c                     | j         r$t          |v r|t                   j        | j         vrdS t          |v o4| j         p,|t                   j                                        | j        k    S )NF)r  r   r'   rl   r   rm   strip)r7   reqs     r;   
is_requestzNBNS_am.is_request  sj    < 	B#II#b'+T\*I*I53& 
 K !/55774?J	
r=   c           	      $   t          |t                    j        |t                    j        dk    rd n|t                    j                  t          |t                   j                  z  t	          |j        |j                  z  }| j        p1t          | j	        
                    dt          j                            }|t                      t          | j        p|j        |j        t%          |          g          z  z  }|j        |_        |S )Nzff:ff:ff:ff:ff:ff)dstr'   )r	  r   iface)r   )r   ro   r   )r   r'   r	  r   r   r   r)   r   r   optsniffgetr   r
  rU   r   r   rm   ro   r~   rV   )r7   r  respaddresss       r;   
make_replyzNBNS_am.make_reply  s    E
E
*===3u:>
 
 
 3r7;  #&))#
 #
 #

 'P[):):7DJ)O)OPP
0O8s'8:&':::; 
  
  
 
 	

 ?r=   )NNN)	r>   r?   r@   function_namefiltersniff_optionsr  r  r  rC   r=   r;   r   r     sY        MFaLM# # # #
 
 
    r=   r   )<__doc__r5   
scapy.archr   scapy.base_classesr   scapy.ansmachiner   scapy.compatr   scapy.configr   scapy.packetr   r	   r
   r   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.inetr   r   r   scapy.layers.l2r   r   r!   rz   r{   r|   r   r   r   rU   rl   r~   r   _flgr   r   r   r   r   r   r   r   rC   r=   r;   <module>r     s     " " " " " " " " " " " " - - - - - - % % % % % %       K K K K K K K K K K K K                                 " + * * * * * * * * * 1 1 1 1 1 1 1 1       L &)+'.   
   z 
 3
 	    8 8 8 8 8 8 8 88
 
 
 
 
v 
 
 
 J(q2 2 2 2    V   
 
 
 
 
 
 
 
: J)1> > > > E EDN:0q!E E E E E
 
 
 
 
, 
 
 
 z0qRS T T T T J-cAq Q Q Q Q" " " " "F " " ""
 
 
 
 
V 
 
 
2 J.1> > > >L L L L Lf L L L0 z23 ? ? ? ? J/q!= = = =	1 	1 	1 	1 	1v 	1 	1 	1 J(1> > > >    &   4       < sJc * * * * sJc * * * * c:S 4 4 4 4 sKs + + + + sKs + + + + c;c 5 5 5 5 sJc * * * * sJc * * * * sJc * * * * sJc * * * * C3c 2 2 2 2, , , , , , , , , ,r=   