o
    àý°j8R  ã                   @   sB  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z
d dlmZm	Z	 W n e
y7   d dlmZm	Z	 Y nw d dlmZ d dlmZmZmZ d dlmZmZmZmZ d dlmZ G d	d
„ d
ƒZddddi fdd„Zdd„ ZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ deƒZ dS )é    )Údivision)Úprint_functionN)ÚurlparseÚ
urlunparse)Úntlm)ÚDCERPCExceptionÚ	DCERPC_v5Ú	DCERPC_v4)ÚRPCProxyClientÚRPCProxyClientExceptionÚRPC_OVER_HTTP_v1ÚRPC_OVER_HTTP_v2)ÚSMBConnectionc                   @   sn   e Zd Ze d¡Z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d„ Zdd„ Zdd„ ZdS )ÚDCERPCStringBindingzf(?:([a-fA-F0-9-]{8}(?:-[a-fA-F0-9-]{4}){3}-[a-fA-F0-9-]{12})@)?([_a-zA-Z0-9]*):([^\[]*)(?:\[([^]]*)])?c                 C   sÚ   t j |¡}| d¡| _| d¡| _| d¡| _| d¡}|re| d¡}|d | _z| j 	d¡ | jt
dƒd … | _W n   Y i | _|dd … D ]}| dd¡}t
|ƒdkr[|d nd	| j|d < qId S d	| _i | _d S )
Né   é   é   é   ú,r   z	endpoint=ú=Ú )r   ÚparserÚmatchÚgroupÚ_DCERPCStringBinding__uuidÚ_DCERPCStringBinding__psÚ_DCERPCStringBinding__naÚsplitÚ_DCERPCStringBinding__endpointÚindexÚlenÚ_DCERPCStringBinding__options)ÚselfÚstringbindingr   ÚoptionsÚoptionÚvv© r'   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dcerpc/v5/transport.pyÚ__init__*   s(   


$þ
zDCERPCStringBinding.__init__c                 C   ó   | j S ©N)r   ©r"   r'   r'   r(   Úget_uuidB   ó   zDCERPCStringBinding.get_uuidc                 C   r*   r+   )r   r,   r'   r'   r(   Úget_protocol_sequenceE   r.   z)DCERPCStringBinding.get_protocol_sequencec                 C   r*   r+   ©r   r,   r'   r'   r(   Úget_network_addressH   r.   z'DCERPCStringBinding.get_network_addressc                 C   ó
   || _ d S r+   r0   ©r"   Úaddrr'   r'   r(   Úset_network_addressK   ó   
z'DCERPCStringBinding.set_network_addressc                 C   r*   r+   )r   r,   r'   r'   r(   Úget_endpointN   r.   z DCERPCStringBinding.get_endpointc                 C   r*   r+   ©r!   r,   r'   r'   r(   Úget_optionsQ   r.   zDCERPCStringBinding.get_optionsc                 C   s
   | j | S r+   r8   ©r"   Úoption_namer'   r'   r(   Ú
get_optionT   r6   zDCERPCStringBinding.get_optionc                 C   s
   || j v S r+   r8   r:   r'   r'   r(   Úis_option_setW   r6   z!DCERPCStringBinding.is_option_setc                 C   s   | j |= d S r+   r8   r:   r'   r'   r(   Úunset_optionZ   ó   z DCERPCStringBinding.unset_optionc                 C   s   t | j| j| j| j| jƒS r+   )ÚDCERPCStringBindingComposer   r   r   r   r!   r,   r'   r'   r(   Ú__str__]   s   zDCERPCStringBinding.__str__N)Ú__name__Ú
