o
    Žõ±j5e  ã                   @   sž   d dl 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T d dlmZ d d	lmZ d d
lmZ d dlZG dd„ dƒZdS )é    N)ÚNDRCALL)ÚDCERPCTCPTransport)ÚDCERPCSMBTransport)Úunpack)Úuuidtup_to_binÚgenerateÚstringver_to_binÚbin_to_uuidtup)Ú*)Úhresult_errors)ÚRC4)ÚISC_REQc                   @   s|   e Z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d„Z
dd„ Zdd„ Zdd„ Zd!dd„Zd"dd„ZdS )#ÚDCERPC5Connectionc                 C   s²   || _ || _d | _|d u rt| _nt| _| jjd urt| _t| _	d| _
d| _tdƒ| _tdƒ| _| j| _tdƒ| _d| _d| _d| _d | _d | _d | _d | _d | _d | _d | _d S )Nr   é   ©z$8a885d04-1ceb-11c9-9fe8-08002b104860ú2.0)z$71710533-BEBA-4937-8319-B5DBEF9CCC36z1.0)ÚtargetÚgssapiÚ	transportÚRPC_C_AUTHN_NONEÚ	auth_typeÚRPC_C_AUTHN_WINNTÚkerberosÚRPC_C_AUTHN_GSS_NEGOTIATEÚRPC_C_AUTHN_LEVEL_NONEÚ
auth_levelÚctxÚcallidr   Ú	NDRSyntaxÚNDR64SyntaxÚtransfer_syntaxÚ!_DCERPC5Connection__max_xmit_sizeÚ_max_user_fragÚ_DCERPC5Connection__sequenceÚ_DCERPC5Connection__sessionKeyÚ$_DCERPC5Connection__clientSigningKeyÚ$_DCERPC5Connection__serverSigningKeyÚ$_DCERPC5Connection__clientSealingKeyÚ$_DCERPC5Connection__serverSealingKeyÚ'_DCERPC5Connection__clientSealingHandleÚ'_DCERPC5Connection__serverSealingHandle)Úselfr   r   © r,   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/dcerpc/v5/connection.pyÚ__init__   s2   



zDCERPC5Connection.__init__c                 C   s   | j S ©N)r$   )r+   r,   r,   r-   Úget_session_key3   s   z!DCERPC5Connection.get_session_keyc                 C   ó
   || _ d S r/   )r   )r+   r   r,   r,   r-   Úset_auth_level6   ó   
z DCERPC5Connection.set_auth_levelc                 C   r1   r/   )r   )r+   r   r,   r,   r-   Úset_auth_type9   r3   zDCERPC5Connection.set_auth_typec              
   Ã   sP   �z| j d ur| j  ¡ I d H  W dS  ty' } z
d |fW  Y d }~S d }~ww )N©TN)r   Ú
disconnectÚ	Exception)r+   Úer,   r,   r-   r6   <   s   €
€ÿzDCERPC5Connection.disconnectc              
   Ã   s®   �z?| j jdkrt| j ƒ| _| j ¡ I dH  W dS | j jdkr>t| j ƒ| _| j ¡ I dH \}}|dur5|‚| j ¡ | _W dS tƒ ‚ t	yV } z
d|fW  Y d}~S d}~ww )zP
		Selects the correct transport layer based on the self.target and starts it
		Úncacn_ip_tcpNÚncacn_npr5   )
r   Úrpcprotocolr   r   Úconnectr   r0   r$   ÚNotImplementedErrorr7   )r+   Ú_Úerrr8   r,   r,   r-   r<   E   s$   €÷þ€ÿzDCERPC5Connection.connectr   r   c              
   Ã   sÒ  ��zÏt ƒ }| j}t|ƒD ]0}tƒ }||d< d|d< ||d< tƒ tdƒ |d< t|ƒ|d< | |¡ |  jd7  _|d7 }qtƒ }||d< t|ƒ|d< ||d< d|d< | |¡ tƒ }	t	|	d< | 
