o
    CDi y                     @   s  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 ddl	m
Z
 ddlT ddlT ddlmZ G d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ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZ G d+d, d,eZ!G d-d. d.eZ"G d/d0 d0eZ#G d1d2 d2eZ$G d3d4 d4eZ%G d5d6 d6eZ&G d7d8 d8eZ'dS )9    N)StringIO   )ProtocolError)*)convertFILETIMEtoEpochc                   @   s   e Zd ZdZeeZdZeeZdZ	ee	Z
dZedZdZddd	Zd
d Zdd Zdd Zdd Zdd Zedd Zedd ZdS )SMB2Messagez	<4sHHIHHIz<IQQQ16sz	<IQIIQ16s@   zSMB.SMB2Message   Nc                 C   s&   |    |r|| _| j|  d S d S N)resetpayloadinitMessage)selfr    r   I/var/www/Datamplify/venv/lib/python3.10/site-packages/smb/smb2_structs.py__init__   s
   zSMB2Message.__init__c              	   C   s   t  }|d| jt| jdtjf  |d| jtjf  |d| jtjf  |d| j	tjf  |d| j
tjf  |d| jtjf  |dt| jtjtt| jtjf  | S )	NzCommand: 0x%02X (%s) %sz	<unknown>zStatus: 0x%08X %szFlags: 0x%02X %sz
PID: %d %sz
MID: %d %sz
TID: %d %szData: %d bytes %s%s %s)r   writecommandSMB2_COMMAND_NAMESgetoslinesepstatusflagspidmidtidlendatastrbinasciihexlifygetvalue)r   br   r   r   __str__    s   ",zSMB2Message.__str__c                 C   sj   d| _ d| _d| _d| _d| _d| _d| _d| _d | _d| _	d| _
d| _d| _d| _d| _d| _d| _d S )N    r   s                   )raw_datar   r   r   next_command_offsetr   
session_id	signaturer   r   async_idr   r   flags2uidsecurityparameters_datar   r   r   r   r   +   s"   
zSMB2Message.resetc              
   C   sp   | j sJ t | _| j |  t| jd| jd| j	| j
d| jt| j| j| j| j| j| j| j }|| j S )a#  
        Encode this SMB2 message into a series of bytes suitable to be embedded with a NetBIOS session message.
        AssertionError will be raised if this SMB message has not been initialized with a Payload instance

        @return: a string containing the encoded SMB2 message
           SMBr   )r   r   getpidr   preparestructpackHEADER_STRUCT_FORMATHEADER_SIZEr   r   r   SYNC_HEADER_STRUCT_FORMATr'   r   r   r(   r)   r   )r   headers_datar   r   r   encodeE   s   

"
zSMB2Message.encodec                 C   s  t |}|dk rtd||   t| j|d| j \}}| _| _| _	| _
| _|dkr2td||| jkr;td| jrf|| j| j k rKtd|t| j|| j| j| j  \| _| _| _| _| _n)|| j| j k rstd|t| j|| j| j| j  \| _| _| _| _| _| _| jdkr|d| j | _|| j| j | _n|| _|| jd | _|   | jr| j|  t | jS )aN  
        Decodes the SMB message in buf.
        All fields of the SMB2Message object will be reset to default values before decoding.
        On errors, do not assume that the fields will be reinstated back to what they are before
        this method is invoked.

        References
        ==========
        - [MS-SMB2]: 2.2.1

        @param buf: data containing one complete SMB2 message
        @type buf: string
        @return: a positive integer indicating the number of bytes used in buf to decode this SMB message
        @raise ProtocolError: raised when decoding fails
        r   z%Not enough data to decode SMB2 headerNr0   z"Invalid 4-byte SMB2 protocol fieldz"Invalid SMB2 header structure sizer   )r   r   r   r3   unpackr5   HEADER_STRUCT_SIZEcredit_charger   r   	credit_rer   r6   isAsyncASYNC_HEADER_STRUCT_SIZEASYNC_HEADER_STRUCT_FORMATr'   r   r*   r(   r)   SYNC_HEADER_STRUCT_SIZEr7   r   r   r&   r   _decodeCommandr   decode)r   bufbuf_lenprotocolstruct_sizer   r   r   rC   V   sF   