__module__Ú__qualname__ÚreÚcompiler   r)   r-   r/   r1   r5   r7   r9   r<   r=   r>   rA   r'   r'   r'   r(   r   $   s    
r   r   c                 C   sp   d}| r
|| d 7 }||d 7 }|r||7 }|s|r6|d| 7 }|r2|dd  dd„ | ¡ D ƒ¡ 7 }|d7 }|S )	Nr   ú@ú:ú[r   c                 S   s2   g | ]\}}t |ƒd kr|nd |t |ƒg¡‘qS )r   r   )ÚstrÚjoin)Ú.0ÚkeyÚvalr'   r'   r(   Ú
<listcomp>k   s   2 z.DCERPCStringBindingCompose.<locals>.<listcomp>ú])rK   Úitems)ÚuuidÚprotocol_sequenceÚnetwork_addressÚendpointr$   Úsr'   r'   r(   r@   a   s    r@   c                 C   s  t | ƒ}| ¡ }| ¡ }d|kr#| ¡ }|rt|t|ƒƒ}nct|ƒ}n^d|kr:| ¡ }|r5t|t|ƒƒ}nLt|ƒ}nGd|krQ| ¡ }|rLt|t|ƒƒ}n5t|ƒ}n0d|kro| ¡ }|rj|tdƒd … }t	||d�}nt	|ƒ}nd|kr}| ¡ }t
|d�}ntdƒ‚| |¡ |S )	NÚncadg_ip_udpÚncacn_ip_tcpÚ
ncacn_httpÚncacn_npz\pipe)ÚfilenameÚncalocalzUnknown protocol sequence.)r   r1   r/   r7   ÚUDPTransportÚintÚTCPTransportÚHTTPTransportr    ÚSMBTransportÚLOCALTransportr   Úset_stringbinding)r#   ÚsbÚnaÚpsÚportÚrpctransportÚ
named_piper'   r'   r(   ÚDCERPCTransportFactoryq   s<   




rj   c                   @   sø   e Zd ZeZdd„ Zdd„ Zd<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d„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd>d'd(„Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd?d6d7„Zd8d9„ Zd:d;„ Z d&S )@ÚDCERPCTransportc                 C   sŽ   || _ || _|| _d | _d | _d | _d| _d| _d| _d | _	d| _
d| _d| _d| _d | _d | _d | _d | _|  dd¡ d| _d| _d| _d S )Nr   FT)Ú_DCERPCTransport__remoteNameÚ_DCERPCTransport__remoteHostÚ_DCERPCTransport__dstportÚ_stringbindingÚ_max_send_fragÚ_max_recv_fragÚ_domainÚ_lmhashÚ_nthashÚ!_DCERPCTransport__connect_timeoutÚ_doKerberosÚ	_usernameÚ	_passwordÚ_aesKeyÚ_TGTÚ_TGSÚ_kdcHostÚset_credentialsÚ_strict_hostname_validationÚ_validation_allow_absentÚ_accepted_hostname©r"   Ú
remoteNameÚdstportr'   r'   r(   r)   œ   s,   
zDCERPCTransport.__init__c                 C   ó   t dƒ‚©Nzvirtual function©ÚRuntimeErrorr,   r'   r'   r(   Úconnect¶   ó   zDCERPCTransport.connectr   c                 C   r„   r…   r†   ©r"   ÚdataÚforceWriteAndxÚ	forceRecvr'   r'   r(   Úsend¸   r‰   zDCERPCTransport.sendc                 C   r„   r…   r†   ©r"   r�   Úcountr'   r'   r(   Úrecvº   r‰   zDCERPCTransport.recvc                 C   r„   r…   r†   r,   r'   r'   r(   Ú
disconnect¼   r‰   zDCERPCTransport.disconnectc                 C   r„   r…   r†   r,   r'   r'   r(   Ú
get_socket¾   r‰   zDCERPCTransport.get_socketc                 C   r*   r+   ©ru   r,   r'   r'   r(   Úget_connect_timeoutÁ   r.   z#DCERPCTransport.get_connect_timeoutc                 C   r2   r+   r”   )r"   Útimeoutr'   r'   r(   Úset_connect_timeoutÃ   r6   z#DCERPCTransport.set_connect_timeoutc                 C   r*   r+   ©rl   r,   r'   r'   r(   ÚgetRemoteNameÆ   r.   zDCERPCTransport.getRemoteNamec                 C   ó
   || _ dS ©úBThis method only makes sense before connection for most protocols.Nr˜   )r"   r‚   r'   r'   r(   ÚsetRemoteNameÉ   ó   
zDCERPCTransport.setRemoteNamec                 C   r*   r+   ©rm   r,   r'   r'   r(   ÚgetRemoteHostÍ   r.   zDCERPCTransport.getRemoteHostc                 C   rš   r›   rŸ   )r"   Ú
remoteHostr'   r'   r(   ÚsetRemoteHostÐ   rž   zDCERPCTransport.setRemoteHostc                 C   r*   r+   ©rn   r,   r'   r'   r(   Ú	get_dportÔ   r.   zDCERPCTransport.get_dportc                 C   rš   r›   r£   )r"   Údportr'   r'   r(   Ú	set_dportÖ   rž   zDCERPCTransport.set_dportc                 C   r*   r+   ©ro   r,   r'   r'   r(   Úget_stringbindingÚ   r.   z!DCERPCTransport.get_stringbindingc                 C   r2   r+   r§   )r"   r#   r'   r'   r(   rc   Ý   r6   z!DCERPCTransport.set_stringbindingc                 C   s   |   ¡ |  ¡ fS r+   )r    r¤   r,   r'   r'   r(   Úget_addrà   ó   zDCERPCTransport.get_addrc                 C   s    |   |d ¡ |  |d ¡ dS )rœ   r   r   N)r¢   r¦   r3   r'   r'   r(   Úset_addrâ   s   zDCERPCTransport.set_addrNc                 C   s   || _ || _d S r+   )rv   r|   )r"   ÚflagÚkdcHostr'   r'   r(   Úset_kerberosç   ó   
zDCERPCTransport.set_kerberosc                 C   r*   r+   )rv   r,   r'   r'   r(   Úget_kerberosë   r.   zDCERPCTransport.get_kerberosc                 C   r*   r+   )r|   r,   r'   r'   r(   Úget_kdcHostî   r.   zDCERPCTransport.get_kdcHostc                 C   s   |dkr
|   ¡  d S || _d S )Néÿÿÿÿ)Úset_default_max_fragment_sizerp   )r"   Úsend_fragment_sizer'   r'   r(   Úset_max_fragment_sizeñ   s   
z%DCERPCTransport.set_max_fragment_sizec                 C   s   || _ || _|| _d S r+   )r~   r   r€   )r"   ÚvalidateÚaccept_emptyÚhostnamer'   r'   r(   Úset_hostname_validationú   s   
z'DCERPCTransport.set_hostname_validationc                 C   s
   d| _ d S ©Nr   )rp   r,   r'   r'   r(   r³   ÿ   s   
z-DCERPCTransport.set_default_max_fragment_sizec                 C   s$   | j | j| j| j| j| j| j| jfS r+   )rw   rx   rr   rs   rt   ry   rz   r{   r,   r'   r'   r(   Úget_credentials  s   øzDCERPCTransport.get_credentialsr   c	           	      C   s˜   || _ || _|| _|| _|| _|| _|dks|dkrJt|ƒd r$d| }t|ƒd r.d| }zt |¡| _	t |¡| _
W d S    || _	|| _
Y d S d S )Nr   r   z0%s)rw   rx   rr   ry   rz   r{   r    ÚbinasciiÚ	unhexlifyrs   rt   ©	r"   ÚusernameÚpasswordÚdomainÚlmhashÚnthashÚaesKeyÚTGTÚTGSr'   r'   r(   r}     s&   õzDCERPCTransport.set_credentialsc                 C   s   t jS r+   )r   Ú
USE_NTLMv2r,   r'   r'   r(   ÚdoesSupportNTLMv2#  s   z!DCERPCTransport.doesSupportNTLMv2c                 C   s   t | ƒS r+   )r   r,   r'   r'   r(   Úget_dce_rpc'  r‰   zDCERPCTransport.get_dce_rpc)r   r   r   ©r   r   r+   ©r   r   r   r   NN)!rB   rC   rD   r   ÚDCERPC_classr)   rˆ   rŽ   r‘   r’   r“   r•   r—   r™   r�   r    r¢   r¤   r¦   r¨   rc   r©   r«   r®   r°   r±   rµ   r¹   r³   r»   r}   rÈ   rÉ   r'   r'   r'   r(   rk   ˜   s<    


	
rk   c                   @   sR   e Zd ZdZeZddd„Zdd„ Zdd„ Zdd
d„Z	ddd„Z
dd„ Zdd„ ZdS )r]   z0Implementation of ncadg_ip_udp protocol sequenceé‡   c                 C   s(   t  | ||¡ d| _|  d¡ d| _d S )Nr   é   r   )rk   r)   Ú_UDPTransport__socketr—   Ú_UDPTransport__recv_addrr�   r'   r'   r(   r)   /  s   