¡ |	d< | j|	d	< |rpt|	d< | jtk�r(| jtkr¨| jjjd
| j ¡ tjtjB tjB tjB tjB tjB d�I d
H \}
}}|d
ur§d
|fW S nE| jtkr´dtdƒfW S | jtkræ| jjjd
tjtjB tjB tjB tj B tj!B | j ¡ d�I d
H \}
}}|d
uråd
|fW S nd
tdƒfW S t"ƒ }| j|d< | j|d< | jd |d< dt#|	 $¡ ƒd  d }|dk�r |	d  d| 7  < ||d< ||	d< |
|	d< | j% &|	 $¡ ¡I d
H \}}|d
u�r<|‚|  '¡ I d
H \}}|d
u�rL|‚t|ƒ}|d t(k�s^|d t)k�ret*| 
¡ ƒ}nd|d t+k�ss|d t,k�r¾|d t,k�rŽt-| 
¡ ƒ}t.d|d d
d… ƒd }n
t/|d ƒ}|d }|t0v �r¥dt1|d�fW S |t2v �rµdt1dt2|  ƒfW S dt1d| ƒfW S dt1d|d  ƒfW S t|d |d  d ƒD ]L}| 3|¡}|d! dk�rd"| }|t4 5|d! d#|d!  ¡7 }|d$7 }| 3|¡d% }|t2 5|d&| ¡7 }|d! |fd'k�r|d(7 }t1|ƒ‚|d | _6�qÔ|d) | _7| jtk�rÍ| jtk�ri| jjj|d | j ¡ tjtjB tjB tjB tjB tjB d�I d
H \}}}|d
u�rad
|fW S | jj 8¡ | _9nE| jtk�rrd
}n<| jtk�r®| jjj|d tjtjB tjB tjB tj B tj!B | j ¡ d�I d
H \}}}|d
u�r§d
|fW S | jj 8¡ | _9d| _:| jt;t<t=fv �r.| jtk�r$| jj >¡ d*k�rú| jj ?¡ | _@| jj ?d+¡| _A| jj B¡ | _C| jj Bd+¡| _DtE| jCƒ}|jF| _GtE| jDƒ}|jF| _Hn4| jj 8¡ | _@| jj 8¡ | _A| jj 8¡ | _C| jj 8¡ | _DtE| j@ƒ}|jF| _G|jF| _Hn
| jtk�r.td,ƒ‚t"ƒ }| j|d< | j|d< | jd |d< |d
u�rÆ| jtk�r“tƒ }t|d< | 
¡ |d< ||d< ||d< | j%j&| $¡ dd-�I d
H \}}|d
u�rx|‚d| _:|  '¡ I d
H \}}|d
u�r‹|‚| jj I¡ | _:n3tƒ }tJ|d< d.|d< ||d< ||d< |d	 | _| j|d	< | j%j&| $¡ dd-�I d
H \}}|d
u�rÆ|‚|  jd7  _|d
fW S  t�yè } z
d|fW  Y d
}~S d
}~ww )/za
		Performs bind operation. Does authentication and sets up the keys for further communication
		Ú	ContextIDr   Ú
TransItemsr   ÚAbstractSyntaxÚTransferSyntaxÚtypeÚpduDataÚcall_idN)ÚspnÚflagsFz%RPC_C_AUTHN_NETLOGON Not implemented!)rH   rG   zUnsupported auth type!r   r   é5 Úauth_ctx_idé   r   ó   ÿÚauth_pad_lenÚsec_trailerÚ	auth_dataú<LÚRejectedReason©Ú
error_codezBind context rejected: %sú'Unknown DCE RPC fault status code: %.8xz(Unknown DCE RPC packet type received: %dÚctx_numÚResultzBind context %d rejected: z)Unknown DCE RPC context result code: %.4xz; ÚReasonzUnknown reason code: %.4x)é   r   zI (this usually means the interface isn't listening on the given endpoint)Ú	max_rfragTÚServerú(RPC_C_AUTHN_NETLOGON is not implemented!)ÚforceWriteAndxs       )KÚ	MSRPCBindr   ÚrangeÚCtxItemr   r   r   Ú
addCtxItemÚMSRPCHeaderÚ
MSRPC_BINDÚgetDatar   ÚMSRPC_ALTERCTXr   r   r   r   r   ÚntlmÚauthenticater   Úto_target_stringr   ÚREPLAY_DETECTÚCONFIDENTIALITYÚUSE_SESSION_KEYÚ	INTEGRITYÚSEQUENCE_DETECTÚ
CONNECTIONÚRPC_C_AUTHN_NETLOGONr7   r   ÚMUTUAL_AUTHÚUSE_DCE_STYLEÚSEC_TRAILERÚlenÚ
get_packetr   ÚsendÚrecv_oneÚMSRPC_BINDACKÚMSRPC_ALTERCTX_RÚMSRPCBindAckÚMSRPC_BINDNAKÚMSRPC_FAULTÚMSRPCRespHeaderr   ÚMSRPCBindNakÚrpc_status_codesÚDCERPCExceptionÚrpc_provider_reasonÚ
getCtxItemÚrpc_cont_def_resultÚgetr    r!   r0   r$   r#   ÚRPC_C_AUTHN_LEVEL_CONNECTÚRPC_C_AUTHN_LEVEL_PKT_INTEGRITYÚRPC_C_AUTHN_LEVEL_PKT_PRIVACYÚis_extended_securityÚget_signkeyr%   r&   Úget_sealkeyr'   r(   r   Úencryptr)   r*   Úget_seq_numberÚMSRPC_AUTH3)r+   Ú
iface_uuidÚalterÚbogus_bindsr    Úbindr   r>   ÚitemÚpacketÚauthÚresr?   rN   ÚpadÚdataÚrespÚbindRespÚstatus_codeÚctxItemsÚmsgÚreasonÚresponseÚcipher3Úcipher4ÚcipherÚ	alter_ctxÚauth3r8   r,   r,   r-   r�   [   s¢  €




ÿþýüûý

ÿ

ÿþýüû÷
ÿ








ÿþýüûý


ÿþýüû÷















€ÿzDCERPC5Connection.bindNTc              
   Ã   s\  �z–| j | jkr| | j¡ d}nd}|  |j||¡I dH \}}|dur&|‚|  ¡ I dH \}}|dur5|‚t|jƒ tj	|j }t
