
    hg                        d Z ddlZddlmZmZmZmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZmZmZ dZd	Z G d
 de          Z G d de          Z G d de	          Z eeed            eeed            e
eedd            ej        eed            ej        eed            ej        eed            ej        eed            G d de          ZdS )z
LLMNR (Link Local Multicast Node Resolution).

[RFC 4795]

LLMNR is based on the DNS packet format (RFC1035 Section 4)
RFC also envisions LLMNR over TCP. Like vista, we don't support it -- arno
    N)BitEnumFieldBitField	DestFieldDestIP6Field
ShortField)Packetbind_layersbind_bottom_up)orb)UDP)DNSCompressedPacketDNS_amDNSDNSQRDNSRRzFF02:0:0:0:0:0:1:3z224.0.0.252c                      e Zd ZdZg Z edd           eddd           edddddi           ed	dd           ed
dd           eddd           eddd          gej	        dd         z   Z	e
dddiZd Zd Zd ZdS )
LLMNRQueryz,Link Local Multicast Node Resolution - Queryidr   qr   opcode   QUERYctctziN  sportdportc                     | j         S N)originalselfs    V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/llmnr.pyget_fullzLLMNRQuery.get_full6   s
    }    c                 6    t          j        d| j                  S )Nz!H)structpackr   r%   s    r'   hashretzLLMNRQuery.hashret:   s    {4)))r)   c                    | j         j        }| j        rn| j        rat	          | j        d         t
                    rA|d| j        d         j                            d          d| j        d         j        dz  }n`|dz  }nZ| j	        rNt	          | j	        d         t                    r.|d| j	        d         j                            d          dz  }n|dz  }|t          gfS )	Nr   z 'backslashreplace)errorsz	' is at ''z [malformed]z
 who has ')	__class____name__r   an
isinstancer   rrnamedecoderdataqdr   qnamer   )r&   ss     r'   	mysummaryzLLMNRQuery.mysummary=   s    N#7 	 w $:dgaj%88 $GAJ%,,4F,GGGGGAJ$$$ 
 ^#W 	 DGAJ66 	 A
 ''/A'BBBB AA A3%xr)   )r3   
__module____qualname__namer9   r   r   r   r   fields_descr   overload_fieldsr(   r-   r<    r)   r'   r   r   (   s        9D	B
4q!Xq!a\22aq!aa 	K dT::;O  * * *    r)   r   c                       e Zd ZdZdZd ZdS )LLMNRResponsez/Link Local Multicast Node Resolution - Responser   c                 x    t          |t                    o%| j        |j        k    o| j        dk    o
|j        dk    S )Nr   r   )r5   r   r   r   )r&   others     r'   answerszLLMNRResponse.answersT   sC    5*-- 58#1 A	r)   N)r3   r=   r>   r?   r   rG   rB   r)   r'   rD   rD   P   s-        <D	
B    r)   rD   c                   &    e Zd Zedd            ZdS )_LLMNRNc                 x    t          |          dk    r&t          |d                   dz  rt          S t          S | S )N      )lenr   rD   r   )cls_pktargskargss       r'   dispatch_hookz_LLMNR.dispatch_hook\   s9    t99>>DGt# "$$!!
r)   r#   )r3   r=   r>   classmethodrR   rB   r)   r'   rI   rI   [   s2           [  r)   rI   r   )r!   )r    r   c                       e Zd ZdZdZdZeZdS )LLMNR_amz
    LLMNR answering machine.

    This has the same arguments as DNS_am. See help(DNS_am)

    Example::

        >>> llmnrd(joker="192.168.0.2", iface="eth0")
        >>> llmnrd(match={"TEST": "192.168.0.2"})
    llmnrdzudp port 5355N)r3   r=   r>   __doc__function_namefilterr   rN   rB   r)   r'   rU   rU   p   s)        	 	 MF
CCCr)   rU   )rW   r+   scapy.fieldsr   r   r   r   r   scapy.packetr   r	   r
   scapy.compatr   scapy.layers.inetr   scapy.layers.dnsr   r   r   r   r   _LLMNR_IPv6_mcast_Addr_LLMNR_IPv4_mcast_addrr   rD   rI   	bind_addrrU   rB   r)   r'   <module>rb      sa                  = < < < < < < < < <       ! ! ! ! ! !              . & % % % % %$ % % %P    J       V    sF$ ' ' ' ' sF$ ' ' ' ' Ct4 0 0 0 0 	 J 6d C C C C 	 M#9 F F F F  z#9 F F F F  }&<D I I I I    v     r)   