zUDPTransport.__init__c              
   C   s|   z't  |  ¡ |  ¡ dt j¡d \}}}}}t   |||¡| _| j |  ¡ ¡ W dS  t jy= } z	d | _t	d| ƒ‚d }~ww ©Nr   zCould not connect: %sr   )
ÚsocketÚgetaddrinfor    r¤   Ú
SOCK_DGRAMrÏ   Ú
settimeoutr•   Úerrorr   ©r"   ÚafÚsocktypeÚprotoÚ	canonnameÚsaÚmsgr'   r'   r(   rˆ   5  s   (ü€þzUDPTransport.connectc                 C   ó.   z| j  ¡  W dS  tjy   d | _ Y dS w ©Nr   r   )rÏ   ÚcloserÒ   rÖ   r,   r'   r'   r(   r’   @  ó   ýþzUDPTransport.disconnectr   c                 C   s   | j  ||  ¡ |  ¡ f¡ d S r+   )rÏ   Úsendtor    r¤   rŠ   r'   r'   r(   rŽ   H  s   zUDPTransport.sendc                 C   s   | j  d¡\}| _|S )Né    )rÏ   ÚrecvfromrÐ   )r"   r�   r�   Úbufferr'   r'   r(   r‘   K  s   zUDPTransport.recvc                 C   r*   r+   )rÐ   r,   r'   r'   r(   Úget_recv_addrO  r.   zUDPTransport.get_recv_addrc                 C   r*   r+   )rÏ   r,   r'   r'   r(   r“   R  r.   zUDPTransport.get_socketN©rÍ   rÊ   )rB   rC   rD   Ú__doc__r	   rÌ   r)   rˆ   r’   rŽ   r‘   ræ   r“   r'   r'   r'   r(   r]   *  s    