||jjd ƒ}	|dd… dkr�|du r�td|dd… ƒd }
|
tv rjt|
d	�}nt
|d
ƒ}z|	||d�}W n
   ||
d	�}Y n|||
d�}d|fW S |	||d�}|dfW S  ty­ } z
d|fW  Y d}~S d}~ww )zb
		Creates a requests then dispateches it to _transport.send for singing/encryption asn sending
		TFNÚResponseéüÿÿÿs       rP   r   rR   ÚDCERPCSessionError)ÚisNDR64)r‘   rS   )r    r   ÚchangeTransferSyntaxÚcallÚopnumÚrecvÚ
__import__Ú
__module__ÚsysÚmodulesÚgetattrÚ	__class__Ú__name__r   r}   r~   r7   )r+   ÚrequestÚuuidÚ
checkErrorr¥   r>   r?   ÚanswerÚmoduleÚ	respClassrS   Ú	exceptionÚsessionErrorClassrœ   r8   r,   r,   r-   r±   R  s@   €



€ÿzDCERPC5Connection.requestc           
   
   Ã   s
  �zìt |tƒdurt|j| ¡ ƒ}z|d dkr |d  tO  < W n   Y | j|d< | j|d< t|d ƒ|d< d	}| j	d
krGt
| j	| jƒ}n| j}| jttfv rW|dkrWd}t|d ƒd |krod}|d | jkro| jd }|rÔ|d }d
}	 |||| … }|sƒnP|d
kr�|d  tO  < n	|d  t M  < |t|ƒ7 }|t|ƒkr®|d  tO  < n	|d  t M  < ||d< | j|d|d t@ d�I d H \}}|d urÒ|‚qxn|  |¡I d H \}}|d urä|‚|  jd7  _W dS  t�y }	 z
d |	fW  Y d }	~	S d }	~	ww )NTr²   ó    rH   Úctx_idrF   rE   Ú
alloc_hintFr   é   é€   r   ©r\   Ú	forceRecvr5   )Ú
isinstancera   ÚDCERPC_RawCallÚOP_NUMrs   ÚPFC_OBJECT_UUIDr   r   rr   r"   Úminr!   r   r„   r…   ÚPFC_FIRST_FRAGÚPFC_LAST_FRAGÚ_transport_sendr7   )
r+   r•   Úshould_fragmentÚfragment_sizer‘   ÚoffsetÚtoSendr>   r?   r8   r,   r,   r-   rt   ‚  sj   €€



"ð€ÿzDCERPC5Connection.sendc              
   Ã   s  ��ztd}d}|�sr| j  d¡I d H \}}|d ur|‚t|ƒ}| ¡ }|d tkrw|d |d krwtd|||d … ƒd }|tv rHtt| ƒ‚|d	@ tv rVtt|d	@  ƒ‚|tj	v rqtj	| d }tj	| d }	td
||	f ƒ‚td| ƒ‚|d t
@ r€d}nd}
||d … }|d }|�rl|d7 }|| d … }t|d�}|d | … }|d tk�r| jtkrç| jj ¡ dkrÍ| jj | j| j||| j| j¡\}}n‘| jj | j| j||| j| j¡\}}|  jd7  _nw| jtkrðtdƒ‚| jtk�r| jdk�r| jjj|| jd|d�I d H \}}nP|d tk�r^| jtk�rM|dd … }| jj ¡ dk�r8| jj | j|| j| j¡}n&| jj | j|| j| j¡}|  jd7  _n| jtk�rWtdƒ‚| jtk�r^	 |d �rl|d |d  … }||7 }|r
|d fW S  t�y� } z
d |fW  Y d }~S d }~ww )NFr¹   r   rD   Úfrag_lenrK   rP   r   éÿÿ  ú%s - %srT   rH   TÚauth_lenr¼   )r•   r   r[   Úinit)Ú	directionrO   é   rM   )r   r©   r{   Úget_header_sizerz   r   r}   r~   r   ÚERROR_MESSAGESrÆ   rq   r…   r   r   r   re   r†   ÚSEALr&   r(   r#   r*   rn   r7   r   Údecryptr„   ÚSIGN)r+   ÚfinishedÚ	retAnswerÚresponse_datar?   Úresponse_headerÚoffr˜   Úerror_msg_shortÚerror_msg_verboser¿   r´   rÏ   rO   rN   Ú	signatureÚcfounderÚntlmsspr8   r,   r,   r-   r©   Í  s®   €



ú
ú	
"€üü		
Š
x€ÿzDCERPC5Connection.recvc              
   Ã   sb  �z“d}d}d}|s�| j  d¡I d H \}}|d ur|‚t|ƒ}| ¡ }|d tkrƒ|d |d krƒtd|||d … ƒd }|tv rKd tt| ƒfW S |d	@ tv r\d tt|d	@  ƒfW S |tj	v rztj	| d }	tj	| d }