zSMB2Message.decodec                 C   s  | j tkrt | _d S | j tkrt | _d S | j tkr!t | _d S | j tkr,t	 | _d S | j t
kr7t | _d S | j tkrBt | _d S | j tkrMt | _d S | j tkrXt | _d S | j tkrct | _d S | j tkrnt | _d S | j tkryt | _d S | j tkrt | _d S d S r
   )r   SMB2_COM_READSMB2ReadResponser   SMB2_COM_WRITESMB2WriteResponseSMB2_COM_QUERY_DIRECTORYSMB2QueryDirectoryResponseSMB2_COM_CREATESMB2CreateResponseSMB2_COM_CLOSESMB2CloseResponseSMB2_COM_QUERY_INFOSMB2QueryInfoResponseSMB2_COM_SET_INFOSMB2SetInfoResponseSMB2_COM_IOCTLSMB2IoctlResponseSMB2_COM_TREE_CONNECTSMB2TreeConnectResponseSMB2_COM_SESSION_SETUPSMB2SessionSetupResponseSMB2_COM_NEGOTIATESMB2NegotiateResponseSMB2_COM_ECHOSMB2EchoResponser/   r   r   r   rB      s2   











zSMB2Message._decodeCommandc                 C      t | jt@ S r
   )boolr   SMB2_FLAGS_ASYNC_COMMANDr/   r   r   r   r>         zSMB2Message.isAsyncc                 C   r`   r
   )ra   r   SMB2_FLAGS_SERVER_TO_REDIRr/   r   r   r   isReply   rc   zSMB2Message.isReplyr
   )__name__
__module____qualname__r5   r3   calcsizer;   r@   r?   r7   rA   r6   logging	getLoggerlogrF   r   r$   r   r9   rC   rB   propertyr>   re   r   r   r   r   r   
   s(    




;
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	Structurec                 C      d S r
   r   r   messager   r   r   r         zStructure.initMessagec                 C      t r
   NotImplementedErrorrp   r   r   r   r2      rr   zStructure.preparec                 C   rs   r
   rt   rp   r   r   r   rC      rr   zStructure.decodeN)rf   rg   rh   r   r2   rC   r   r   r   r   rn      s    rn   c                   @   &   e Zd ZdZdZeeZdd ZdS )r]   a  
    Contains information on the SMB2_NEGOTIATE response from server

    After calling the decode method, each instance will contain the following attributes,
    - security_mode (integer)
    - dialect_revision (integer)
    - server_guid (string)
    - max_transact_size (integer)
    - max_read_size (integer)
    - max_write_size (integer)
    - system_time (long)
    - server_start_time (long)
    - security_blob (string)

    References:
    ===========
    - [MS-SMB2]: 2.2.4
    z<HHHH16sIIIIQQHHIc                 C   s   |j tksJ |jdkrLt| j|jtjtj| j	  \}| _
| _}| _| _| _| _| _| _| _}}}t| j| _t| j| _|j|||  | _d S d S Nr   )r   r\   r   r3   r:   STRUCTURE_FORMATr&   r   r6   STRUCTURE_SIZEsecurity_modedialect_revisionserver_guidcapabilitiesmax_transact_sizemax_read_sizemax_write_sizesystem_timeserver_start_timer   security_blob)r   rq   rG   _security_buf_offsetsecurity_buf_lenr   r   r   rC      s   
 zSMB2NegotiateResponse.decodeN	rf   rg   rh   __doc__rx   r3   ri   ry   rC   r   r   r   r   r]      s
    
r]   c                   @   6   e Zd ZdZdZeeZdd Zdd Z	dd Z
d	S )
SMB2SessionSetupRequestz<
    References:
    ===========
    - [MS-SMB2]: 2.2.5
    z	<HBBIIHHQc                 C   
   || _ d S r
   )r   )r   r   r   r   r   r         
z SMB2SessionSetupRequest.__init__c                 C      t | | t|_d S r
   )rn   r   rZ   r   rp   r   r   r   r         
z#SMB2SessionSetupRequest.initMessagec                 C   s6   t | jdddddtj| j t| jd	| j |_d S )N   r   r   )	r3   r4   rx   r   r6   ry   r   r   r   rp   r   r   r   r2      s   

zSMB2SessionSetupRequest.prepareNrf   rg   rh   r   rx   r3   ri   ry   r   r   r2   r   r   r   r   r          
r   c                   @   s>   e Zd ZdZdZeeZedd Z	edd Z
dd Zd	S )
r[   a   
    Contains information about the SMB2_COM_SESSION_SETUP response from the server.

    If the message has no errors, each instance contains the following attributes:
    - session_flags (integer)
    - security_blob (string)

    References:
    ===========
    - [MS-SMB2]: 2.2.6
    <HHHHc                 C      | j d@ dkS )Nr   r   session_flagsr/   r   r   r   isGuestSession  rc   z'SMB2SessionSetupResponse.isGuestSessionc                 C   r   )Nr	   r   r   r/   r   r   r   isAnonymousSession  rc   z+SMB2SessionSetupResponse.isAnonymousSessionc                 C   sR   |j tksJ t| j|jtjtj| j  \}| _	}}|j|||  | _
d S r
   )r   rZ   r3   r:   rx   r&   r   r6   ry   r   r   )r   rq   rG   security_blob_offsetsecurity_blob_lenr   r   r   rC     s    zSMB2SessionSetupResponse.decodeN)rf   rg   rh   r   rx   r3   ri   ry   rm   r   r   rC   r   r   r   r   r[     s    


r[   c                   @   r   )
SMB2TreeConnectRequestz<
    References:
    ===========
    - [MS-SMB2]: 2.2.9
    r   c                 C   r   r
   )path)r   r   r   r   r   r   ,  r   zSMB2TreeConnectRequest.__init__c                 C   r   r
   )rn   r   rX   r   rp   r   r   r   r   /  r   z"SMB2TreeConnectRequest.initMessagec                 C   s8   t | jddtj| j t| jd | jd |_	d S )N	   r   r	   UTF-16LE)
r3   r4   rx   r   r6   ry   r   r   r9   r   rp   r   r   r   r2   3  s   


zSMB2TreeConnectRequest.prepareNr   r   r   r   r   r   "  r   r   c                   @   rv   )rY   a  
    Contains information about the SMB2_COM_TREE_CONNECT response from the server.

    If the message has no errors, each instance contains the following attributes:
    - share_type (integer): one of the SMB2_SHARE_TYPE_xxx constants
    - share_flags (integer)
    - capabilities (integer): bitmask of SMB2_SHARE_CAP_xxx
    - maximal_access (integer)

    References:
    ===========
    - [MS-SMB2]: 2.2.10
    <HBBIIIc                 C   sV   |j tksJ |jdkr)t| j|jtjtj| j	  \}| _
}| _| _| _d S d S rw   )r   rX   r   r3   r:   rx   r&   r   r6   ry   
share_typeshare_flagsr}   maximal_accessr   rq   rG   r   r   r   r   rC   M  s   
 
zSMB2TreeConnectResponse.decodeNr   r   r   r   r   rY   ;  s
    
rY   c                   @   sH   e Zd ZdZdZeeZdddddee	dfddZ
dd Zd	d
 ZdS )SMB2CreateRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.13
    z<HBBIQQIIIIIHHIIr   r%   c
           
      C   s>   || _ || _|| _|| _|| _|| _|| _|| _|	pd| _d S Nr%   )	filenamefile_attributesaccess_maskshare_accesscreate_dispcreate_optionsoplockimpersonationcreate_context_data)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   `  s   zSMB2CreateRequest.__init__c                 C   r   r
   )rn   r   rN   r   rp   r   r   r   r   o  r   zSMB2CreateRequest.initMessagec                 C   s   | j d}t|}| jr:tj| j t| }|d dkr2|dd|d   7 }tj| j t| }n|}|| j7 }nd}|s@d}|d dksHJ t| j	dd| j