r]   c                   @   sF   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„Zddd„Zdd„ Z	dS )r_   z0Implementation of ncacn_ip_tcp protocol sequencerÍ   c                 C   s"   t  | ||¡ d| _|  d¡ d S )Nr   rÎ   )rk   r)   Ú_TCPTransport__socketr—   r�   r'   r'   r(   r)   X  s   zTCPTransport.__init__c              
   C   sŒ   t  |  ¡ |  ¡ dt j¡d \}}}}}t   |||¡| _z| j |  ¡ ¡ | j |¡ W dS  t j	yE } z| j 
¡  td| ƒ‚d }~ww rÑ   )rÒ   rÓ   r    r¤   ÚSOCK_STREAMré   rÕ   r•   rˆ   rÖ   rà   r   r×   r'   r'   r(   rˆ   ]  s   (ý
€þzTCPTransport.connectc                 C   rÞ   rß   )ré   rà   rÒ   rÖ   r,   r'   r'   r(   r’   h  rá   zTCPTransport.disconnectr   c                 C   sP   | j r d}	 |||| j  … }|sd S | j |¡ |t|ƒ7 }q| j |¡ d S rº   )rp   ré   rŽ   r    ©r"   r‹   rŒ   r�   ÚoffsetÚtoSendr'   r'   r(   rŽ   p  s   ûzTCPTransport.sendc                 C   sf   |r+d}d}t |ƒ|k r)| j |t |ƒ ¡}|dkr||7 }ntdƒ‚t |ƒ|k s|S | j d¡}|S )Nó    z Connection closed by remote hostrã   )r    ré   r‘   r   )r"   r�   r�   rå   Úchunkr'   r'   r(   r‘   |  s   
ûÿzTCPTransport.recvc                 C   r*   r+   )ré   r,   r'   r'   r(   r“   Š  r.   zTCPTransport.get_socketNrç   rÊ   )
rB   rC   rD   rè   r)   rˆ   r’   rŽ   r‘   r“   r'   r'   r'   r(   r_   U  s    


