a
    kÄ#dM2  ã                   @   sØ  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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$ G d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$„ d$eƒZ,G d%d&„ d&eƒZ-ee,e-dd'dd(� G d)d*„ d*eƒZ.G d+d,„ d,eƒZ/ee,e/dd-ddd.� G d/d0„ d0e-ƒZ0ee,e0dddd(� ee,e0dddd(� G d1d2„ d2eƒZ1G d3d4„ d4eƒZ2ee,e2dd5ddd.� G d6d7„ d7eƒZ3ee,e3d8d'ddd9� G d:d;„ d;eƒZ4ee,e4d<d5ddd.� G d=d>„ d>eƒZ5G d?d@„ d@eƒZ6ee!e,dAdB� ee!e,dAdC� ee!e,dAdAdD� ee!e5dEdB� ee"e6dFdB� ee"e6dFdC� ee"e6dGdB� ee"e6dGdC� ee"e6dGdGdH� G dIdJ„ dJeƒZ7dS )Kz&
NetBIOS over TCP/IP

[RFC 1001/1002]
é    N)Úget_if_addr)ÚNet)ÚAnsweringMachine)Ú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)ÚSourceMACFieldc                   @   sj   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d„ ZdS )Ú
NetBIOS_DSzNetBIOS datagram serviceÚtypeé   Zdirect_groupÚflagsr   ÚidÚsrcú	127.0.0.1ÚsportéŠ   ÚlenNZofsÚsrcnameÚ Údstnamec                 C   sF   ||7 }| j d u rBt |ƒd }|d d… t d|¡ |dd …  }|S )Né   é
   z!Hé   )r&   ÚstructÚpack)ÚselfÚpÚpayZtmp_len© r2   úK/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/netbios.pyÚ
post_build6   s
    
$zNetBIOS_DS.post_build)Ú__name__Ú
__module__Ú__qualname__Únamer   r   r   r   r   r   Úfields_descr4   r2   r2   r2   r3   r   (   s   ÷r   Úworkstationúmessenger serviceúfile server serviceúdomain master browserúdomain controllerúbrowser election service)éAA  iDA  iAC  iLB  iMB  iOB  ZNBZNBSTAT)é    é!   é   ZINTERNETéÀ  z%Label String Pointer to QUESTION_NAMEzB nodezP nodezM nodezH node)r   rC   é   é   zUnique namez
Group name)r   rC   c                   @   sj   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S )Ú
NBNSHeaderzNBNS HeaderÚNAME_TRN_IDr   ÚRESPONSErC   ÚOPCODEé   ÚNM_FLAGSé   )ÚBZres1Zres0ZRAZRDZTCZAAZRCODEÚQDCOUNTÚANCOUNTZNSCOUNTÚARCOUNTN)r5   r6   r7   r8   r   r   r   r9   r2   r2   r2   r3   rG   p   s   


ñrG   c                   @   sJ   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d„ ZdS )ÚNBNSQueryRequestzNBNS query requestÚQUESTION_NAMEÚwindowsÚSUFFIXr@   ÚNULLr   ÚQUESTION_TYPErA   ÚQUESTION_CLASSrC   c                 C   s   d| j  ¡  ¡  S )NzNBNSQueryRequest who has '\\%s'©rS   ÚstripÚdecode©r/   r2   r2   r3   Ú	mysummary�   s    ÿzNBNSQueryRequest.mysummaryN)r5   r6   r7   r8   r   r   Ú_NETBIOS_SUFFIXESr   Ú_NETBIOS_QRTYPESÚ_NETBIOS_QRCLASSr9   r]   r2   r2   r2   r3   rR   ‡   s   


ürR   r   )rJ   rL   rO   c                   @   s@   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   rC   ÚOWNER_NODE_TYPErE   ÚUNUSEDé   ÚUnusedÚ
NB_ADDRESSr#   N)r5   r6   r7   r
   Ú_NETBIOS_GNAMESÚ_NETBIOS_OWNER_MODE_TYPESr   r9   r2   r2   r2   r3   ra   œ   s   ÿûra   c                   @   st   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d�edeƒ gedd„ d�gZdd„ ZdS )ÚNBNSQueryResponsezNBNS query responseÚRR_NAMErT   rU   r@   rV   r   rW   rA   rX   rC   ÚTTLià“ ÚRDLENGTHNÚ