| jdd| j| j| j| j| jtj| j ||t| j| |_d S )Nr      r       9   )r   r9   r   r   r   r6   ry   r3   r4   rx   r   r   r   r   r   r   r   r   )r   rq   rD   filename_lenncreate_context_offsetr   r   r   r2   s  s@   

zSMB2CreateRequest.prepareN)rf   rg   rh   r   rx   r3   ri   ry   SEC_ANONYMOUSSMB2_OPLOCK_LEVEL_NONEr   r   r2   r   r   r   r   r   V  s    

r   c                   @   rv   )rO   a  
    Contains information about the SMB2_COM_CREATE response from the server.

    If the message has no errors, each instance contains the following attributes:
    - oplock (integer): one of SMB2_OPLOCK_LEVEL_xxx constants
    - create_action (integer): one of SMB2_FILE_xxx constants
    - allocation_size (long)
    - file_size (long)
    - file_attributes (integer)
    - fid (16-bytes string)
    - create_time, lastaccess_time, lastwrite_time, change_time (float)

    References:
    ===========
    - [MS-SMB2]: 2.2.14
    z<HBBIQQQQQQII16sIIc                 C   s   |j tksJ |jdkrHt| j|jtjtj| j	  \}| _
}| _}}}}| _| _| _}| _}}t|| _t|| _t|| _t|| _d S d S rw   )r   rN   r   r3   r:   rx   r&   r   r6   ry   r   create_actionallocation_size	file_sizer   fidr   create_timelastaccess_timelastwrite_timechange_time)r   rq   rG   r   r   r   r   r   r   r   r   rC     s   
 