r_   c                   @   sp   e Zd ZdZddd„Zddd„Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
ddd„Zddd„Zdd„ Zdd„ ZdS )r`   z.Implementation of ncacn_http protocol sequenceNéQ  c                 C   sB   d| _ d | _t| _t| _t | ||¡ t | ||¡ |  	d¡ d S )NFrÎ   )
Ú_useRpcProxyÚ_rpcProxyUrlr_   Ú
_transportr   Ú_versionrk   r)   r
   r—   r�   r'   r'   r(   r)   �  s   zHTTPTransport.__init__r   c	           	      C   s   | j  | ||||||||¡	S r+   )ró   r}   r¾   r'   r'   r(   r}   š  s   ÿzHTTPTransport.set_credentialsc                 C   s   d| _ t| _d S ©NT)rñ   r
   ró   r,   r'   r'   r(   Úrpc_proxy_initž  r¯   zHTTPTransport.rpc_proxy_initc                 C   s   |   ¡  t|ƒ| _d S r+   )rö   r   rò   )r"   Úurlr'   r'   r(   Úset_rpc_proxy_url¢  s   zHTTPTransport.set_rpc_proxy_urlc                 C   s
   t | jƒS r+   )r   rò   r,   r'   r'   r(   Úget_rpc_proxy_url¦  r6   zHTTPTransport.get_rpc_proxy_urlc                 C   s‚   t  | |¡ | j d¡r?|  ¡  | j d¡ d¡}|d dkr*|  d|d  ¡ d S |d dkr;|  d|d  ¡ d S td	ƒ‚d S )
NÚRpcProxyrH   r   Ú443zhttps://%s/rpc/rpcproxy.dllr   Ú80zhttp://%s/rpc/rpcproxy.dllz RPC Proxy port must be 80 or 443)	rk   rc   ro   r=   rö   r<   r   rø   r   )r"   rc   Úrpcproxyr'   r'   r(   rc   ©  s   ózHTTPTransport.set_stringbindingc                 C   sV   | j dkr$t| _t | ¡ |  ¡  d¡}|dkr"td| j| j	f ƒ‚d S t
 | ¡ d S )NFrã   s   ncacn_http/1.0z%s:%s service is not ncacn_http)rñ   r   rô   r_   rˆ   r“   r‘   r   Ú_HTTPTransport__remoteNameÚ_HTTPTransport__dstportr
   )r"   r‹   r'   r'   r(   rˆ   »  s   

ÿzHTTPTransport.connectr   c                 C   s   | j  | |||¡S r+   )ró   rŽ   rŠ   r'   r'   r(   rŽ   Í  ó   zHTTPTransport.sendc                 C   s   | j  | ||¡S r+   )ró   r‘   r�   r'   r'   r(   r‘   Ð  rª   zHTTPTransport.recvc                 C   s   | j dkr
t | ¡S tdƒ‚)NFz6This method is not supported for RPC Proxy connections)rñ   r_   r“   r   r,   r'   r'   r(   r“   Ó  s   

zHTTPTransport.get_socketc                 C   s   | j  | ¡S r+   )ró   r’   r,   r'   r'   r(   r’   Ù  r?   zHTTPTransport.disconnect)Nrð   rË   rÊ   )rB   rC   rD   rè   r)   r}   rö   rø   rù   rc   rˆ   rŽ   r‘   r“   r’   r'   r'   r'   r(   r`   �  s    




