o
    jQ                     @   s  d dl mZ d dl m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mZmZ d dlmZmZmZ d dlmZ ze
 ZW n eyW   e
ZY nw 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Z(dZ)dZ*dZ+d Z,dZ-dZ.dZ/dZ0d Z1dZ2dZ3d Z4dZ5dZ6d Z7d!Z8dZ9dZ:dZ;dZ<d"Z=d#Z>dZ?dZ@dZAdZBd"ZCd$ZDd%ZEd&ZFd'ZGd ZHd!ZId(ZJd)ZKd ZLdZMdZNdZOe"d*e#d+e$d,e%d-e&d.e'd/e(d0e)d1e*d2e+d3i
ZPd ZQd4ZRd5ZSd6ZTd7ZUd8ZVd9d: ZWd;d< ZXd=d> ZYd?d@ ZZd Z[dAZ\dBZ]dCdDdEdFdGdHdIdJZ^dKdLdMdNdOdPZ_G dQdR dRe`ZaG dSdT dTe`ZbG dUdV dVeZcG dWdX dXecZdG dYdZ dZecZeG d[d\ d\eZfG d]d^ d^eZgG d_d` d`eZhG dadb dbefZiG dcdd ddeiZjG dedf dfeiZkG dgdh dheiZlG didj djeiZmG dkdl dlefZnG dmdn dneZoG dodp dpenZpG dqdr dreZqG dsdt dteZrG dudv dvZsG dwdx dxZtG dydz dzZuG d{d| d|eZvG d}d~ d~euZwG dd deuZxdS )    )division)print_function)absolute_importN)packunpack)byte2int
indexbytesb)	Structure0.0.0.0z<broadcast>      i      i @  i `  i                            !   i (  i 0  i 8           i   i      
               i   i   UnknownWorkstationClientServerzDomain MasterzDomain ControllerzMaster BrowserzBrowser ServerzNetDDE ServerStatus               c                 C   s   | dkr	| d7 } nt | dkr| dd t| } n	| dt| } tt | d tdt|  }zt|tr=|d}W n	 t	yG   Y nw |rfd}|
dD ]}|tt | | }qQt|| d	 S t|d	 S )
a  
    Perform first and second level encoding of name as specified in RFC 1001 (Section 4)
    
    :param string name: the name to encode
    :param integer nametype: the name type constants
    :param string scope: the name's scope 
    
    :return string/bytes: the encoded name.
    *z                  Nr   .utf-8     )lenchrljustresub_do_first_level_encoding
isinstanceunicodeencode	NameErrorsplitr	   )namenametypescopeencoded_nameencoded_scopes rB   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/nmb.pyencode_name   s&   


rD   c                 C   s*   t | d}tj|d?  tj|d@   S )Nr   r   r,   )ordgroupstringascii_uppercasemrA   rB   rB   rC   r6      s   r6   c                 C   s   t | dd }|dksJ tdt| dd d}| dd dkr)d|d	fS d	}d}	 t| ||d  }|dkr=nd
| |||  d }||7 }q.|d ||fS )z
    Perform first and second level decoding of name as specified in RFC 1001 (Section 4)

    :param string/bytes name: the name to decode

    :return string: the decoded name.
    r   r   r   z..r   r.   "   r0   r/   r-   )rE   r4   r5   _do_first_level_decodingdecoder   )r<   name_lengthdecoded_namedecoded_domainoffsetdomain_lengthrB   rB   rC   decode_name   s   

rS   c                 C   s:   |  d}tt|d td d> t|d td B S )Nr   Ar   r   )rF   r2   rE   rI   rB   rB   rC   rL      s   
0rL         z-Format Error. Request was invalidly formattedz7Server failure. Problem with NBNS, cannot process name.zName does not existznUnsupported request error.  Allowable only for challenging NBNS when gets an Update type registration request.zURefused error.  For policy reasons server will not register this name from this host.z-Active error.  Name is owned by another node.zFName in conflict error.  A UNIQUE name is owned by more than one node.)r   r   r   r   r   r   r    zNot listening on called namezNot listening for calling namezCalled name not presentzSufficient resourceszUnspecified error)r   r&   r'   r(      c                   @   s>   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd ZdS )NetBIOSErrorr/   Nc                 C   s   || _ || _|| _d S N)error_class
error_code	error_msg)selferror_messagerZ   r[   rB   rB   rC   __init__  s   
zNetBIOSError.__init__c                 C      | j S rY   )errorr]   rB   rB   rC   get_error_code     zNetBIOSError.get_error_codec                 C   s   |   S rY   )rc   rb   rB   rB   rC   getErrorCode
     zNetBIOSError.getErrorCodec                 C      t | S rY   strrb   rB   rB   rC   get_error_string  rf   zNetBIOSError.get_error_stringc                 C   rg   rY   rh   rb   rB   rB   rC   getErrorString  rf   zNetBIOSError.getErrorStringc                 C   sh   | j d ur/| j tv rd| jt| j  | j f S | j tv r'd| jt| j  | j f S d| j| j f S d| j S )Nz	%s-%s(%s)z%s(%s)z%s)r[   QUERY_ERRORSr\   SESSION_ERRORSrb   rB   rB   rC   __str__  s   



zNetBIOSError.__str__)r/   NN)	__name__
__module____qualname__r_   rc   re   rj   rk   rn   rB   rB   rB   rC   rX     s    
rX   c                   @      e Zd ZdddZdS )NetBIOSTimeout6The NETBIOS connection with the remote host timed out.c                 C      t | | d S rY   )	Exceptionr_   )r]   messagerB   rB   rC   r_        zNetBIOSTimeout.__init__N)rt   ro   rp   rq   r_   rB   rB   rB   rC   rs         rs   c                   @      e Zd ZdZdS )NBNSResourceRecord)RR_NAMEzz= RR_TYPE>H=0RR_CLASSr   TTLz>L=0)RDLENGTHz>H-RDATA)RDATAz:=""Nro   rp   rq   	structurerB   rB   rB   rC   r|   %      r|   c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )NBNodeStatusResponser   c                 C   s   t | | d| _td| d d d d | _t | _| d dd  }t| jD ]}t|}|t	|d  }| j
| q(t|| _| | jd  d S )N   00-00-00-00-00-00Br   r   r   UNIT_ID)r|   r_   macr   	num_nameslistentriesrangeNODE_NAME_ENTRYr1   append
STATISTICS
statisticsset_mac_in_hexa)r]   data_entryrB   rB   rC   r_   0  s   
zNBNodeStatusResponse.__init__c                 C   s>   d}t |D ]}|dkrd| }q|d| 7 }q| | _d S )Nr/   z%02xz-%02x)	bytearrayupperr   )r]   r   data_auxdrB   rB   rC   r   =  s   
z$NBNodeStatusResponse.set_mac_in_hexac                 C   r`   rY   r   rb   rB   rB   rC   get_macF  rd   zNBNodeStatusResponse.get_macc                 C   sB   t d| j}td| jD ]}|| j|  7 }q|| j 7 }d S )Nz!Br   )r   r   r   r   getDatar   )r]   resirB   rB   rC   rawDataI  s   zNBNodeStatusResponse.rawDataNr   )ro   rp   rq   r_   r   r   r   rB   rB   rB   rC   r   /  s
    
	r   c                   @   rr   )NBPositiveNameQueryResponser   c                 C   sh   t | | g | _| d }t|dkr2t|}|t|d  }| jt|d  t|dksd S d S )Nr   r   
