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€„ d€euƒ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 )ÚNetBIOSTimeoutú6The 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r“t
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