d td
|	|
f ƒfW S d td| ƒfW S |d t
@ rŒd}nd}|r
|d fW S  ty° } ztt ¡ ƒ d |fW  Y d }~S d }~ww )NFr   r¹   r   rD   rÌ   rK   rP   rÍ   rÎ   rT   rH   T)r   r©   r{   rÓ   rz   r   r}   r~   r   rÔ   rÆ   r7   ÚprintÚ	tracebackÚ
format_exc)r+   rØ   r¿   rÙ   rÚ   r?   rÛ   rÜ   r˜   rÝ   rÞ   r8   r,   r,   r-   ru   N  s@   €
ã
€þzDCERPC5Connection.recv_onec              
   Ã   sš  ��z3| j |d< d|d< d|d< | jttfv �rtƒ }| j|d< | j|d< d|d< | j d	 |d
< dt| ¡ ƒd  d }|dkrN|d  d| 7  < ||d< | ¡ |d< d|d< |d }| jtkr»| jt	krš| j
j ¡ dkr‡| j
j | j| j| ¡ dd… || j| j¡\}}n/| j
j | j| j||| j| j¡\}}n| jtkr£tdƒ‚| jtkr¶| j
j
 || j¡I dH \}}||d< nP| jtk�r| jt	krð| j
j ¡ dkrâ| j
j | j| ¡ dd… | j| j¡}n)| j
j | j|| j| j¡}n| jtkrùtdƒ‚| jtk�r| j
j
 || j¡I dH }| ¡ |d< ||d< |  jd7  _| jj| ¡ ||d�I dH \}	}
|
du�r3|
‚W dS  t�yL } z
d|fW  Y d}~S d}~ww )zq
		This function does the signing and ecryption on the data we want to send out.
		Keys are set up during bind
		rº   r¹   rN   rO   r   r   r   rM   rI   rJ   rK   rE   ó   »s                   TNiðÿÿÿr[   r   r¾   r5   )r   r   r„   r…   rq   r   rr   rs   rc   r   r   re   r†   rÕ   r%   r'   r#   r)   rn   r7   r   r‰   r×   Úsignr   rt   )r+   Ú
rpc_packetr\   r¿   rN   r”   Ú
plain_dataÚsealedMessagerß   r>   r?   r8   r,   r,   r-   rÇ   w  sŒ   €





ú	
ú
	


ýý
 
€ÿz!DCERPC5Connection._transport_sendc              
   Ã   s¢   �z9t |dƒr"|  t|| ¡ |ƒ¡I d H \}}|d ur|‚|d fW S |  t|||ƒ¡I d H \}}|d ur6|‚|d fW S  tyP } z
d |fW  Y d }~S d }~ww )Nrc   )Úhasattrrt   rÁ   rc   r7   )r+   ÚfunctionÚbodyr²   Útr?   r8   r,   r,   r-   r§   Ô  s   €
 

€ÿzDCERPC5Connection.call)r   r   r   )NT)r   r   r/   )r°   r«   Ú__qualname__r.   r0   r2   r4   r6   r<   r�   r±   rt   r©   ru   rÇ   r§   r,   r,   r,   r-   r      s     "	
 
x0K 
)]r   )Úasynciorã   Úaiosmb.dcerpc.v5.ndrr   Úaiosmb.dcerpc.v5.transport.tcpr   Úaiosmb.dcerpc.v5.transport.smbr   Úaiosmb.dcerpc.v5.structurer   Úaiosmb.dcerpc.v5.uuidr   r   r   r	   Úaiosmb.dcerpc.v5.rpcrtÚaiosmb.dcerpc.v5r   Úunicrypto.symmetricr   Úasyauth.common.winapi.constantsr   r¬   r   r,   r,   r,   r-   Ú<module>   s    