NB_ADDRESS)r|   r_   r   r1   
ADDR_ENTRYr   socket	inet_ntoa)r]   r   rdatar   rB   rB   rC   r_   P  s   z$NBPositiveNameQueryResponse.__init__Nr   ry   rB   rB   rB   rC   r   O  rz   r   c                   @   s   e Zd ZdZdZdS )NAME_SERVICE_PACKET))NAME_TRN_IDr   )FLAGSr   )QDCOUNTr   )ANCOUNTr   )NSCOUNTr   )ARCOUNTr   ))ANSWERS:N)ro   rp   rq   	commonHdrr   rB   rB   rB   rC   r   Z  s    r   c                   @   r{   )QUESTION_ENTRY))QUESTION_NAMEzQUESTION_TYPEr   QUESTION_CLASSr   N)ro   rp   rq   r   rB   rB   rB   rC   r   h  r   r   c                   @   r{   )RESOURCE_RECORDr}   Nr   rB   rB   rB   rC   r   p  r   r   c                   @      e Zd ZdZdddZdS )NAME_REGISTRATION_REQUEST)
r   r   r   r   )r~   r   r   r   r   )r   z>H=6NB_FLAGSr   r   z4s=b""Nc                 C   s`   t | | ttB tB | d< d| d< d| d< d| d< d| d< t| d< t| d	< t| d
< t| d< d S )Nr   r   r   r   r   r   r   r   r   r   r   )	r   r_   OPCODE_REQUESTNM_FLAGS_RDOPCODE_REGISTRATIONQUESTION_TYPE_NBQUESTION_CLASS_IN
RR_TYPE_NBRR_CLASS_INr]   r   rB   rB   rC   r_     s   z"NAME_REGISTRATION_REQUEST.__init__rY   ro   rp   rq   r   r_   rB   rB   rB   rC   r   {  s    r   c                   @      e Zd ZdddZdS )NAME_OVERWRITE_REQUESTNc                 C   s<   t | | ttB | d< d| d< d| d< d| d< d| d< d S )Nr   r   r   r   r   r   r   )r   r_   r   r   r   rB   rB   rC   r_        zNAME_OVERWRITE_REQUEST.__init__rY   ry   rB   rB   rB   rC   r     rz   r   c                   @   r   )NAME_REFRESH_REQUESTNc                 C   s<   t | | tdB | d< d| d< d| d< d| d< d| d< d S )Nr   r   r   r   r   r   r   )r   r_   OPCODE_REFRESHr   rB   rB   rC   r_     r   zNAME_REFRESH_REQUEST.__init__rY   ry   rB   rB   rB   rC   r     rz   r   c                   @   r   )NAME_REGISTRATION_RESPONSENc                 C   ru   rY   r   r_   r   rB   rB   rC   r_     rx   z#NAME_REGISTRATION_RESPONSE.__init__rY   ry   rB   rB   rB   rC   r     rz   r   c                   @   r   )NAME_CONFLICT_DEMANDNc                 C   ru   rY   r   r   rB   rB   rC   r_     rx   zNAME_CONFLICT_DEMAND.__init__rY   ry   rB   rB   rB   rC   r     rz   r   c                   @   r   )NAME_QUERY_REQUEST)r   r   r   Nc                 C   sX   t | | ttB tB | d< d| d< d| d< d| d< d| d< d| d< t| d	< t| d
< d S )Nr   r   RCODEr   r   r   r   r   r   r   )r   r_   r   r   r   r   r   r   rB   rB   rC   r_     s   zNAME_QUERY_REQUEST.__init__rY   r   rB   rB   rB   rC   r     s    r   c                   @   r{   )r   )r   r   Nr   rB   rB   rB   rC   r     r   r   c                   @   r   )NODE_STATUS_REQUESTNc                 C   s    t | | d| d< t| d< d S )Nr   r   r   )r   r_   QUESTION_TYPE_NBSTATr   rB   rB   rC   r_     s   zNODE_STATUS_REQUEST.__init__rY   ry   rB   rB   rB   rC   r     rz   r   c                   @   r{   )r   ))NAMEz15s=b"")TYPEzB=0)
NAME_FLAGS>HNr   rB   rB   rB   rC   r     r   r   c                   @   r{   )r   ))r   z6s=b"")JUMPERSr   )TEST_RESULTr   )VERSION_NUMBERr   )PERIOD_OF_STATISTICSr   )NUMBER_OF_CRCsr   )NUMBER_ALIGNMENT_ERRORSr   )NUMBER_OF_COLLISIONSr   )NUMBER_SEND_ABORTSr   )NUMBER_GOOD_SENDS>L)NUMBER_GOOD_RECEIVESr   )NUMBER_RETRANSMITSr   )NUMBER_NO_RESOURCE_CONDITIONSr   )NUMBER_FREE_COMMAND_BLOCKSr   )TOTAL_NUMBER_COMMAND_BLOCKSr   )MAX_TOTAL_NUMBER_COMMAND_BLOCKSr   )NUMBER_PENDING_SESSIONSr   )MAX_NUMBER_PENDING_SESSIONSr   )MAX_TOTAL_SESSIONS_POSSIBLEr   )SESSION_DATA_PACKET_SIZEr   Nr   rB   rB   rB   rC   r     r   r   c                   @   s   e Zd ZefddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
eddfddZdeddfddZdd Zdd Zd!ddZdeddfddZdd  ZdS )"NetBIOSc                 C   s   || _ d | _t| _d| _d S )Nr   )_NetBIOS__servport_NetBIOS__nameserverBROADCAST_ADDR_NetBIOS__broadcastaddrr   )r]   servportrB   rB   rC   r_     s   
zNetBIOS.__init__c              	   C   s   t dd}t||tjtjd \}}}}}t|||}d}	tddD ]$}
z|tt ddf |	tj
tjd d}	W q% tjyI   Y q%w |	sStdttj|| _d S )Ni'  i`  r   r   r   zCannot bind to a good UDP port)randrandintr   getaddrinfoAF_INET
SOCK_DGRAMr   bind
INADDR_ANY
setsockopt
SOL_SOCKETSO_BROADCASTra   rX   ERRCLASS_OSerrnoEAGAIN_NetBIOS__sock)r]   dstaddrportafsocktypeproto
_canonname_sarA   has_bind_irB   rB   rC   _setup_connection  s   "
zNetBIOS._setup_connectionc              
   C   sf  |  | d}	 zo| j| d|| jf t| j gg g |\}}}|s0|r.|d8 }nHtz| jdd\}}W n t	yO } zt