r`   c                   @   sz   e Zd ZdZ		ddd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zd dd„Z	d dd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!ra   z,Implementation of ncacn_np protocol sequenceé½  r   Nr   Fc              
   C   s    t  | ||¡ d | _d| _|| _d| _d| _|  ||||||	|
|¡ || _|| _	|dkr1|  
|¡ |dkr9d| _n
d| _| j| ¡ Ž  d | _|| _|  d¡ d S )Nr   r   FTrÎ   )rk   r)   Ú_SMBTransport__socketÚ_SMBTransport__tidÚ_SMBTransport__filenameÚ_SMBTransport__handleÚ_SMBTransport__pending_recvr}   rv   r|   r¢   Ú_SMBTransport__existing_smbÚgetCredentialsÚ_SMBTransport__prefDialectÚ_SMBTransport__smb_connectionr—   )r"   r‚   rƒ   r[   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   Úremote_hostÚsmb_connectionÚ
doKerberosr­   r'   r'   r(   r)   ß  s$   
zSMBTransport.__init__c                 C   r2   r+   )r	  )r"   Údialectr'   r'   r(   Úpreferred_dialectø  r6   zSMBTransport.preferred_dialectc                 C   sT   | j s&t|  ¡ |  ¡ |  ¡ | j|  ¡ d�| _ | jr(| j  | j| j	| j
¡ d S d S d S )N)Ú	sess_portÚpreferredDialectr–   )r
  r   r™   r    r¤   r	  r•   r~   ÚsetHostnameValidationr   r€   r,   r'   r'   r(   Úsetup_smb_connectionû  s   
ÿüz!SMBTransport.setup_smb_connectionc                 C   s¢   | j dkr6|  ¡  | jdu r| j  | j| j| j| j| j¡ n| j j	| j| j| j| j| j| j
| j| j| jd�	 | j  d¡| _| j  | j| j¡| _| j  ¡  ¡ | _dS )Nr   F)r­   rÅ   rÆ   zIPC$r   )r
  r  rv   Úloginrw   rx   rr   rs   rt   ÚkerberosLoginry   r|   rz   r{   ÚconnectTreer  ÚopenFiler  r  ÚgetSMBServerr“   r  r,   r'   r'   r(   rˆ     s   

 þzSMBTransport.connectc                 C   s:   | j  | j¡ | jdu r| j  ¡  | j  ¡  d| _ d S d S )NFr   )r
  ÚdisconnectTreer  r  Úlogoffrà   r,   r'   r'   r(   r’     s   



ýzSMBTransport.disconnectc                 C   sz   | j r&d}	 |||| j  … }|sn| jj| j| j||d� |t|ƒ7 }qn
| j | j| j|¡ |r;|  jd7  _d S d S )Nr   r   )rì   )rp   r
  Ú	writeFiler  r  r    r  rë   r'   r'   r(   rŽ     s   ûÿzSMBTransport.sendc                 C   sJ   | j s| jr| jr|  jd8  _| jj| j| j| jd�S | j | j| j¡S )Nr   )ÚbytesToRead)rp   r  r
  ÚreadFiler  r  rq   r�   r'   r'   r(   r‘   (  s
   zSMBTransport.recvc                 C   r*   r+   )r
  r,   r'   r'   r(   Úget_smb_connection2  r.   zSMBTransport.get_smb_connectionc                 C   s   || _ | j| ¡ Ž  d| _d S rõ   )r
  r}   r  r  )r"   r  r'   r'   r(   Úset_smb_connection5  s   
zSMBTransport.set_smb_connectionc                 C   ó
   | j  ¡ S r+   )r
  r  r,   r'   r'   r(   Úget_smb_server:  rž   zSMBTransport.get_smb_serverc                 C   r*   r+   )r  r,   r'   r'   r(   r“   >  r.   zSMBTransport.get_socketc                 C   r   r+   )r
  rÈ   r,   r'   r'   r(   rÈ   A  r6   zSMBTransport.doesSupportNTLMv2)r  r   r   r   r   r   r   r   NNr   r   FNrÊ   )rB   rC   rD   rè   r)   r  r  rˆ   r’   rŽ   r‘   r  r  r!  r“   rÈ   r'   r'   r'   r(   ra   Ü  s     
ÿ
	

ra   c                   @   s>   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„Zddd„ZdS )rb   zƒ
    Implementation of ncalocal protocol sequence, not the same
    as ncalrpc (I'm not doing LPC just opening the local pipe)
    r   c                 C   s   t  | dd¡ || _d| _d S )Nr   r   )rk   r)   Ú_LOCALTransport__filenameÚ_LOCALTransport__handle)r"   r[   r'   r'   r(   r)   J  s   
zLOCALTransport.__init__c                 C   s@   | j  ¡  d¡dk rd| j  | _ t d| j  tjtjB ¡| _dS )NÚPIPEr   z\PIPE\%sz\\.\%sr   )r"  ÚupperÚfindÚosÚopenÚO_RDWRÚO_BINARYr#  r,   r'   r'   r(   rˆ   O  s   zLOCALTransport.connectc                 C   s   t  | j¡ d S r+   )r'  rà   r#  r,   r'   r'   r(   r’   U  rª   zLOCALTransport.disconnectr   c                 C   s   t  | j|¡ d S r+   )r'  Úwriter#  rŠ   r'   r'   r(   rŽ   X  r   zLOCALTransport.sendc                 C   s   t  | jd¡}|S )Niÿÿ  )r'  Úreadr#  )r"   r�   r�   r‹   r'   r'   r(   r‘   [  s   zLOCALTransport.recvN)r   rÊ   )	rB   rC   rD   rè   r)   rˆ   r’   rŽ   r‘   r'   r'   r'   r(   rb   D  s    

rb   )!Ú
__future__r   r   r¼   r'  rE   rÒ   Úurllib.parser   r   ÚImportErrorÚimpacketr   Úimpacket.dcerpc.v5.rpcrtr   r   r	   Úimpacket.dcerpc.v5.rpchr
   r   r   r   Úimpacket.smbconnectionr   r   r@   rj   rk   r]   r_   r`   ra   rb   r'   r'   r'   r(   Ú<module>   s2   ÿ=' +8Oh