zSMB2CreateResponse.decodeNr   r   r   r   r   rO     s
    
rO   c                   @   8   e Zd ZdZdZeeZdddZdd Z	dd	 Z
d
S )SMB2WriteRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.21
    z<HHIQ16sIIHHIr   c                 C   s2   t |dksJ || _|| _|| _|| _|| _d S )N   )r   r   r   offsetremaining_lenr   )r   r   r   r   r   r   r   r   r   r     s   
zSMB2WriteRequest.__init__c                 C   r   r
   )rn   r   rJ   r   rp   r   r   r   r     r   zSMB2WriteRequest.initMessagec                 C   sB   t | jdtj| j t| j| j| j	d| j
dd| j| j |_d S )N1   r   )r3   r4   rx   r   r6   ry   r   r   r   r   r   r   rp   r   r   r   r2     s   


zSMB2WriteRequest.prepareN)r   r   r   r   r   r   r   r     s    

r   c                   @   rv   )rK   z
    Contains information about the SMB2_WRITE response from the server.

    If the message has no errors, each instance contains the following attributes:
    - count (integer)

    References:
    ===========
    - [MS-SMB2]: 2.2.22
    z<HHIIHHc                 C   sP   |j tksJ |jdkr&t| j|jtjtj| j	  \}}| _
}}}d S d S rw   )r   rJ   r   r3   r:   rx   r&   r   r6   ry   countr   r   r   r   rC     s   
4zSMB2WriteResponse.decodeNr   r   r   r   r   rK     s
    
rK   c                   @   r   )SMB2ReadRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.19
    z<HBBIQ16sIIIHHr   c                 C   s   || _ || _|| _|| _d S r
   )r   read_offsetread_lenmin_read_len)r   r   r   r   r   r   r   r   r     s   
zSMB2ReadRequest.__init__c                 C   r   r
   )rn   r   rH   r   rp   r   r   r   r     r   zSMB2ReadRequest.initMessagec                 C   s4   t | jddd| j| j| j| jddddd |_d S )Nr   r   r   )r3   r4   rx   r   r   r   r   r   rp   r   r   r   r2     s   
zSMB2ReadRequest.prepareNr   r   r   r   r   r   r     s    