dt| d }~ww | j  t|}	|	d |d krv|	d d@ dkrst
d	t|	d d@ |	W S W n: tjy }
 z|
jtjkr|
jtjkrt
d
t|
jW Y d }
~
nd }
~
w tjy }
 zt
dt|
 d }
~
ww q)Nr   r   r      zrecvfrom error: %sr   r   r,   zNegative responsez'Error occurs while waiting for responsezConnection error: %s)r  r  sendtor   r   selectfilenors   recvfromrv   rX   ri   closer   ERRCLASS_QUERYra   r  EINTRr  r  r   )r]   requestdestaddrtimeouttriesreadyr   r   er   exrB   rB   rC   send  s@   


zNetBIOS.sendc                 C   
   || _ d S rY   r   )r]   
nameserverrB   rB   rC   set_nameserver9     
zNetBIOS.set_nameserverc                 C   r`   rY   r!  rb   rB   rB   rC   get_nameserver=  rd   zNetBIOS.get_nameserverc                 C   r   rY   r   )r]   broadcastaddrrB   rB   rC   set_broadcastaddrA  r$  zNetBIOS.set_broadcastaddrc                 C   r`   rY   r&  rb   rB   rB   rC   get_broadcastaddrE  rd   zNetBIOS.get_broadcastaddrNr   c                 C   s   |  || j|||}|S rY   )name_query_requestr   )r]   nbnameqtyper>   r  resprB   rB   rC   gethostbynameK  s   zNetBIOS.gethostbynamec                 C   s*   |r|  |||||S |  || j|||S rY   )node_status_requestr   )r]   r+  r  typer>   r  rB   rB   rC   getnodestatusS  s   zNetBIOS.getnodestatusc                 C   s0   |  d|}dd |D }|d d  dS )Nr+   c                 S   s   g | ]
}|d  t kr|qS )r   )TYPE_SERVER.0xrB   rB   rC   
<listcomp>[  s    z*NetBIOS.getnetbiosname.<locals>.<listcomp>r   r   zlatin-1)r1  striprM   )r]   ipr   rB   rB   rC   getnetbiosnameY  s   zNetBIOS.getnetbiosnamec                 C   r`   rY   r   rb   rB   rB   rC   getmacaddress^  rd   zNetBIOS.getmacaddressr   r   c                 C   s   |  }t|||}t }	tdd|	d< |d d d |	d< |d d d |	d< d|	d	< ||	d
< t||	d< |sE|	d  tO  < | j}| 	|	|d}
|
S )Nr    }  r   r0   r   r~     r   r   r   r   )
r   rD   r   r   r   r   	inet_atonNM_FLAGS_BROADCASTr   r  )r]   r+  r  r,  r>   nb_flags
nb_addressnetbios_nameqn_labelpr   rB   rB   rC   name_registration_requesta  s   z!NetBIOS.name_registration_requestc           
      C   sz   |  }t|||}t }tdd|d< |d d d |d< t|d< |s0|d  tO  < | j}| |||}	t	|	d S 	Nr   r;  r   r<  r0   r   r   r   )
r   rD   r   r   r   r   r?  r   r  r   )
r]   r+  r  r,  r>   r  rB  rC  rD  r   rB   rB   rC   r*  s  s   zNetBIOS.name_query_requestc                 C   sz   |  }t|||}t }tdd|d< |d d d |d< |s(t|d< | j}| |||}	t|	d }
|
	 | _
|
jS rF  )r   rD   r   r   r   r?  r   r  r   r   r   r   )r]   r+  r  r0  r>   r  rB  rC  rD  r   answrB   rB   rC   r/    s   
zNetBIOS.node_status_request)r   r   )ro   rp   rq   NETBIOS_NS_PORTr_   r  r  r#  r%  r(  r)  TYPE_WORKSTATIONr.  r1  r9  r:  rE  r2  r*  r/  rB   rB   rB   rC   r     s     
r   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )NetBIOSSessionPacketr   c                 C   s   d| _ d| _d| _|dkrd| _d S z:t|d| _ | j tkr2t|dd> td|dd d B | _n|d | _td|dd d | _|dd  | _W d S    td)	Nr       r   r   z!Hr   r   zWrong packet format )r0  flagslength_trailerr   NETBIOS_SESSION_MESSAGEr   rX   r   rB   rB   rC   r_     s   

(
zNetBIOSSessionPacket.__init__c                 C   r   rY   r0  )r]   r0  rB   rB   rC   set_type  r$  zNetBIOSSessionPacket.set_typec                 C   r`   rY   rP  rb   rB   rB   rC   get_type  rd   zNetBIOSSessionPacket.get_typec                 C   sN   | j tkrtd| j | jd? | jd@ | j }|S td| j | j| j| j }|S )Nz!BBHr   r=  )r0  rO  r   rM  rN  rL  r   rB   rB   rC   r     s
   