ADDR_ENTRY)Z	length_ofc                 C   s   | j S ©N)rm   ©Úpktr2   r2   r3   Ú<lambda>±   ó    zNBNSQueryResponse.<lambda>)Zlength_fromc                 C   s(   | j s
dS d| j ¡  ¡ | j d jf S )Nrj   z!NBNSQueryResponse '\\%s' is at %sr   )rn   rk   rZ   r[   rg   r\   r2   r2   r3   r]   ´   s    
þzNBNSQueryResponse.mysummary)r5   r6   r7   r8   r   r   r^   r   r_   r`   r   r   r   ra   r9   r]   r2   r2   r2   r3   rj   ¦   s   


þùrj   éP   )rJ   rL   rI   rP   c                   @   s    e Zd ZdZdZdZdd„ ZdS )ÚNBNSNodeStatusRequestzNBNS status requests   *              rB   c                 C   s   d| j  ¡  ¡  S )Nz$NBNSNodeStatusRequest who has '\\%s'rY   r\   r2   r2   r3   r]   È   s    ÿzNBNSNodeStatusRequest.mysummaryN)r5   r6   r7   r8   rS   rW   r]   r2   r2   r2   r3   ru   Ã   s   ru   c                   @   sT   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d„ ZdS )ÚNBNSNodeStatusResponseServicez!NBNS Node Status Response ServiceZNETBIOS_NAMEzWINDOWS         é   rU   r   r:   r;   r<   r=   r>   r?   )r   rF   rA   é   é   é   Z
NAME_FLAGSrK   rd   Zunusedc                 C   s   t jS ro   )r   Zpadding_layer)r/   Úpayloadr2   r2   r3   Údefault_payload_classá   s    z3NBNSNodeStatusResponseService.default_payload_classN)	r5   r6   r7   r8   r   r   r   r9   r|   r2   r2   r2   r3   rv   Ô   s   
û÷rv   c                   @   sŽ   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d�edeƒ gedd„ d�edƒedddƒgZdd„ ZdS )ÚNBNSNodeStatusResponsezNBNS Node Status Responserk   rT   rU   r@   rV   r   ÚRR_TYPErB   ÚRR_CLASSrC   rl   rm   éS   Ú	NUM_NAMESNrN   Z	NODE_NAME)ÚfmtZcount_ofc                 C   s   | j S ro   )r�   rp   r2   r2   r3   rr   ó   rs   zNBNSNodeStatusResponse.<lambda>)Z
count_fromZMAC_ADDRESSZ
STATISTICSrs   é.   c                 C   s   t |tƒo|j| jkS ro   )Ú
isinstanceru   rS   rk   )r/   Úotherr2   r2   r3   Úanswers÷   s    

þzNBNSNodeStatusResponse.answers)r5   r6   r7   r8   r   r   r^   r   r_   r`   r   r   r   r   rv   r   r   r9   r†   r2   r2   r2   r3   r}   å   s(   


ÿý
òr}   é@   c                   @   s    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S )ÚNBNSRegistrationRequestzNBNS registration requestrS   ÚWindowsrU   r@   rV   r   rW   rA   rX   rC   rk   rD   r~   r   rl   rm   é   rb   rc   rE   rd   re   rf   rg   r#   N)r5   r6   r7   r8   r   r   r^   r   r_   r`   Ú_NETBIOS_RNAMESr   r   r
   rh   ri   r   r9   r2   r2   r2   r3   rˆ     s$   





ÿñrˆ   é   )rJ   rL   rO   rQ   c                   @   s\   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 Responserk   rT   rU   r@   rV   r   r~   rA   r   rC   rl   rE   rm   ZRDATAi)  é   N)r5   r6   r7   r8   r   r   r^   r   r_   r`   r   r   r   r9   r2   r2   r2   r3   r�      s   



ùr�   rM   c                   @   s€   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S )ÚNBTDatagramzNBT Datagram PacketÚTyperŽ   ÚFlagsrE   ZIDr   ZSourceIPr#   Z
SourcePortr%   ZLengthi  ZOffsetZ
SourceNamerT   ZSUFFIX1r@   ZNULL1ZDestinationNameZSUFFIX2ZNULL2N)r5   r6   r7   r8   r   r   r   r   r   r^   r9   r2   r2   r2   r3   r�   2  s   

ôr�   c                
   @   sH   e 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d„ ZdS )Ú
NBTSessionzNBT Session PacketZTYPEr   zSession MessagezSession RequestzPositive Session ResponsezNegative Session ResponsezRetarget Session ResponsezSession Keepalive)r   é�   é‚   éƒ   é„   é…   ZRESERVEDrM   ÚLENGTHNr   c                 C   s>   | j d u r6t|ƒd@ }|d d… t d|¡dd …  }|| S )Niÿÿ rC   z!I)r˜   r&   r-   r.   )r/   rq   r1   Úlengthr2   r2   r3   r4   P  s    
 zNBTSession.post_build)r5   r6   r7   r8   r   r   r9   r4   r2   r2   r2   r3   r’   E  s   û

ù	r’   é‰   )Údport)r$   ©r$   r›   r%   i½  é‹   )r›   r$   c                   @   s6   e Zd ZdZdZddiZddd„Zdd	„ Zd
d„ ZdS )ÚNBNS_amZ
nbns_spoofzudp port 137Ústorer   Nc                 C   s,   || _ || _t|tƒr"t|ƒ| _n|| _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
        N)Ú
ServerNameÚipr„   Ústrr   Úfrom_ip)r/   Zserver_namer£   r¡   r2   r2   r3   Úparse_optionsi  s
    
zNBNS_am.parse_optionsc                 C   sJ   | j r"t|v r"|t j| j vr"dS t|v oH| j pH|t j ¡  ¡ | jkS )NF)r£   r   r"   rR   r    rS   r[   rZ   )r/   Úreqr2   r2   r3   Ú
is_requestx  s    ÿþzNBNS_am.is_requestc                 C   sp   t |t  jd�t|j|jd� }| jp8t| j dt	j
¡ƒ}|tƒ t| jpL|j|jt|d�gd�  }|j|_|S )N)Údstrœ   Úiface)rg   )rk   rU   rn   )r   r"   r   r›   r$   r¡   r   ZoptsniffÚgetr   r¨   rG   rj   r    rS   rU   ra   rH   )r/   r¥   ÚrespÚaddressr2   r2   r3   Ú
make_reply�  s     ÿ

ý
zNBNS_am.make_reply)NNN)	r5   r6   r7   Zfunction_nameÚfilterZsniff_optionsr¤   r¦   r¬   r2   r2   r2   r3   rž   d  s   
	rž   )8Ú__doc__r-   Z
scapy.archr   Zscapy.base_classesr   Zscapy.ansmachiner   Zscapy.configr   Zscapy.packetr   r   r   r	   Zscapy.fieldsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.layers.inetr   r   r   Zscapy.layers.l2r   r   r^   r_   r`   r‹   ri   rh   rG   rR   ra   rj   ru   rv   r}   rˆ   r�   r�   r’   rž   r2   r2   r2   r3   Ú<module>   sŒ   D&ú
þÿÿüþÿ
ÿÿÿÿ