r   c                   @   rv   )rI   z=
    References:
    ===========
    - [MS-SMB2]: 2.2.20
    r   c                 C   sf   |j tksJ |jdkr1t| j|jtjtj| j	  \}}}| _
}}|j||| j
  | _d S d S rw   )r   rH   r   r3   r:   rx   r&   r   r6   ry   data_lengthr   )r   rq   rG   data_offsetr   r   r   r   rC   "  s
   
0zSMB2ReadResponse.decodeNr   r   r   r   r   rI     s
    
rI   c                   @   r   )SMB2IoctlRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.31
    z<HHI16sIIIIIIII   c                 C   s"   || _ || _|| _|| _|| _d S r
   )ctlcoder   r   in_datamax_out_size)r   r   r   r   r   r   r   r   r   r   4  
   
zSMB2IoctlRequest.__init__c                 C   r   r
   )rn   r   rV   r   rp   r   r   r   r   ;  r   zSMB2IoctlRequest.initMessagec                 C   sF   t | jdd| j| jtj| j t| j	ddd| j
| jd| j	 |_d S )Nr   r   )r3   r4   rx   r   r   r   r6   ry   r   r   r   r   r   rp   r   r   r   r2   ?  s    

zSMB2IoctlRequest.prepareN)r   r   r   r   r   r   r   *  s    

r   c                   @   rv   )rW   aS  
    Contains information about the SMB2_IOCTL response from the server.

    If the message has no errors, each instance contains the following attributes:
    - ctlcode (integer)
    - fid (16-bytes string)
    - flags (integer)
    - in_data (string)
    - out_data (string)

    References:
    ===========
    - [MS-SMB2]: 2.2.32
    z<HHI16sIIIIIIc              
   C   s   |j tksJ |jdkrQt| j|jtjtj| j	  \
}}| _
| _}}}}| _}|dkr9|j|||  | _nd| _|dkrL|j|||  | _d S d| _d S d S )Nr   r%   )r   rV   r   r3   r:   rx   r&   r   r6   ry   r   r   r   r   out_data)r   rq   rG   r   input_offset	input_lenoutput_offset
output_lenr   r   r   rC   c  s   
 
zSMB2IoctlResponse.decodeNr   r   r   r   r   rW   P  s
    
rW   c                   @   r   )SMB2CloseRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.15
    z<HHI16sr   c                 C   s   || _ || _d S r
   )r   r   )r   r   r   r   r   r   r     s   
zSMB2CloseRequest.__init__c                 C   r   r
   )rn   r   rP   r   rp   r   r   r   r     r   zSMB2CloseRequest.initMessagec                 C   s   t | jd| jd| j|_d S )N   r   )r3   r4   rx   r   r   r   rp   r   r   r   r2     s   
zSMB2CloseRequest.prepareNr   r   r   r   r   r   r   v  s    

r   c                   @      e Zd ZdZdd ZdS )rQ   z=
    References:
    ===========
    - [MS-SMB2]: 2.2.16
    c                 C   s   |j tksJ d S r
   )r   rP   rp   r   r   r   rC     s   zSMB2CloseResponse.decodeNrf   rg   rh   r   rC   r   r   r   r   rQ         rQ   c                   @   r   )
SMB2QueryDirectoryRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.33
    z<HBBI16sHHIc                 C   s"   || _ || _|| _|| _|| _d S r
   )r   r   
info_classr   output_buf_len)r   r   r   r   r   r   r   r   r   r     r   z"SMB2QueryDirectoryRequest.__init__c                 C   r   r
   )rn   r   rL   r   rp   r   r   r   r     r   z%SMB2QueryDirectoryRequest.initMessagec                 C   sH   t | jd| j| jd| jtj| j t	| j
d | j	| j
d |_d S )N!   r   r	   r   )r3   r4   rx   r   r   r   r   r6   ry   r   r   r   r9   r   rp   r   r   r   r2     s   