"zNetBIOSSessionPacket.rawDatac                 C   s   || _ t|| _d S rY   )rN  r1   rM  r   rB   rB   rC   set_trailer  s   z NetBIOSSessionPacket.set_trailerc                 C   r`   rY   )rM  rb   rB   rB   rC   
get_length  rd   zNetBIOSSessionPacket.get_lengthc                 C   r`   rY   )rN  rb   rB   rB   rC   get_trailer  rd   z NetBIOSSessionPacket.get_trailerNr   )
ro   rp   rq   r_   rQ  rR  r   rS  rT  rU  rB   rB   rB   rC   rJ    s    
rJ  c                   @   sj   e Zd ZeededfddZdd ZdddZdd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd ZdS )NetBIOSSessionNc	                 C   s   t |dkr|dd  | _n| | _|| _|sJ |dkr&|tkr&|}|dkrAt }	z|	|}
W n   d}
Y |
durA|
}t |dkrQ|dd  | _n| | _|| _|| _	|durd|| _
n	| ||f|| _
|tkrz| ||| dS dS )a  

        :param unicode myname: My local NetBIOS name
        :param unicode remote_name: Remote NetBIOS name
        :param unicode remote_host: Remote IP Address
        :param integer remote_type: NetBIOS Host type
        :param integer sess_port: Session port to connect (139,445)
        :param integer timeout: Timeout for connection
        :param integer local_type: My Local Host Type
        :param socket sock: Socket for already established connection
        r,   Nz
*SMBSERVER)r1   r   _NetBIOSSession__myname_NetBIOSSession__local_typeSMB_SESSION_PORTr   r9  _NetBIOSSession__remote_name_NetBIOSSession__remote_type_NetBIOSSession__remote_host_sockr  NETBIOS_SESSION_PORT_request_session)r]   mynameremote_nameremote_hostremote_type	sess_portr  
local_typesocknbr   rB   rB   rC   r_     s6   

zNetBIOSSession.__init__c                 C      t dNzNot Implemented!NotImplementedErrorr]   rc  re  r  rB   rB   rC   r_    rf   zNetBIOSSession._request_sessionc                 C   rh  ri  rj  )r]   peerr  rB   rB   rC   r    rf   z NetBIOSSession._setup_connectionc                 C   r`   rY   )rW  rb   rB   rB   rC   
get_myname  rd   zNetBIOSSession.get_mynamec                 C   r`   rY   )rX  rb   rB   rB   rC   
get_mytype  rd   zNetBIOSSession.get_mytypec                 C   r`   rY   )r\  rb   rB   rB   rC   get_remote_host  rd   zNetBIOSSession.get_remote_hostc                 C   r`   rY   )rZ  rb   rB   rB   rC   get_remote_name  rd   zNetBIOSSession.get_remote_namec                 C   r`   rY   )r[  rb   rB   rB   rC   get_remote_type  rd   zNetBIOSSession.get_remote_typec                 C   s   | j   d S rY   )r]  r  rb   rB   rB   rC   r    s   zNetBIOSSession.closec                 C   r`   rY   )r]  rb   rB   rB   rC   
get_socket  rd   zNetBIOSSession.get_socketrY   )ro   rp   rq   r2  r^  rI  r_   r_  r  rn  ro  rp  rq  rr  r  rs  rB   rB   rB   rC   rV    s    
6
rV  c                   @   s4   e Zd ZdZdZdZdZdZdZdd Z	d	d
 Z
dS )NetBIOSUDPSessionPacketr      r   r   r   ))TypezB=16)FlagszB=2)IDz<H)	_SourceIPr   )SourceIP")
SourcePortz>H=138)	DataLegthz>H-Data)Offsetr   )
SourceNamer   )DestinationNamer   )Datar   c                 C   sZ   | d  d}dd |D }|d d> |d  d> |d  d> |d	  }|| d
< t| S )Nrz  r-   c                 S   s   g | ]}t |qS rB   )intr3  rB   rB   rC   r6  ,  s    z3NetBIOSUDPSessionPacket.getData.<locals>.<listcomp>r      r   r   r   ry  )r;   r
   r   )r]   addrrB   rB   rC   r   *  s
   ,
zNetBIOSUDPSessionPacket.getDatac                 C   s   | d S )Nr  rB   rb   rB   rB   rC   rU  1  rf   z#NetBIOSUDPSessionPacket.get_trailerN)ro   rp   rq   TYPE_DIRECT_UNIQUETYPE_DIRECT_GROUPFLAGS_MORE_FRAGMENTSFLAGS_FIRST_FRAGMENTFLAGS_B_NODEr   r   rU  rB   rB   rB   rC   rt    s    rt  c                   @   s:   e Zd ZdddZdddZdd Zdd	 Zdd
dZdS )NetBIOSUDPSessionNc           	      C   sx   t |d |d dt jd \}}}}}t  |||}|| t  |||}|t jt jd |tdf || _	|S )Nr   r      )
r   r   r   connectr   r   SO_REUSEADDRr   r   rm  )	r]   rm  r  r  r	  r
  	canonnamesarf  rB   rB   rC   r  5  s   (
z#NetBIOSUDPSession._setup_connectionc                 C   s   d S rY   rB   rl  rB   rB   rC   r_  @  s   z"NetBIOSUDPSession._request_sessionc                 C   s8   t | dr	| j}n
tdd| _| j}|  jd7  _|S )N
__dgram_idr   r=  )hasattr_NetBIOSUDPSession__dgram_idr   r   )r]   answerrB   rB   rC   next_idC  s   
zNetBIOSUDPSession.next_idc                 C   s   | j | j t }|  |d< | j  d |d< t|  |  dd d |d< t| 	 | 
 dd d |d< ||d< | j t|| j | j   | | j| _ d S )	Nrx  r   rz  r/   r<  r  r  r  )r]  r  rm  rt  r  getsocknamerD   rn  ro  rq  rr  r  ri   r  r  r]   r   rD  rB   rB   rC   send_packetL  s     
zNetBIOSUDPSession.send_packetc                 C   s(   	 | j d\}}|| jkr	 t|S q)Nr   r   )r]  r  rm  rt  )r]   r  r   rm  rB   rB   rC   recv_packet\  s   
zNetBIOSUDPSession.recv_packetrY   )ro   rp   rq   r  r_  r  r  r  rB   rB   rB   rC   r  4  s    

	r  c                   @   sb   e Zd ZeededdfddZdddZdd Zdd	d
Z	dddZ
dd Zdd ZdddZdS )NetBIOSTCPSessionNFc
           
      C   s>   |	| _ | j r| j| _n| j| _tj| ||||||||d	 dS )a   
        
        :param unicode myname: My local NetBIOS name
        :param unicode remote_name: Remote NetBIOS name
        :param unicode remote_host: Remote IP Address
        :param integer remote_type: NetBIOS Host type
        :param integer sess_port: Session port to connect (139,445)
        :param integer timeout: Timeout for connection
        :param integer local_type: My Local Host Type
        :param socket sock: Socket for already established connection
        :param boolean select_poll: Type of polling mechanism
        )rc  rd  r  re  rf  N)_NetBIOSTCPSession__select_pollpolling_readread_functionnon_polling_readrV  r_   )
r]   r`  ra  rb  rc  rd  r  re  rf  select_pollrB   rB   rC   r_   m  s   