z!SMB2QueryDirectoryRequest.prepareNr   r   r   r   r   r         
r   c                   @   rv   )rM   a  
    Contains information about the SMB2_COM_QUERY_DIRECTORY response from the server.

    If the message has no errors, each instance contains the following attributes:
    - data_length (integer)
    - data (string)

    References:
    ===========
    - [MS-SMB2]: 2.2.34
    <HHIc                 C   `   |j tksJ |jdkr.t| j|jtjtj| j	  \}}| _
|j||| j
  | _d S d S rw   )r   rL   r   r3   r:   rx   r&   r   r6   ry   r   r   )r   rq   rG   r   r   r   r   rC     
   
*z!SMB2QueryDirectoryResponse.decodeNr   r   r   r   r   rM     
    
rM   c                   @   r   )
SMB2QueryInfoRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.37
    z<HBBIHHIII16sc                 C   s2   || _ || _|| _|| _|| _|| _|pd| _d S r   )r   r   additional_info	info_typefile_info_classr   	input_buf)r   r   r   r   r   r   r   r   r   r   r   r     s   zSMB2QueryInfoRequest.__init__c                 C   r   r
   )rn   r   rR   r   rp   r   r   r   r     r   z SMB2QueryInfoRequest.initMessagec                 C   sF   t | jd| j| j| jtj| j dt	| j
| j| j| j| j
 |_d S )N)   r   )r3   r4   rx   r   r   r   r   r6   ry   r   r   r   r   r   r   rp   r   r   r   r2     s   

zSMB2QueryInfoRequest.prepareNr   r   r   r   r   r     s    
	r   c                   @   rv   )rS   a  
    Contains information about the SMB2_COM_QUERY_INFO response from the server.

    If the message has no errors, each instance contains the following attributes:
    - data_length (integer)
    - data (string)

    References:
    ===========
    - [MS-SMB2]: 2.2.38
    r   c                 C   r   rw   )r   rR   r   r3   r:   rx   r&   r   r6   ry   r   r   )r   rq   rG   
buf_offsetr   r   r   rC   
  r   zSMB2QueryInfoResponse.decodeNr   r   r   r   r   rS     r   rS   c                   @   r   )
SMB2SetInfoRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.39
    z<HBBIHHI16sc                 C   s&   || _ || _|| _|| _|pd| _d S r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r     s
   zSMB2SetInfoRequest.__init__c                 C   r   r
   )rn   r   rT   r   rp   r   r   r   r   #  r   zSMB2SetInfoRequest.initMessagec                 C   s>   t | jd| j| jt| jtj| j	 d| j
| j	| j |_d S )Nr   r   )r3   r4   rx   r   r   r   r   r   r6   ry   r   r   rp   r   r   r   r2   '  s   
	
zSMB2SetInfoRequest.prepareNr   r   r   r   r   r     r   r   c                   @   r   )rU   z=
    References:
    ===========
    - [MS-SMB2]: 2.2.40
    c                 C   ro   r
   r   rp   r   r   r   rC   :  rr   zSMB2SetInfoResponse.decodeNr   r   r   r   r   rU   3  r   rU   c                   @   s.   e Zd ZdZdZeeZdd Zdd Z	dS )SMB2EchoRequestz=
    References:
    ===========
    - [MS-SMB2]: 2.2.28
    z<HHc                 C   r   r
   )rn   r   r^   r   rp   r   r   r   r   H  r   zSMB2EchoRequest.initMessagec                 C   s   t | jdd|_d S )N   r   )r3   r4   rx   r   rp   r   r   r   r2   L  s   
zSMB2EchoRequest.prepareN)
rf   rg   rh   r   rx   r3   ri   ry   r   r2   r   r   r   r   r   >  s    
r   c                   @   r   )r_   z=
    References:
    ===========
    - [MS-SMB2]: 2.2.29
    c                 C   ro   r
   r   rp   r   r   r   rC   X  rr   zSMB2EchoResponse.decodeNr   r   r   r   r   r_   Q  r   r_   )(r   sysr3   typesrj   r    timeior   smb_structsr   smb_constantssmb2_constantsutilsr   r   rn   r]   r   r[   r   rY   r   rO   r   rK   r   rI   r   rW   r   rQ   r   rM   r   rS   r   rU   r   r_   r   r   r   r   <module>   s@   8 +$!@$$$&&!&!