zNetBIOSTCPSession.__init__c              
   C   s   z1t |d |d dt jd \}}}}}t  |||}| }	|| || ||	 W |S  t jyL }
 zt d|d |d f |
d }
~
ww )Nr   r   zConnection error (%s:%s))r   r   SOCK_STREAM
gettimeout
settimeoutr  ra   )r]   rm  r  r  r	  r
  r  r  rf  
oldtimeoutr  rB   rB   rC   r    s   (

z#NetBIOSTCPSession._setup_connectionc                 C   s.   t  }|t || | j|  d S rY   )rJ  rQ  rO  rS  r]  sendallr   r  rB   rB   rC   r    s   

zNetBIOSTCPSession.send_packetc                 C   s0   |  |}t|}| tkr| |S t|S rY   )_NetBIOSTCPSession__readrJ  rR  NETBIOS_SESSION_KEEP_ALIVEr  )r]   r  r   	NBSPacketrB   rB   rC   r    s
   

zNetBIOSTCPSession.recv_packetc                 C   s   t  }t|  |d}t|  |d}|t |||  | j|	  	 | 
|}| tkr;td|   | tkrCd S 	 q()Nr/   r   z'Cannot request session (Called Name:%s))rJ  rD   rq  rn  rQ  NETBIOS_SESSION_REQUESTrS  r]  r  r   r  rR  !NETBIOS_SESSION_NEGATIVE_RESPONSErX   !NETBIOS_SESSION_POSITIVE_RESPONSE)r]   rc  re  r  rD  ra  r`  rB   rB   rC   r_    s   

z"NetBIOSTCPSession._request_sessionc              
   C   s  d}|d u rd}|}d}|}|dkr}z@t  | j gg g d\}}}|s5|dkr*tt| ||8 }W q| j|}	t|	dkrGtdt	d ||	 }|t| }W n& t j
yx }
 z|
jtjkrn|
jtjkrntdt	|
jW Y d }
~
nd }
~
ww |dkst|S )NrK    g?r   Error while reading from remote&Error occurs while reading from remote)r  r]  r  rs   timesleeprecvr1   rX   r  ra   r  r  r  bytes)r]   read_lengthr  r   	time_left
CHUNK_TIME
bytes_leftr  r   receivedr  rB   rB   rC   r    s6   
zNetBIOSTCPSession.polling_readc              
   C   s   d}|d u rd}t   }|}|dkra| j| z| j|}W n tjy*   t ty< } ztdt	|j
d }~ww t   | |krGtt|dkrStdt	d || }|t| }|dkst|S )NrK  r  r   r  r  )r  r]  r  r  r   r  rs   rv   rX   r  r  r1   r  )r]   r  r  r   
start_timer  r  r  rB   rB   rC   r    s.   z"NetBIOSTCPSession.non_polling_readc                 C   sb   |  d|}td|\}}}t|tkr|t|d> O }n
t|d@ r'|dO }|  ||}|| S )Nr   z>ccHr   r   r  )r  r   rE   rO  )r]   r  r   r0  rL  rM  data2rB   rB   rC   __read  s   zNetBIOSTCPSession.__readrY   )ro   rp   rq   r2  r^  rI  r_   r  r  r  r_  r  r  r  rB   rB   rB   rC   r  l  s    



!r  )y
__future__r   r   r   r  r4   r  r   rG   r  randomstructr   r   sixr   r   r	   impacket.structurer
   SystemRandomr   rk  r   r   rH  r^  rY  NODE_BNODE_PNODE_MNODE_RESERVED
NODE_GROUPNODE_UNIQUETYPE_UNKNOWNrI  TYPE_CLIENTr2  TYPE_DOMAIN_MASTERTYPE_DOMAIN_CONTROLLERTYPE_MASTER_BROWSERTYPE_BROWSERTYPE_NETDDETYPE_STATUSOPCODE_QUERYr   OPCODE_RELEASEOPCODE_WACKr   r   OPCODE_RESPONSEr?  NM_FLAGS_UNICASTNM_FLAGS_RAr   NM_FLAGS_TCNM_FLAGS_AAr   r   r   	RR_TYPE_A
RR_TYPE_NSRR_TYPE_NULLr   RR_TYPE_NBSTATr   RCODE_FMT_ERRRCODE_SRV_ERRRCODE_IMP_ERRRCODE_RFS_ERRRCODE_ACT_ERRRCODE_CFT_ERRNAME_FLAGS_PRMNAME_FLAGS_ACTNAME_FLAG_CNFNAME_FLAG_DRGNB_FLAGS_ONT_BNB_FLAGS_ONT_PNB_FLAGS_ONT_M
NB_FLAGS_G
NAME_TYPESrO  r  r  r  !NETBIOS_SESSION_RETARGET_RESPONSEr  rD   r6   rS   rL   r  ERRCLASS_SESSIONr  rl   rm   rv   rX   rs   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ  rV  rt  r  r  rB   rB   rB   rC   <module>   s
  $	#

 
	
 +R 8