o
    àý°j�õ ã                   @   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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Zd dlZd dlZd dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZmZ d dlmZm Z  d dl!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( d d	l$m)Z* d d
l+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV e WeX¡ZYdZZdZ[dd„ Z\dd„ Z]dd„ Z^dd„ Z_dd„ Z`dd„ Zadd„ Zbdd „ Zcd!d"„ Zdd#d$„ Zed%d&„ ZfdWd'd(„Zgd)d*„ Zhd+d,„ Zide%jjjkfd-d.„Zle%jjjkd/fd0d1„Zmd2d3„ Znd4d5„ Zod6d7„ ZpG d8d9„ d9ƒZqG d:d;„ d;ƒZrG d<d=„ d=ƒZsG d>d?„ d?ƒZtG d@dA„ dAƒZuG dBdC„ dCƒZvG dDdE„ dEe jwƒZxG dFdG„ dGe jye jzƒZ{dHZ|dIZ}d dJl~mZ d dKl€m�Z� d dLl‚mƒZƒm„Z„m…Z…m†Z†m‡Z‡mˆZˆm‰Z‰ d dMlŠm‹Z‹mŒZŒ d dNl�mŽZŽ G dOdP„ dPeƒZ�G dQdR„ dReƒZ�G dSdT„ dTƒZ‘G dUdV„ dVƒZ’dS )Xé    N)Ú	unhexlifyÚhexlifyÚa2b_hex)ÚepmÚnrpcÚ	transport)Úrpcrt)ÚbÚ
ensure_str)ÚconfigparserÚsocketserver)ÚencoderÚdecoder)ÚsmbÚnmbÚntlmÚuuid)Úsmb3structs)ÚSPNEGO_NegTokenInitÚ	TypesMechÚ	MechTypesÚSPNEGO_NegTokenRespÚASN1_AIDÚASN1_SUPPORTED_MECH)ÚAP_REPÚAuthenticatorÚEncAPRepPartÚEncTicketPartÚGSSAPIHeader_KRB5_AP_REQ)Ú	constants)ÚKeyÚ_enctype_tableÚInvalidChecksumÚgenerate_kerberos_keys)ÚSTATUS_NO_MORE_FILESÚSTATUS_NETWORK_NAME_DELETEDÚSTATUS_INVALID_PARAMETERÚSTATUS_FILE_CLOSEDÚSTATUS_MORE_PROCESSING_REQUIREDÚSTATUS_OBJECT_PATH_NOT_FOUNDÚSTATUS_DIRECTORY_NOT_EMPTYÚSTATUS_FILE_IS_A_DIRECTORYÚSTATUS_NOT_IMPLEMENTEDÚSTATUS_INVALID_HANDLEÚSTATUS_OBJECT_NAME_COLLISIONÚSTATUS_NO_SUCH_FILEÚSTATUS_CANCELLEDÚSTATUS_OBJECT_NAME_NOT_FOUNDÚSTATUS_SUCCESSÚSTATUS_ACCESS_DENIEDÚSTATUS_NOT_SUPPORTEDÚSTATUS_INVALID_DEVICE_REQUESTÚSTATUS_FS_DRIVER_REQUIREDÚSTATUS_INVALID_INFO_CLASSÚSTATUS_LOGON_FAILUREÚSTATUS_OBJECT_PATH_SYNTAX_BADÚSTATUS_END_OF_FILEi [ i  c                 C   ó
   t  | ¡S ©N)r   Ú	POSIXtoFT©Út© r@   ú…/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/smbserver.pyÚgetFileTimeR   ó   
rB   c                 C   r;   r<   )r   Ú	FTtoPOSIXr>   r@   r@   rA   ÚgetUnixTimeU   rC   rE   c              
   C   s¤  t  | d|d  d¡|¡}t  | d|d  d¡|¡}|d d d… }	|d dd … }
t  |||
 ¡}|d }t  ||	¡}|d }|d t j@ dkrP|d	t jA M }|d t j@ dkr`|d	t jA M }|d t j@ dkrp|d	t jA M }|d t j@ dkr€|d	t jA M }|d t j	@ dkr�|d	t j	A M }|d t j
@ dkr |d	t j
A M }t  |d |||d
 d||d¡}|d t j@ rÂ|d }t  ||¡}nd }|}|	|krÎt|fS t|fS )NÚ Údomain_nameúutf-16ler   é   ÚlanmanÚflagsr   ì   ÿÿ Ú	challengeTÚsession_key)r   ÚNTOWFv2ÚdecodeÚLMOWFv2Úhmac_md5Ú*NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITYÚNTLMSSP_NEGOTIATE_128ÚNTLMSSP_NEGOTIATE_KEY_EXCHÚNTLMSSP_NEGOTIATE_SEALÚNTLMSSP_NEGOTIATE_SIGNÚNTLMSSP_NEGOTIATE_ALWAYS_SIGNÚKXKEYÚgenerateEncryptedSessionKeyr2   r8   )ÚidentityÚlmhashÚnthashÚserverChallengeÚauthenticateMessageÚntlmChallengeÚtype1ÚresponseKeyNTÚresponseKeyLMÚ
ntProofStrÚtempÚntProofStr2ÚlmChallengeResponseÚsessionBaseKeyÚresponseFlagsÚkeyExchangeKeyÚexportedSessionKeyÚencryptedRandomSessionKeyr@   r@   rA   ÚcomputeNTLMv2X   s@   þrm   c                 C   s¸  d}t | ƒtur|  d¡} zTt|ƒdkr?d| d¡| d¡t| ƒ d¡t|ƒ d¡d d… t|ƒ ¡ dd … f ddœ}W |S d| d¡| d¡t|ƒ d¡t|ƒ d¡t| ƒ ¡ f d	dœ}W |S    zSt|ƒdkr–d| d¡| d¡t| ƒ d¡t|ƒd d…  d¡t|ƒdd …  d¡f ddœ}nd||t|ƒ d¡t|ƒ d¡t| ƒ d¡f d	dœ}W Y |S W Y |S  tyÛ } zd
d l}| ¡  t 	d| ¡ W Y d }~Y |S d }~ww )NrF   zlatin-1é   z%s::%s:%s:%s:%srH   é    Úntlmv2)Úhash_stringÚhash_versionr   r   zoutputToJohnFormat: %s)
ÚtypeÚbytesrP   Úlenr   Ú	ExceptionÚ	tracebackÚ	print_excÚLOGÚerror)rM   ÚusernameÚdomainÚ
lmresponseÚ
ntresponseÚ	ret_valueÚerw   r@   r@   rA   ÚoutputToJohnFormat�   s^   
ýýè
ýýì(þýþ
þ	ñú€úr�   c                 C   s‚   t j |¡}|dkr|d d |d  }n
|d d |d  }t|dƒ�}| | ¡ | d¡ W d   ƒ d S 1 s:w   Y  d S )Nrp   r   Ú_ntlmv2é   Ú_ntlmÚaÚ
)ÚosÚpathÚsplitextÚopenÚwrite)rq   rr   Ú	file_nameÚfn_dataÚoutput_filenameÚfr@   r@   rA   ÚwriteJohnOutputToFile»   s   
"þr�   c                 C   s   | t jj@ r| d¡S |S )NrH   )r   ÚSMBÚFLAGS2_UNICODErP   ©rK   Útextr@   r@   rA   ÚdecodeSMBStringÇ   s   
r•   c                 C   s    | t jj@ r| d¡S | d¡S )NrH   Úascii)r   r‘   r’   Úencoder“   r@   r@   rA   ÚencodeSMBStringÎ   s   

r˜   c                 C   s$   t j | ¡}t |j|j|j¡ ¡ S r<   )	ÚdatetimeÚdateÚfromtimestampr   ÚSMB_DATEÚyearÚmonthÚdayÚpack©r?   Údr@   r@   rA   Ú
getSMBDateÕ   ó   r£   c                 C   s$   t j  | ¡}t |j|j|j¡ ¡ S r<   )r™   r›   r   ÚSMB_TIMEÚhourÚminuteÚsecondr    r¡   r@   r@   rA   Ú
getSMBTimeÚ   r¤   r©   c                 C   s@   |  ¡ }| ¡ }|| d¡= i }|D ]}t| |¡ƒ||< q|S )NÚglobal)ÚgetServerConfigÚsectionsÚindexÚdictÚitems)ÚconnIdÚ	smbServerÚconfigr¬   ÚsharesÚir@   r@   rA   Ú	getSharesß   s   rµ   c                 C   s,   t |ƒ}| ¡ }| |¡rt| |¡ƒS d S r<   )r
   r«   Úhas_sectionr®   r¯   )r°   Úsharer±   r²   r@   r@   rA   ÚsearchShareê   s
   
r¸   c                 C   sX   t j |  dd¡¡} t| ƒdkr*| d dks| d dkr*|du s$|dkr*| dd… } | S )aa  Normalizes a path by replacing "" with "/" and stripping potential
    leading "/" chars. If a path is provided, only strip leading '/' when
    the path is empty.

    :param file_name: file name to normalize
    :type file_name: string

    :param path: path to normalize
    :type path: string

    :return normalized file name
    :rtype string
    ú\ú/r   NrF   rƒ   )r‡   rˆ   ÚnormpathÚreplaceru   )rŒ   rˆ   r@   r@   rA   Únormalize_pathó   s
   $r½   c                 C   s6   t j | |¡}t j | ¡}t j t j |¡|f¡|kS )aK  Validates if a provided file name path is inside a path. This function is used
    to check for path traversals.

    :param path: base path to check
    :type path: string
    :param file_name: file name to validate
    :type file_name: string

    :return whether the file name is inside the base path or not
    :rtype bool
    )r‡   rˆ   ÚjoinÚrealpathÚcommonprefix)rˆ   rŒ   Ú	path_nameÚshare_real_pathr@   r@   rA   ÚisInFileJail	  s   rÃ   c              
   C   sN  t |ƒ}tj | |¡}d}d}t| |ƒs!t d¡ t}d|||fS |d@ r)tj}ntj 	|¡dur9t
}d|||fS tj |¡rN|tj@ dkrNt}d|||fS |d@ dkrZ|tjO }n|d@ dkrf|tjO }ntj}ztjdkrt|tjO }|rytj}t ||¡}	W n  ty  }
 zt d	||f |
¡ d}	t}W Y d }
~
nd }
~
ww |	|||fS )
Nr   ú%Path not in current working directoryrI   Té   rƒ   é   Úwin32zopenFile: %s,%s)r½   r‡   rˆ   r¾   rÃ   ry   rz   r9   ÚO_CREATÚexistsr/   Úisdirr   ÚATTR_DIRECTORYr+   ÚO_WRONLYÚO_RDWRÚO_RDONLYÚsysÚplatformÚO_BINARYrŠ   rv   r3   )rˆ   ÚfileNameÚ
accessModeÚfileAttributesÚopenModeÚreadOnlyÚpathNameÚ	errorCodeÚmodeÚfidr€   r@   r@   rA   ÚopenFile  sD   



€ýrÛ   c              
   C   sà  |t jj@ r	d}nd}t|ƒ}tj | |¡}tj |¡}t |¡\
}}	}
}}}}}}}|d u rP|}d}tj 	|¡r>|t j
O }tj |¡rI|t jO }|}|||fS |t jksZ|tjkr}t  ¡ }t jt jB |d< d|d< tdƒd |d	< d d¡|d
< | ¡ S |t jkr“t j|d�}d |¡|d< | ¡ S |t jks�|tjkr°t  ¡ }d|d< t  |¡|d< | ¡ S |t jkr½t  ¡ }| ¡ S |t jksÇ|tjkrÔt   ¡ }t j!|d< | ¡ S |t j"krát  #¡ }| ¡ S |t j$krît  %¡ }| ¡ S d S )NrH   r–   r   ÚFileSystemAttributeséÿ   ÚMaxFilenNameLengthInBytesÚXTFSrÆ   ÚLengthOfFileSystemNameÚFileSystemName©rK   ÚSHAREÚVolumeLabelrF   ÚVolumeCreationTimeÚ
DeviceType)&r   r‘   r’   r½   r‡   rˆ   r¾   ÚgetsizeÚstatrÊ   ÚSMB_FILE_ATTRIBUTE_DIRECTORYÚisfileÚSMB_FILE_ATTRIBUTE_NORMALÚSMB_QUERY_FS_ATTRIBUTE_INFOÚsmb2ÚSMB2_FILESYSTEM_ATTRIBUTE_INFOÚSMBQueryFsAttributeInfoÚFILE_CASE_SENSITIVE_SEARCHÚFILE_CASE_PRESERVED_NAMESru   r—   ÚgetDataÚSMB_INFO_VOLUMEÚSMBQueryFsInfoVolumeÚSMB_QUERY_FS_VOLUME_INFOÚSMB2_FILESYSTEM_VOLUME_INFOÚSMBQueryFsVolumeInfor=   ÚSMB_QUERY_FS_SIZE_INFOÚSMBQueryFsSizeInfoÚSMB_QUERY_FS_DEVICE_INFOÚSMB2_FILESYSTEM_DEVICE_INFOÚSMBQueryFsDeviceInfoÚFILE_DEVICE_DISKÚFILE_FS_FULL_SIZE_INFORMATIONÚSMBFileFsFullSizeInformationÚFILE_FS_SIZE_INFORMATIONÚFileFsSizeInformation)rˆ   ÚfilenameÚlevelÚpktFlagsÚencodingrÒ   r×   ÚfileSizerÙ   ÚinoÚdevÚnlinkÚuidÚgidÚsizeÚatimeÚmtimeÚctimeÚlastWriteTimeÚattribsrÔ   Údatar@   r@   rA   ÚqueryFsInformationI  s\   







r  Fc                 C   sx  |t jj@ r	d}nd}t|ƒ}tj | |¡}t| |ƒs%t 	d¡ g dt
fS g }| d¡dkr8| d¡dkr8d}	ntj |¡}	tj |¡}
|	dkr\| tj |
d	¡¡ | tj |
d
¡¡ |	dkr›tj |
¡skd dtfS t |
¡D ])}t | ¡ |	 ¡ ¡r™tj |
|¡}tj |¡r”|t j@ r“| |¡ qp| |¡ qpntj |¡r¦| |¡ g }t|ƒ}t}|D �]ï}|t jks½|tjkrÄt j|d�}nt|t jksÎ|tjkrÕt j|d�}nc|t jksß|tj kræt j!|d�}nR|t j"kròt j#|d�}nF|t j$ksý|tj%k�rt j&|d�}n4|t j'k�s|tj(k�rt j)|d�}n!|t j*k�s#|tj+k�r*t j,|d�}nt 	d| ¡ ||t-f  S t .|¡\
}}}}}}}}}}tj |¡�rTt j|d< nt j/t j0B |d< tj |¡ 1|¡|d< |t jtjt j'tj(fv �r¾d|d< ||d< ||d< t  2|¡|d< t  2|¡|d< t  2|¡|d< t  2|¡|d< d|d< tj |¡ 1|¡|d< dt|ƒd  d }t|ƒ| |d< nÝ|t jtjfv �r	||d< ||d< t  2|¡|d< t  2|¡|d< t  2|¡|d< t  2|¡|d< tj |¡ 1|¡|d< dt|ƒd  d }t|ƒ| |d< n’|t jt j$tj tj%fv �rQd|d< ||d< ||d< t  2|¡|d< t  2|¡|d< t  2|¡|d< t  2|¡|d< dt|ƒd  d }t|ƒ| |d< nJ|t j"k�r€||d< t3|ƒ|d< t4|ƒ|d< t3|ƒ|d< t4|ƒ|d< t3|ƒ|d< t4|ƒ|d< n|t j*tj+fv �r›dt|ƒd  d }t|ƒ| |d< | |¡ q°|t jk�s¬|du �r·|dk�r·d|d d< |||fS )NrH   r–   rÄ   r   Ú*éÿÿÿÿú?rF   Ú.z..râ   zWrong level %d!ÚExtFileAttributesÚFileNameÚEaSizeÚ	EndOfFileÚAllocationSizeÚCreationTimeÚLastAccessTimeÚLastWriteTimeÚLastChangeTimez                        Ú	ShortNameé   ÚNextEntryOffsetÚCreationDateÚLastAccessDateÚLastWriteDateT)5r   r‘   r’   r½   r‡   rˆ   r¾   rÃ   ry   rz   r9   ÚfindÚbasenameÚdirnameÚappendrÉ   r1   ÚlistdirÚfnmatchÚlowerrÊ   rË   ru   r2   Ú!SMB_FIND_FILE_BOTH_DIRECTORY_INFOrí   ÚSMB2_FILE_BOTH_DIRECTORY_INFOÚSMBFindFileBothDirectoryInfoÚSMB_FIND_FILE_DIRECTORY_INFOÚSMB2_FILE_DIRECTORY_INFOÚSMBFindFileDirectoryInfoÚ!SMB_FIND_FILE_FULL_DIRECTORY_INFOÚSMB2_FULL_DIRECTORY_INFOÚSMBFindFileFullDirectoryInfoÚSMB_FIND_INFO_STANDARDÚSMBFindInfoStandardÚ$SMB_FIND_FILE_ID_FULL_DIRECTORY_INFOÚ SMB2_FILE_ID_FULL_DIRECTORY_INFOÚSMBFindFileIdFullDirectoryInfoÚ$SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFOÚ SMB2_FILE_ID_BOTH_DIRECTORY_INFOÚSMBFindFileIdBothDirectoryInfoÚSMB_FIND_FILE_NAMES_INFOÚSMB2_FILE_NAMES_INFOÚSMBFindFileNamesInfor4   rè   ÚATTR_NORMALÚATTR_ARCHIVEr—   r=   r£   r©   )rˆ   rÒ   r  ÚsearchAttributesr  ÚisSMB2r  r×   ÚfilesÚpatternÚdirNameÚfileÚentryÚsearchResultÚsearchCountrØ   r´   ÚitemrÙ   r  r  r	  r
  r  r  r  r  r  ÚpadLenr@   r@   rA   Ú
findFirst2  sÖ   





€
€ù	



ÿ
ÿ 
rO  c                 C   s   t | ||ƒS r<   )ÚqueryPathInformation)rˆ   r  r  r@   r@   rA   ÚqueryFileInformation  ó   rQ  c              
   C   sH  �z�d}t || ƒ}tj | |¡}t| |ƒst d¡ d tfW S tj |¡�rŠt 	|¡\
}}}}	}
}}}}}tj 
|¡r?tj}ntjtjB }|tjkrpt ¡ }t |¡|d< t |¡|d< t |¡|d< t |¡|d< ||d< �n|tjkr›t ¡ }t |¡|d< t |¡|d< t |¡|d< t |¡|d< ||d	< �nê|tjkr¾t ¡ }||d
< ||d< tj 
|¡r¸d|d< �nÍd|d< �nÇ|tjkråt ¡ }||d
< ||d< d|d< tj 
|¡rßd|d< �n¦d|d< �n |tjk�r0t ¡ }t |¡|d< t |¡|d< t |¡|d< t |¡|d< ||d< ||d
< ||d< tj 
|¡�r#d|d< nd|d< | d¡|d< �nU|tjk�rt ¡ }t ¡ |d< t ¡ |d< t ¡ |d< t ¡ |d< t  ¡ |d< t !¡ |d< t "¡ |d< t #¡ |d< t $¡ |d< t |¡|d d< t |¡|d d< t |¡|d d< t |¡|d d< tj 
|¡�r°tj%|d d	< d|d d< tj|d d< ntj&tj'B |d d	< d|d d< tjtjB |d d< ||d d
< ||d d< |	|d d< d|d d< ||d d< d|d d< d|d d< ||d d< d|d d < | d¡|d d< t(| d¡ƒ|d d!< np|tj)k�rHt *¡ }t |¡|d< t |¡|d< t |¡|d< t |¡|d< ||d
< ||d< ||d	< n=|tj+k�sT|tj,k�rYt -¡ }n,|tj.k�se|tj/k�rjt 0¡ }n|tj1k�ryt 2¡ }||d	< nt d"| ¡ d t3fW S ||fW S d t4fW S  t5�y£ } zt d#| ¡ ‚ d }~ww )$Nr   rÄ   r  r  r  r   r  Ú
ChangeTimeÚFileAttributesr  r  rƒ   Ú	DirectoryÚNumberOfLinksrH   r  ÚBasicInformationÚStandardInformationÚInternalInformationÚEaInformationÚAccessInformationÚPositionInformationÚModeInformationÚAlignmentInformationÚNameInformationr  ÚDeletePendingÚIndexNumberÚAccessFlagsÚCurrentByteOffsetrÙ   ÚAlignmentRequirementÚFileNameLengthz'Unknown level for query path info! 0x%xzqueryPathInfo: %s)6r½   r‡   rˆ   r¾   rÃ   ry   rz   r9   rÉ   rè   rÊ   r   rË   rB  rC  ÚSMB_QUERY_FILE_BASIC_INFOÚSMBQueryFileBasicInfor=   rí   ÚSMB2_FILE_BASIC_INFOÚFILE_BASIC_INFORMATIONÚSMB_QUERY_FILE_STANDARD_INFOÚSMBQueryFileStandardInfoÚSMB2_FILE_STANDARD_INFOÚFILE_STANDARD_INFORMATIONÚSMB_QUERY_FILE_ALL_INFOÚSMBQueryFileAllInfor—   ÚSMB2_FILE_ALL_INFOÚFILE_ALL_INFORMATIONÚFILE_INTERNAL_INFORMATIONÚFILE_EA_INFORMATIONÚFILE_ACCESS_INFORMATIONÚFILE_POSITION_INFORMATIONÚFILE_MODE_INFORMATIONÚFILE_ALIGNMENT_INFORMATIONÚFILE_NAME_INFORMATIONré   rë   ÚSMB_FILE_ATTRIBUTE_ARCHIVEru   ÚSMB2_FILE_NETWORK_OPEN_INFOÚSMBFileNetworkOpenInfoÚSMB_QUERY_FILE_EA_INFOÚSMB2_FILE_EA_INFOÚSMBQueryFileEaInfoÚSMB_QUERY_FILE_STREAM_INFOÚSMB2_FILE_STREAM_INFOÚSMBFileStreamInformationÚSMB2_ATTRIBUTE_TAG_INFOÚFILE_ATTRIBUTE_TAG_INFORMATIONr4   r1   rv   )rˆ   r  r  rØ   rÒ   r×   rÙ   r  r  r	  r
  r  r  r  r  r  rÔ   Ú
infoRecordr€   r@   r@   rA   rP    sà   















€þrP  c                 C   s   d}d}||fS )Néÿÿ  r@   )rˆ   Ú
totalUnitsÚ	freeUnitsr@   r@   rA   ÚqueryDiskInformation‡  s   rˆ  c                   @   s   e Zd Zddd„ZdS )ÚNTTRANSCommandsr   c                 C   s   d S r<   r@   )Úselfr°   r±   Ú
recvPacketÚ
parametersr  ÚmaxDataCountr@   r@   rA   Údefault‘  s   zNTTRANSCommands.defaultN©r   )Ú__name__Ú
__module__Ú__qualname__rŽ  r@   r@   r@   rA   r‰  �  s    r‰  c                   @   s(   e Zd Zeddd„ƒZeddd„ƒZdS )ÚTRANSCommandsr   c                 C   s2  |  | ¡}d}d}d}	t}
t d|d d… ¡d dkr‹t |¡}|d dkrˆt| |ƒ}t ¡ }t|ƒ|d< t|ƒ|d< d	}|D ]C}t 	¡ }|d
dt|ƒ   |d< t
|| d ƒ|d< dt|ƒ t|ƒ |d< |	| ¡ 7 }	d|| v r~||| d d
 7 }q?|d
7 }q?|	|7 }	n…t}
n‚t d|d d… ¡d dkr²t ¡ }t ¡ }| ¡ |d< | ¡ }	t|	ƒ|d< n[t d|d d… ¡d dk�rt |¡}t ¡ }t| |ƒ}||d  ¡  }t 	¡ }|d  ¡ d
 |d< t
|d ƒ|d< | ¡ }	d|v �rt|	ƒ|d< |	|d d
 7 }	t|	ƒ|d< nt}
| | |¡ |||	|
fS )Nó    ú<HrÆ   r   Ú	InfoLevelrƒ   ÚEntriesReturnedÚEntriesAvailablerF   ú é   ÚNetworkNameú
share typeÚTypeé   ÚRemarkOffsetLowÚcommentÚ
ServerNameÚTotalBytesAvailableÚ	ShareName)ÚgetConnectionDatar2   ÚstructÚunpackr   ÚSMBNetShareEnumrµ   ÚSMBNetShareEnumResponseru   ÚNetShareInfo1Úintrò   r4   ÚSMBNetServerGetInfoResponseÚSMBNetServerInfo1ÚgetServerNameÚSMBNetShareGetInfoÚSMBNetShareGetInfoResponseÚupperÚsetConnectionData)r°   r±   r‹  rŒ  r  r�  ÚconnDataÚ	respSetupÚrespParametersÚrespDatarØ   ÚnetShareEnumr³   ÚtailDatar´   rJ  ÚnetServerInfoÚrequestr·   Ú	shareInfor@   r@   rA   ÚlanMan—  s\   







zTRANSCommands.lanManc                 C   sÖ   |  | ¡}d}d}d}	t}
t |d d ¡}t |d ¡}t d|d dd … ¡d }||d v r]|d | d	 }|tkrJt 	||¡ t 
||¡}	n|d | d
 }| |¡ | |¡}	nt}
| | |¡ |||	|
fS )Nr”  ÚDatar   Ú
Parametersr•  ÚSetuprÆ   ÚOpenedFilesÚ
FileHandleÚSocket)r¤  r2   r   Ú
SMBCommandÚSMBTransaction_Parametersr¥  r¦  ÚPIPE_FILE_DESCRIPTORr‡   r‹   ÚreadÚsendÚrecvr-   r±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  rØ   rÂ  ÚtransParametersrÚ   Ú
fileHandleÚsockr@   r@   rA   ÚtransactNamedPipe×  s&   

zTRANSCommands.transactNamedPipeNr�  )r�  r‘  r’  Ústaticmethodr»  rË  r@   r@   r@   rA   r“  –  s
    ?r“  c                   @   sj   e Zd Zeddd„ƒZeddd„ƒZeddd„ƒZeddd	„ƒZedd
d„ƒZedd„ ƒZ	edd„ ƒZ
dS )ÚTRANS2Commandsr   c                 C   sp  |  | ¡}d}d}d}	t}
tj|d |d�}|d |d v rª|d |d  d }tt|d |d ƒ|ƒ}tj ||¡}t	||ƒrJ|j
d|d	� t}
nWtj |¡rŸ|d
 }|tjkr�t |¡}|d }|dkrid}nt |¡}|d }|dkryd}nt |¡}|dks†|dkrŽt |||f¡ n|j
d|d
  tj|d	� t}
nt}
|
tkr©t ¡ }nt}
| | |¡ |||	|
fS )Nr”  ÚFlags2©rK   r  ÚTidÚConnectedSharesrˆ   r  rÄ   ©r²  ÚInformationLevelr  r   r  r  z%Unknown level for set path info! 0x%x)r¤  r2   r   Ú SMBSetPathInformation_Parametersr½   r•   r‡   rˆ   r¾   rÃ   Úlogr9   rÉ   ÚSMB_SET_FILE_BASIC_INFOÚSMBSetFileBasicInforD   ÚutimeÚloggingÚERRORr4   r1   Ú(SMBSetPathInformationResponse_ParametersÚSTATUS_SMB_BAD_TIDr±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  rØ   ÚsetPathInfoParametersrˆ   rÒ   r×   ÚinformationLevelr„  r  r  r@   r@   rA   ÚsetPathInformationú  sN   





€ÿ€z!TRANS2Commands.setPathInformationc                 C   s®  |  | ¡}d}d}d}	t}
t |¡}|d |d v rÉ|d |d v r¾|d |d  d }|d }|tjkrOt |¡}|d d	krNd
|d |d  d< t ¡ }nq|tjkr‚t |¡}|d }|d	krdd}nt 	|¡}|d }|d	krtd}nt 	|¡}t
 |||f¡ n>|tjkr®|d |d  d }t |¡}|d d	kr­t
 ||d d d	¡ t
 |d¡ n|jd|d  tj|d� t}
nt}
|
tkrÈt ¡ }nt}
| | |¡ |||	|
fS )Nr”  rÐ  rÑ  ÚFIDr¿  r  rÓ  r`  r   TÚDeleteOnCloser  r  r  rÀ  r  rƒ   ó    ú%Unknown level for set file info! 0x%xrÒ  )r¤  r2   r   Ú SMBSetFileInformation_ParametersÚSMB_SET_FILE_DISPOSITION_INFOÚSMBSetFileDispositionInfoÚ(SMBSetFileInformationResponse_ParametersrÖ  r×  rD   r‡   rØ  ÚSMB_SET_FILE_END_OF_FILE_INFOÚSMBSetFileEndOfFileInfoÚlseekr‹   rÕ  rÙ  rÚ  r4   r/   rÜ  r±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  rØ   ÚsetFileInfoParametersrÒ   rÞ  r„  r  r  rÉ  r@   r@   rA   ÚsetFileInformation/  sZ   



€





€ÿ€z!TRANS2Commands.setFileInformationc                 C   s°   |  | ¡}d}d}d}	t |¡}
|d |d v rJ|
d |d v rG|d |
d  d }ttj |¡tj |¡|
d ƒ\}}|d urFt ¡ }|}	nt	}nt
}| | |¡ |||	|fS )Nr”  rÐ  rÑ  rà  r¿  r  rÓ  )r¤  r   Ú"SMBQueryFileInformation_ParametersrQ  r‡   rˆ   r)  r(  Ú*SMBQueryFileInformationResponse_Parametersr-   rÜ  r±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  ÚqueryFileInfoParametersr×   r„  rØ   r@   r@   rA   rQ  h  s&   

ÿ€z#TRANS2Commands.queryFileInformationc              
   C   sä   |  | ¡}d}d}d}	d}
tj|d |d�}|d |d v rd|d |d  d }zt|t|d |d ƒ|d	 ƒ\}}
W n tyX } z|jd
| tj|d� W Y d }~nd }~ww |d urct 	¡ }|}	nt
}
| | |¡ |||	|
fS )Nr”  r   rÎ  rÏ  rÐ  rÑ  rˆ   r  rÓ  zqueryPathInformation: %srÒ  )r¤  r   Ú"SMBQueryPathInformation_ParametersrP  r•   rv   rÕ  rÙ  rÚ  Ú*SMBQueryPathInformationResponse_ParametersrÜ  r±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  rØ   ÚqueryPathInfoParametersrˆ   r„  r€   r@   r@   rA   rP  …  s2   
ÿþ"€ÿ€z#TRANS2Commands.queryPathInformationc                 C   sf   |  | ¡}d}|d |d v r't|d |d  d dt d|¡d |d d�}| | |¡ d	d	||fS )
Nr   rÐ  rÑ  rˆ   rF   r•  rÎ  ©r  r”  )r¤  r  r¥  r¦  r±  )r°   r±   r‹  rŒ  r  r�  r²  rØ   r@   r@   rA   r  £  s   
ÿz!TRANS2Commands.queryFsInformationc                 C   s8  |  | ¡}d}d}d}	t}
tj|d |d�}|d }|d |d v rŽ||d v r‹|d | }t ¡ }d}d}d	}t|ƒD ]<}|d  ¡ }t|ƒ}|| |ksX|d	 d |d
 krld	}||d	 d … |d |< ||d<  n|d7 }|	|7 }	||7 }q<|d	kr‚|d |= ||d< ||d
< nt}
nt	}
| 
| |¡ |||	|
fS )Nr”  rÎ  rÏ  ÚSIDrÐ  rÑ  ÚSIDsrƒ   r   ÚSearchCountÚLastNameOffsetÚEndOfSearch)r¤  r2   r   ÚSMBFindNext2_ParametersÚSMBFindNext2Response_ParametersÚ	enumeraterò   ru   r-   rÜ  r±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  rØ   ÚfindNext2ParametersÚsidrK  ÚendOfSearchrL  Ú	totalDatar´   ÚlenDatar@   r@   rA   Ú	findNext2°  sB   
 


zTRANS2Commands.findNext2c                 C   s²  |  | ¡}d}d}d}	tj|d |d�}
|d |d v rË|d |d  d }t|t|d |
d ƒ|
d |
d	 |d d
�\}}}|dkrÄt ¡ }d}d}d}d}t|ƒD ]c}|d  ¡ }t|ƒ}|| |kso|d d |
d kršd}t|d ƒdkr|d}nt	|d  
¡ ƒd d }||d d … |d |< ||d<  n|d7 }|	|7 }	d|d  d }|	d| 7 }	||| 7 }qS||d< ||d< ||d< n	|dkrÊt}nt}| | |¡ |||	|fS )Nr”  rÎ  ©r  rÐ  rÑ  rˆ   r  rÓ  ÚSearchAttributesró  r   rƒ   é€   rö  rõ  r  r÷  r"  ó   ªrô  rø  )r¤  r   ÚSMBFindFirst2_ParametersrO  r•   Ú SMBFindFirst2Response_Parametersrû  rò   ru   ÚlistÚkeysr/   rÜ  r±  )r°   r±   r‹  rŒ  r  r�  r²  r³  r´  rµ  ÚfindFirst2Parametersrˆ   rK  rL  rØ   rþ  rý  rÿ  r´   r   rN  r@   r@   rA   rO  à  s\   
ÿû 
€zTRANS2Commands.findFirst2Nr�  )r�  r‘  r’  rÌ  rß  rì  rQ  rP  r  r  rO  r@   r@   r@   rA   rÍ  ÷  s    48
/rÍ  c                   @   sD  e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZd5S )6ÚSMBCommandsc              
   C   sÄ  |  | ¡}t |d ¡}t |d ¡}|d |d krtdƒ‚tj|d d�}|d }	|	|d< |d	 }
|
|d
< | |d ¡ |d dkr[|d d |d  }|d |||	 … |d< nd|d< |d dkr||d d |d  }|d |||
 … |d< nd|d< |d dkr�t|d |d ƒ}nt 	d|d d d… ¡d }||v �r=d}d}d}z|| | |||d |d |d ƒ\}}}}W n! tyá } z|j
d||f tj|d� t}W Y d }~nd }~ww |dkrô|dkrô|dkrôd}d}�nZt|dƒrý| ¡ }t|ƒ}t|dƒ�r| ¡ }t|ƒ}g }d}|dk�s|dk�r2t |d ¡}t ¡ }t ¡ }t|ƒ|d< t|ƒ|d< t|ƒ|d< t|ƒ|d< ||d< t|ƒ|d k�ret dt|ƒ|d f ¡ |d |d	< nt|ƒ|d	< |d	 |d
< t|ƒ|d< ||d< t|ƒdk�r¡d d!t|ƒ d   d  }d"| }||d#< d!t|ƒ | |d< n
d}d|d< d|d#< t|ƒdk�rÛd d!t|ƒ | t|ƒ d   d  }d"| |d$< d!t|ƒ | t|ƒ | |d< nd|d< d|d$< |d |d … |d< |d |d	 … |d< ||d< ||d< ||d	 d … }||d	 8 }||d	 d% 7 }||d d … }||d 8 }| |¡ |dk�s|dk�s| | |¡ |d |fS |j
d&| tj|d� d}d}t}||d< ||d< | | |¡ |gd |fS )'NÚCommandr½  ÚParameterCountÚTotalParameterCountú,Unsupported partial parameters in TRANSACT2!rÎ  râ   ÚTrans_ParametersLengthÚ	DataCountÚTrans_DataLengthr¼  ÚParameterOffsetr   é?   ÚSetupLengthÚTrans_Parametersr”  Ú
DataOffsetÚ
Trans_DataÚ
SetupCountÚNamer•  r¾  rÆ   ÚMaxDataCountzTransaction: (%r,%s)rÒ  rò   ÚTotalDataCountÚDataDisplacementúLowering answer from %d to %dé   é7   ó   ÿÚPad1ÚPad2rƒ   zUnsupported Transact command %r)r¤  r   rÂ  rÃ  rv   ÚSMBTransaction_SDataÚ
fromStringr•   r¥  r¦  rÕ  rÙ  rÚ  r3   Úhasattrrò   ru   Ú!SMBTransactionResponse_ParametersÚSMBTransaction2Response_Datary   Údebugr*  r±  r,   )r°   r±   rÂ  r‹  ÚtransCommandsr²  ÚrespSMBCommandrÈ  Ú	transDataÚ
paramCountÚ	dataCountÚparamOffsetÚ
dataOffsetÚcommandÚsetuprŒ  r  rØ   r€   r´  rµ  ÚremainingDataÚremainingParametersÚcommandsÚdataDisplacementrN  ÚpadBytesÚpad2Lenr@   r@   rA   ÚsmbTransaction#  sÊ   

û€ý
$"
Ê8
zSMBCommands.smbTransactionc              
   C   sh  |  | ¡}t |d ¡}t |d ¡}|d |d krtdƒ‚t ¡ }|d }	|	|d< |d }
|
|d< |d	 d
krP|d	 d |d  }|d |||	 … |d< nd|d< |d d
krq|d d |d  }|d |||
 … |d< nd|d< |d }||v �rd}d}d}z|| | |||d |d |d ƒ\}}}}W n! ty¼ } z|jd||f tj|d� t	}W Y d }~nd }~ww |dkrÕ|dkrÕ|dkrÕd}d}|t
krÓt	}�nKt|dƒrÞ| ¡ }t|ƒ}t|dƒrë| ¡ }t|ƒ}g }d
}|d
ksü|d
k�rt |d ¡}t ¡ }t ¡ }t|ƒ|d< t|ƒ|d< t|ƒ|d< t|ƒ|d< ||d< t|ƒ|d k�rDt dt|ƒ|d f ¡ |d |d< nt|ƒ|d< |d |d< t|ƒ|d< ||d< t|ƒd
k�r€ddt|ƒ d  d }d| }||d< dt|ƒ | |d	< n
d
}d
|d	< d|d< t|ƒd
k�rºddt|ƒ | t|ƒ d  d }d| |d < dt|ƒ | t|ƒ | |d< nd
|d< d|d < |d |d … |d< |d |d … |d< ||d< ||d< ||d d … }||d 8 }||d d! 7 }||d d … }||d 8 }| |¡ |d
ksü|d
ksü| | |¡ |d |fS d}d}t}||d< ||d< | | |¡ |gd |fS )"Nr  r½  r  r  z*Unsupported partial parameters in NTTrans!ÚNT_Trans_ParametersLengthr  ÚNT_Trans_DataLengthr  r   éI   r  r¼  ÚNT_Trans_Parametersr”  r  ÚNT_Trans_DataÚFunctionr  zNTTransaction: (0x%x,%s)rÒ  rò   r  r  r  r  r  r¾  r  r!  r"  r#  rƒ   )r¤  r   rÂ  ÚSMBNTTransaction_Parametersrv   ÚSMBNTTransaction_DatarÕ  rÙ  rÚ  r3   r2   r&  rò   ru   Ú#SMBNTTransactionResponse_ParametersÚSMBNTTransactionResponse_Datary   r)  r*  r±  r,   )r°   r±   rÂ  r‹  r*  r²  r+  ÚNTTransParametersÚNTTransDatar-  r.  r/  r0  r1  r2  rŒ  r  rØ   r€   r´  rµ  r3  r4  r5  r6  rN  r7  r8  r@   r@   rA   ÚsmbNTTransact³  sÈ   

û€þ€

$"
Ë7
zSMBCommands.smbNTTransactc              
   C   sd  |  | ¡}t |d ¡}t |d ¡}|d |d krtdƒ‚t ¡ }|d }	|	|d< |d }
|
|d< |d	 d
krP|d	 d |d  }|d |||	 … |d< nd|d< |d d
krq|d d |d  }|d |||
 … |d< nd|d< t d|d ¡d
 }||v �rz|| | |||d |d |d ƒ\}}}}W n tyµ } z|jd||f t	j
|d� ‚ d }~ww |dkrÈ|dkrÈ|dkrÈd}d}�nVt|dƒrÑ| ¡ }t|ƒ}t|dƒrÞ| ¡ }t|ƒ}g }d
}|d
ksï|d
k�rt |d ¡}t ¡ }t ¡ }t|ƒ|d< t|ƒ|d< t|ƒ|d< t|ƒ|d< ||d< t|ƒ|d k�r7t dt|ƒ|d f ¡ |d |d< nt|ƒ|d< |d |d< t|ƒ|d< ||d< t|ƒd
k�rsddt|ƒ d  d }d| }||d< dt|ƒ | |d	< n
d
}d
|d	< d|d< t|ƒd
k�r­ddt|ƒ | t|ƒ d  d }d| |d < dt|ƒ | t|ƒ | |d< nd
|d< d|d < |d |d … |d< |d |d … |d< ||d< ||d< ||d d … }||d 8 }||d d! 7 }||d d … }||d 8 }| |¡ |d
ksï|d
ksï| | |¡ |d |fS |jd"| t	j
|d� d}d}t}||d< ||d< | | |¡ |gd |fS )#Nr  r½  r  r  r  r  r  r  r  r   r  r  r¼  r  r”  r  r  r•  r¾  r  zTransaction2: (0x%x,%s)rÒ  rò   r  r  r  r  r  r   r!  r"  r#  rƒ   z#Unsupported Transact/2 command 0x%x)r¤  r   rÂ  ÚSMBTransaction2_Parametersrv   ÚSMBTransaction2_Datar¥  r¦  rÕ  rÙ  rÚ  r&  rò   ru   Ú"SMBTransaction2Response_Parametersr(  ry   r)  r*  r±  r,   )r°   r±   rÂ  r‹  r*  r²  r+  Útrans2ParametersÚ
trans2Datar-  r.  r/  r0  r1  r2  rŒ  r  rØ   r€   r´  rµ  r3  r4  r5  r6  rN  r7  r8  r@   r@   rA   ÚsmbTransaction2=  s¾   

û€ü

$"
Ë7
zSMBCommands.smbTransaction2c           	      C   sL   |  | ¡}t tjj¡}d}d}t}||d< ||d< | | |¡ |gd |fS )Nr”  r½  r¼  )r¤  r   rÂ  r‘   ÚSMB_COM_LOCKING_ANDXr2   r±  ©	r°   r±   rÂ  r‹  r²  r+  r´  rµ  rØ   r@   r@   rA   ÚsmbComLockingAndXÅ  s   
zSMBCommands.smbComLockingAndXc              
   C   sÈ  |  | ¡}t tjj¡}d}d}t |d ¡}|d |d v rÆ|d |d  d dk}	|d |d v rÃt}
|d |d  d	 }z|tkrQ|d |d  d
  ¡  n	|t	krZt
 |¡ W n tyz } z|jd| tj|d� t}
W Y d }~nRd }~ww |d |d  d du r»|	rŒt}
n/zt
 |d |d  d ¡ W n tyº } z|jd| tj|d� t}
W Y d }~nd }~ww |d |d = nt}
nt}
|
dkrÐd}d}||d< ||d< | | |¡ |gd |
fS )Nr”  r½  rÐ  rÑ  ú	read onlyÚyesrà  r¿  rÀ  rÁ  zcomClose %srÒ  rá  Tr  r   r¼  )r¤  r   rÂ  r‘   ÚSMB_COM_CLOSEÚSMBClose_Parametersr2   rÄ  ÚcloseÚVOID_FILE_DESCRIPTORr‡   rv   rÕ  rÙ  rÚ  r3   Úremover-   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomCloserÖ   rØ   rÉ  r€   r@   r@   rA   ÚsmbComCloseÖ  sR   

€€þ€þzSMBCommands.smbComClosec              
   C   s˜  |  | ¡}t tjj¡}t ¡ }d}t |d ¡}t |d ¡}	|d |d v r®|d |d v r«|d |d  d }
|d |d  d	 }|jd
| t	j
|d� t}z:|
tkrst |
dd¡|d krrt |
|d d¡ t |
|	d ¡ n|d |d  d }| |	d ¡ |d |d< W n$ tyª } z|jd
| t	j|d� t}W Y d }~n
d }~ww t}nt}|dkr¸d}d}||d< ||d< | | |¡ |gd |fS )Nr”  r½  r¼  rÐ  rÑ  ÚFidr¿  rÀ  r  zsmbComWrite: %srÒ  r   rÆ   ÚOffsetrÁ  ÚCount)r¤  r   rÂ  r‘   ÚSMB_COM_WRITEÚSMBWriteResponse_ParametersÚSMBWrite_ParametersÚSMBWrite_DatarÕ  rÙ  ÚINFOr2   rÄ  r‡   rê  r‹   rÆ  rv   rÚ  r3   r-   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomWriteParametersÚcomWriteDatarÉ  rÒ   rØ   rÊ  r€   r@   r@   rA   ÚsmbComWrite	  sF   
€€þzSMBCommands.smbComWritec              
   C   sö   |  | ¡}t tjj¡}d}d}t |d ¡}|d |d v r]|d |d v rZt}	|d |d  d }
zt |
¡ W n$ t	yY } z|j
d| tj|d	� t}	W Y d }~n
d }~ww t}	nt}	|	d
krgd}d}||d< ||d< | | |¡ |gd |	fS )Nr”  r½  rÐ  rÑ  rà  r¿  rÀ  zcomFlush %srÒ  r   r¼  )r¤  r   rÂ  r‘   ÚSMB_COM_FLUSHÚSMBFlush_Parametersr2   r‡   Úfsyncrv   rÕ  rÙ  rÚ  r3   r-   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomFlushrØ   rÉ  r€   r@   r@   rA   ÚsmbComFlush8  s2   
€þzSMBCommands.smbComFlushc              
   C   sx  |  | ¡}t tjj¡}d}d}tj|d |d d�}|d |d v rž|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 ƒƒ}t	j
 ||¡}|jd| tj|d� t||ƒsi|jdtj|d� t}
n7t	j
 |¡rrt}
n.|	rwt}
n)zt	 |¡ W n! ty� } z|jd| tj|d� t}
W Y d }~nd }~ww t}
|
dkr¨d}d}||d< ||d< | | |¡ |gd |
fS )Nr”  rÎ  r¼  rÏ  rÐ  rÑ  rP  rQ  rˆ   ÚDirectoryNamezsmbComCreateDirectory: %srÒ  rÄ   r   r½  )r¤  r   rÂ  r‘   ÚSMB_COM_CREATE_DIRECTORYÚSMBCreateDirectory_Datar2   r½   r•   r‡   rˆ   r¾   rÕ  rÙ  r`  rÃ   rÚ  r9   rÉ   r.   r3   Úmkdirrv   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomCreateDirectoryDatarÖ   rØ   rˆ   rÒ   r×   r€   r@   r@   rA   ÚsmbComCreateDirectory[  sD   

€þz!SMBCommands.smbComCreateDirectoryc              
   C   s¬  |  | ¡}t tjj¡}d}d}tj|d |d d�}|d |d v r¸|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 ƒƒ}t	j
 ||¡}tt|d |d ƒƒ}t	j
 ||¡}|jd||f tj|d� t||ƒrvt||ƒs‚|jdtj|d� t}
n8t	j
 |¡s‹t}
n/|	r�t}
n*zt	 ||¡ W n! ty· } z|jd| tj|d� t}
W Y d }~nd }~ww t}
|
dkrÂd}d}||d< ||d< | | |¡ |gd |
fS )Nr”  rÎ  r¼  rÏ  rÐ  rÑ  rP  rQ  rˆ   ÚOldFileNameÚNewFileNamezsmbComRename: %s to %srÒ  rÄ   zsmbComRename: %sr   r½  )r¤  r   rÂ  r‘   ÚSMB_COM_RENAMEÚSMBRename_Datar2   r½   r•   r‡   rˆ   r¾   rÕ  rÙ  r`  rÃ   rÚ  r9   rÉ   r/   r3   ÚrenameÚOSErrorrÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomRenameDatarÖ   rØ   rˆ   ÚoldFileNameÚoldPathNameÚnewFileNameÚnewPathNamer€   r@   r@   rA   ÚsmbComRename‰  sH   
€þzSMBCommands.smbComRenamec              
   C   sx  |  | ¡}t tjj¡}d}d}tj|d |d d�}|d |d v rž|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 ƒƒ}|j	d| t
j|d� tj ||¡}t||ƒsi|j	dt
j|d� t}
n7tj |¡srt}
n.|	rwt}
n)zt |¡ W n! ty� } z|j	d| t
j|d� t}
W Y d }~nd }~ww t}
|
dkr¨d}d}||d< ||d< | | |¡ |gd |
fS )Nr”  rÎ  r¼  rÏ  rÐ  rÑ  rP  rQ  rˆ   r  zsmbComDelete: %srÒ  rÄ   r   r½  )r¤  r   rÂ  r‘   ÚSMB_COM_DELETEÚSMBDelete_Datar2   r½   r•   rÕ  rÙ  r`  r‡   rˆ   r¾   rÃ   rÚ  r9   rÉ   r/   r3   rV  rt  rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomDeleteDatarÖ   rØ   rˆ   rÒ   r×   r€   r@   r@   rA   ÚsmbComDelete¸  sD   

€þzSMBCommands.smbComDeletec              
   C   st  |  | ¡}t tjj¡}d}d}tj|d |d d�}|d |d v rœ|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 ƒƒ}t	j
 ||¡}t||ƒs^|jdtj|d� t}
n@t	j
 |¡sgt}
n7|	rlt}
n2zt	 |¡ W n* ty› } z|jd| tj|d� |jtjkr�t}
nt}
W Y d }~nd }~ww t}
|
dkr¦d}d}||d< ||d< | | |¡ |gd |
fS )Nr”  rÎ  r¼  rÏ  rÐ  rÑ  rP  rQ  rˆ   ri  rÄ   rÒ  zsmbComDeleteDirectory: %sr   r½  )r¤  r   rÂ  r‘   ÚSMB_COM_DELETE_DIRECTORYÚSMBDeleteDirectory_Datar2   r½   r•   r‡   rˆ   r¾   rÃ   rÕ  rÙ  rÚ  r9   rÉ   r/   r3   Úrmdirrt  ÚerrnoÚ	ENOTEMPTYr*   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomDeleteDirectoryDatarÖ   rØ   rˆ   rÒ   r×   r€   r@   r@   rA   ÚsmbComDeleteDirectoryè  sF   

€ûz!SMBCommands.smbComDeleteDirectoryc              
   C   sþ  |  | ¡}t tjj¡}t ¡ }d}|d dkr$t |d ¡}t ¡ }	nt |d ¡}t 	¡ }	|d |	d< |d |	d< |	 
|d ¡ |d |d	 v rá|d
 |d v rÞ|d |d
  d }
|d |d
  d }|jd| tj|d� t}zK|
tkr¢|d }d|jv r‰||d d> 7 }t |
dd¡|kr¡t |
|d¡ t |
|	d ¡ n|d |d
  d }| |	d ¡ |d |d< d|d< W n$ tyÝ } z|jd| tj|d� t}W Y d }~n
d }~ww t}nt}|dkrëd}d}||d< ||d< | | |¡ |gd |fS )Nr”  Ú	WordCounté   r½  Ú
DataLengthr  r¼  rÐ  rÑ  rY  r¿  rÀ  r  zsmbComWriteAndX: %srÒ  rZ  Ú
HighOffsetro   r   rÆ   rÁ  r[  rÝ   Ú	AvailablezsmbComWriteAndx: %s)r¤  r   rÂ  r‘   ÚSMB_COM_WRITE_ANDXÚSMBWriteAndXResponse_ParametersÚSMBWriteAndX_Parameters_ShortÚSMBWriteAndX_Data_ShortÚSMBWriteAndX_ParametersÚSMBWriteAndX_Datar%  rÕ  rÙ  ÚDEBUGr2   rÄ  Úfieldsr‡   rê  r‹   rÆ  rv   rÚ  r3   r-   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  Ú	writeAndXÚwriteAndXDatarÉ  rÒ   rØ   ÚoffsetrÊ  r€   r@   r@   rA   ÚsmbComWriteAndX  sZ   


€€þzSMBCommands.smbComWriteAndXc              
   C   sŒ  |  | ¡}t tjj¡}t ¡ }t ¡ }t |d ¡}|d |d v r¨|d |d v r¥|d |d  d }	|d |d  d }
|jd|
 t	j
|d	� t}z9|	tkrct |	|d
 d¡ t |	|d ¡}n|d |d  d }| |d ¡}t|ƒ|d< t|ƒ|d< ||d< W n$ ty¤ } z|jd| t	j|d	� t}W Y d }~n
d }~ww t}nt}|dkr²d}d}||d< ||d< | | |¡ |gd |fS )Nr½  rÐ  rÑ  rY  r¿  rÀ  r  zsmbComRead: %srÒ  rZ  r   r[  rÁ  rˆ  r¼  zsmbComRead: %s r”  )r¤  r   rÂ  r‘   ÚSMB_COM_READÚSMBReadResponse_ParametersÚSMBReadResponse_DataÚSMBRead_ParametersrÕ  rÙ  r‘  r2   rÄ  r‡   rê  rÅ  rÇ  ru   rv   rÚ  r3   r-   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚcomReadParametersrÉ  rÒ   rØ   ÚcontentrÊ  r€   r@   r@   rA   Ú
smbComReadQ  sD   
€þzSMBCommands.smbComReadc              
   C   sÊ  |  | ¡}t tjj¡}t ¡ }d}|d dkr t |d ¡}nt |d ¡}|d |d v rÇ|d |d v rÄ|d |d  d	 }	|d |d  d
 }
|jd|
 t	j
|d� d}zL|	tkr~|d }d|jv rn||d d> 7 }t |	|d¡ t |	|d ¡}n|d |d  d }| |d ¡}d|d< t|ƒ|d< d|d< d|d< |}W n$ tyÃ } z|jd| t	j|d� t}W Y d }~n
d }~ww t}nt}|dkrÑd}d}||d< ||d< | | |¡ |gd |fS )Nr”  r†  é
   r½  rÐ  rÑ  rY  r¿  rÀ  r  zsmbComReadAndX: %srÒ  r   rZ  r‰  ro   ÚMaxCountrÁ  r…  Ú	Remainingr  é;   r  ÚDataCount_HizsmbComReadAndX: %s r¼  )r¤  r   rÂ  r‘   ÚSMB_COM_READ_ANDXÚSMBReadAndXResponse_ParametersÚSMBReadAndX_Parameters2ÚSMBReadAndX_ParametersrÕ  rÙ  r‘  rÄ  r’  r‡   rê  rÅ  rÇ  ru   rv   rÚ  r3   r-   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚreadAndXrÉ  rÒ   rØ   r•  rœ  rÊ  r€   r@   r@   rA   ÚsmbComReadAndX  sR   

€þzSMBCommands.smbComReadAndXc                 C   s  |  | ¡}t tjj¡}t ¡ }d}tj|d |d d�}|d |d v rq|d |d  d }	tt|d |d ƒƒ}
|j	d	|
 t
j|d
� t|	|
ƒsV|j	dt
j|d
� t}nt|	|
|d d�\}}}||d< ||d< ||d< t}nt}|dkr{d}d}||d< ||d< | | |¡ |gd |fS )Nr”  rÎ  r¼  rÏ  rÐ  rÑ  rˆ   r  zsmbQueryInformation: %srÒ  rÄ   ró  ÚFileSizer  rT  r   r½  )r¤  r   rÂ  r‘   ÚSMB_COM_QUERY_INFORMATIONÚ&SMBQueryInformationResponse_ParametersÚSMBQueryInformation_Datar½   r•   rÕ  rÙ  r‘  rÃ   rÚ  r9   r  r2   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚqueryInformationrˆ   rÒ   rØ   r  r  rÔ   r@   r@   rA   ÚsmbQueryInformation´  s2   

zSMBCommands.smbQueryInformationc                 C   s²   |  | ¡}t tjj¡}t ¡ }d}|d |d v r;t|d |d  d ƒ\}}	||d< d|d< d|d< |	|d	< t}
nt}
|
d
krEd}d}||d< ||d< | 	| |¡ |gd |
fS )Nr”  rÐ  rÑ  rˆ   Ú
TotalUnitsrƒ   ÚBlocksPerUnitÚ	BlockSizeÚ	FreeUnitsr   r½  r¼  )
r¤  r   rÂ  r‘   ÚSMB_COM_QUERY_INFORMATION_DISKÚ*SMBQueryInformationDiskResponse_Parametersrˆ  r2   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  r†  r‡  rØ   r@   r@   rA   ÚsmbQueryInformationDiskÛ  s*   
ÿz#SMBCommands.smbQueryInformationDiskc           
      C   sv   |  | ¡}t tjj¡}t ¡ }t ¡ }t |d ¡}d|d< |d |d< ||d< ||d< t}	| 	| |¡ |gd |	fS )Nr¼  rƒ   ÚSequenceNumberr½  )
r¤  r   rÂ  r‘   ÚSMB_COM_ECHOÚSMBEchoResponse_ParametersÚSMBEchoResponse_DataÚSMBEcho_Datar2   r±  )
r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚechoDatarØ   r@   r@   rA   Ú
smbComEchoú  s   
zSMBCommands.smbComEchoc           	      C   sš   |  | ¡}t tjj¡}d}d}|d |d v r7|jd|d |d |d  d f |d� |d |d = t}nt}||d< ||d< | | |¡ |gd |fS )	Nr”  rÐ  rÑ  úDisconnecting Share(%d:%s)Ú	shareNamerÒ  r½  r¼  )	r¤  r   rÂ  r‘   ÚSMB_COM_TREE_DISCONNECTrÕ  r2   rÜ  r±  rN  r@   r@   rA   ÚsmbComTreeDisconnect  s"   
ÿÿz SMBCommands.smbComTreeDisconnectc           	      C   sr   |  | ¡}t tjj¡}d}d}|d |d krt}nt}||d< ||d< d|d< d|d< | | |¡ |gd |fS )Nr”  ÚUidr½  r¼  r   FÚAuthenticated)r¤  r   rÂ  r‘   ÚSMB_COM_LOGOFF_ANDXÚSTATUS_SMB_BAD_UIDr2   r±  rN  r@   r@   rA   ÚsmbComLogOffAndX&  s   
zSMBCommands.smbComLogOffAndXc              
   C   s–  |  | ¡}t tjj¡}t ¡ }d}t |d ¡}d}	|d |d v r­|d |d v r¬t}	|d |d  d }
zUt 	|
¡\
}}}}}}}}}}t
|ƒ|d	< t|ƒ|d
< t
|ƒ|d< t|ƒ|d< t
|ƒ|d< t|ƒ|d< ||d< ||d< d}tj |
¡r~tj}tj |
¡r‡tj}||d< W n" ty« } z|jd| tj|d� t}	W Y d }~nd }~ww nt}	|	dkr·d}d}||d< ||d< | | |¡ |gd |	fS )Nr”  r½  rÝ   rÐ  rÑ  rY  r¿  r  Ú
CreateDater  r%  r  r&  r  ÚFileDataSizeÚFileAllocationSizer   rT  zsmbComQueryInformation2 %srÒ  r¼  )r¤  r   rÂ  r‘   ÚSMB_COM_QUERY_INFORMATION2Ú'SMBQueryInformation2Response_ParametersÚSMBQueryInformation2_Parametersr2   r‡   rè   r£   r©   rˆ   rÊ   ré   rê   rë   rv   rÕ  rÙ  rÚ  r3   rÜ  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚqueryInformation2rØ   r×   rÙ   r  r  r	  r
  r  r  r  r  r  r  r€   r@   r@   rA   ÚsmbComQueryInformation2=  sP   
€þíz#SMBCommands.smbComQueryInformation2c              
   C   sl  |  | ¡}t tjj¡}t ¡ }d}t |d ¡}tj|d |d d�}	|d |d v �r?|d |d  d d	k}
t}|d
 dkrS|d |d
  d }t	 
d| ¡ nd|d |d  v rh|d |d  d }nd}t}d}tt|d |	d ƒƒ}t||ƒs‘t	 d¡ d|d< d|d< |gd tfS tj ||¡}|d }d}|tjkr¬|tjtjB O }np|tj@ tjkr½|tjtjB O }n_|tj@ tjkrÖtj |¡du rÓ|tjO }nIt}nF|tj@ tjkrä|tjO }n8|tj@ tjkrýtj |¡du r÷t}n%|tjO }n|tj@ tjk�rtj |¡du�rt|ƒ|  ¡ v du�rt}|tk�r>|d }|tj!@ �s1|tj"@ �r6|tj#O }|tj$@ �sB|tj%@ �rY|tj!@ �sN|tj"@ �rT|tj&O }n|tj'O }|tj(@ �rd|tj&O }|d }|tj@ tjk�r°|tj)@ tj)k�r«|
�s«z
t *|¡ tj#}W n( t+�yª } z|j,d|||f t-j.|d� t}W Y d }~n
d }~ww |
�r°t}|tj/@ tj/k�rÄtj 0|¡du �rÄt1}|tj2@ tj2k�rÏd}|tk�r>zDtj 0|¡�råt3j4dk�råt5}n2t3j4dk�rð|tj6O }t|ƒ|  ¡ v �rt7}t8 8¡ }| 9|  ¡ t|ƒ ¡ n|
�rtj#}t :||¡}W n( t+�y= } z|j,d|||f t-j.|d� d}t}W Y d }~nd }~ww nt;}|tk�rt<|d ƒdk�rRd}nt=|d  >¡ ƒd d }||d< ||d< |t7k�r”d|d< d|d < d|d!< d|d"< d|d#< d|d$< d%|d&< d|d'< d(|d)< d*|d+< nYtj 0|¡�r¥tj?|d< d|d < n
d|d < |d |d< t@||tjAd,�\}}|tk�ré|d- |d!< |d" |d"< |d# |d#< |d$ |d$< |d. |d< |d& |d&< |d' |d'< nd}d}|tk�ri |d |< ||d | d/< ||d | d< ||d | d0< |t7k�r||d | d1< nd}d}||d< ||d< | B| |¡ |gd |fS )2Nr”  r½  rÎ  r¼  rÏ  rÐ  rÑ  rP  rQ  ÚRootFidr   r¿  r  zRootFid present %s!rˆ   ÚNONEFrÄ   ÚDispositionTÚ
AccessMaskÚCreateOptionszNTCreateAndX: %s,%s,%srÒ  rÇ   rƒ   r  rY  ÚCreateActionr  rT  ÚIsDirectoryÚ
CreateTimer  r  r   é   r  r  rÆ   ÚFileTypeiÿ  ÚIPCState©r  r  r  rÀ  rá  rÁ  )Cr¤  r   rÂ  r‘   ÚSMB_COM_NT_CREATE_ANDXÚ"SMBNtCreateAndXResponse_ParametersÚSMBNtCreateAndX_ParametersÚSMBNtCreateAndX_Datar2   ry   r)  r3   r½   r•   rÃ   rz   r9   r‡   rˆ   r¾   ÚFILE_SUPERSEDEÚO_TRUNCrÈ   ÚFILE_OVERWRITE_IFÚFILE_OVERWRITErÉ   r/   ÚFILE_OPEN_IFÚFILE_CREATEr.   Ú	FILE_OPENÚstrÚgetRegisteredNamedPipesÚFILE_READ_DATAÚGENERIC_READrÎ   ÚFILE_WRITE_DATAÚGENERIC_WRITErÍ   rÌ   ÚGENERIC_ALLÚFILE_DIRECTORY_FILErl  rv   rÕ  rÙ  rÚ  ÚFILE_NON_DIRECTORY_FILErÊ   r+   ÚFILE_DELETE_ON_CLOSErÏ   rÐ   rU  rÑ   rÄ  ÚsocketÚconnectrŠ   rÜ  ru   r  r	  ré   rP  rn  r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚntCreateAndXParametersÚntCreateAndXDatarÖ   rØ   rˆ   ÚdeleteOnCloserÒ   r×   ÚcreateDispositionrÙ   ÚdesiredAccessÚcreateOptionsr€   rÚ   rÊ  ÚfakefidÚrespInfor@   r@   rA   ÚsmbComNtCreateAndXm  s  



ÿ





€þ

€€ü€







€zSMBCommands.smbComNtCreateAndXc                 C   s¾  |  | ¡}t tjj¡}t ¡ }d}t |d ¡}tj|d |d d�}	|d |d v r]|d |d  d }
|d |d  d	 d
k}t|
t	|d |	d ƒ|d |d |d |ƒ\}}}}nt
}|tkrÇt|d ƒd }t|d ƒdkrvd}nt|d  ¡ ƒd d }||d< |tj@ r�d|d< n|tj@ ršd|d< n|tj@ r¤d|d< nd|d< i |d |< ||d | d< ||d | d< d|d | d< nd}d}||d< ||d< | | |¡ |gd |fS )Nr”  r½  rÎ  r¼  rÏ  rÐ  rÑ  rˆ   rP  rQ  r  ÚDesiredAccessrT  ÚOpenModer¿  rƒ   r   r  rY  rÆ   ÚActioné   rÀ  Frá  )r¤  r   rÂ  r‘   ÚSMB_COM_OPEN_ANDXÚSMBOpenAndXResponse_ParametersÚSMBOpenAndX_ParametersÚSMBOpenAndX_DatarÛ   r•   rÜ  r2   ru   r  r	  r‡   rÈ   rÎ   ÚO_APPENDr±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚopenAndXParametersÚopenAndXDatarˆ   rÖ   Ú
openedFilerÙ   r×   rØ   rÚ   r@   r@   rA   ÚsmbComOpenAndX"	  sR   
ÿû





zSMBCommands.smbComOpenAndXc                 C   sP  |  | ¡}t ¡ }tjj|d< tjjtjjB tjjB |d tjj@ B |d< |d |d< |d |d< |d |d< t 	tjj
¡}t ¡ }t ¡ }t |d ¡}	|	d d@ rWt ¡ }tj|d d	�}
|	d
 |
d< |
 |d ¡ t}t|d |
d ƒ}t |¡r„| d¡d }nt |¡}t| ||ƒ}|d ur½t|d ƒdkržd}nt|d  ¡ ƒd d }||d |< ||d | d< ||d< n|jd| tj|d� t}|d? |d< |d@ |d< tjj|d< |dkråd|d< n||d< d|d< t |d d ƒ !¡ |d!< ||d< ||d< |d" |d"< | "|¡ |d# �r| #|||d$ |d% ¡ | $| |¡ d |g|fS )&NÚFlags1rÎ  rÐ  ÚMidÚPidr½  ÚFlagsr"  râ   ÚPasswordLengthÚ_PasswordLengthr¼  ÚPathr¹   rý  rÑ  r   rƒ   r  r¾  zTreeConnectAndX not found %srÒ  rI   Ú	ErrorCoderÝ   Ú
ErrorClassÚOptionalSupportúIPC$ÚIPCÚServiceÚPadLenÚNTFSÚNativeFileSystemrÁ  ÚSignatureEnabledÚSigningSessionKeyÚSigningChallengeResponse)%r¤  r   ÚNewSMBPacketr‘   ÚFLAGS1_REPLYÚFLAGS2_EXTENDED_SECURITYÚFLAGS2_NT_STATUSÚFLAGS2_LONG_NAMESr’   rÂ  ÚSMB_COM_TREE_CONNECT_ANDXÚ%SMBTreeConnectAndXResponse_ParametersÚSMBTreeConnectAndXResponse_DataÚSMBTreeConnectAndX_ParametersÚ-SMBTreeConnectAndXExtendedResponse_ParametersÚSMBTreeConnectAndX_Datar%  r2   r•   ÚntpathÚismountÚsplitr(  r¸   ru   r  r	  rÕ  rÙ  rÚ  r)   ÚSMB_SUPPORT_SEARCH_BITSr˜   rP   Ú
addCommandÚ	signSMBv1r±  )r°   r±   rÂ  r‹  r²  Úrespr+  r´  rµ  ÚtreeConnectAndXParametersÚtreeConnectAndXDatarØ   Ú
UNCOrSharerˆ   r·   Útidr@   r@   rA   ÚsmbComTreeConnectAndX_	  sb   
ÿ





z!SMBCommands.smbComTreeConnectAndXc              
   C   s`  |j | dd�}t tjj¡}|d dk�r}t ¡ }tj|d d�}t |d ¡}t ¡ }	|d |	d< |	 	|d	 ¡ |d
 |d
< d}
t
 d|	d dd… ¡d tkrÀt|	d ƒ}|d }t|d d ƒdkr¿|d d }|td kr¿|tv rzt| }nt|ƒ}|jd| tj|d� d}t|ƒ|d< |d |d< ||d< t|d | ¡ ƒ|d< t|d | ¡ ƒ|d< ||d< ||d	< |gd tfS n!t
 d|	d dd… ¡d tkrÛt|	d ƒ}|d }nd}
|	d }t
 d|tdƒtdƒd … ¡d }|dk�rt ¡ }| 	|¡ ||d< d}|d tj@ �r|tjO }|d tj@ �r!|tjO }|d tj@ �r.|tjO }|d tj@ �r;|tjO }|d tj @ �rH|tj O }|d tj!@ �rU|tj!O }|tj"tj#B tj$B tj%B tj&B O }t '¡ }| (¡  )d¡ |tj*< |tj+< | ,¡  )d¡ |tj-< |tj.< t
 /dd t0 1t2 3¡ ¡d!  ¡|tj4< t 5¡ }|j6�r§tj7dB n||d< t| ,¡  )d¡ƒ|d"< |d" |d#< d$|d%< | 8¡ |d&< | ,¡  )d¡|d'< t|ƒ|d(< t|ƒ|d)< ||d*< d$t|d' ƒ |d+< d,|d-< d.|d/< |
du �r
tƒ }d0|d1< td |d2< | 9¡ |d< n|}t}d3|d4< ||d5< �nR|d6k�r!t:d7ƒ‚|d8k�rdt ;¡ }| 	|¡ | d9|d'  <d¡|d:  <d¡|d;  <d¡f ¡ t| =¡ ƒdk�r‘|d:  <d¡ >¡ }|| =¡ v �rŽ| =¡ | \}}}t?|||| 8¡ ||d5 |d ƒ\}}|d u�r�d|d<< ||d=< d|d>< nt@}ntA}|tAk�rd|d?< tƒ }d@|d1< | dA|d;  <d¡|d:  <d¡f ¡ ||dB< |d'  <d¡dCk�rË|d'  <d¡n|d;  <d¡|dD< |d:  <d¡|d:< z0| B¡ }tC|d5 d& |d: |d' |dE |dF ƒ}| |dG ¡ |dCk�rtD|dG |dH |ƒ W n   | dI| ¡ Y ntƒ }dJ|d1< |jdK|d� |jEd u�rcz|jE|||d'  <d¡|d:  <d¡|d;  <d¡dL� W n  t:�yb } ztFdM| ƒ W Y d }~nd }~ww nt:dN| ƒ‚t|ƒ|d< |d |d< | 9¡ |d< n…t G¡ }t H¡ }t I|d ¡}t J¡ }	|dO |	dO< |dP |	dP< |	 	|d	 ¡ |d
 |d
< tA}d3|d4< d|d?< d|dQ< | dR|	dS |	dT f ¡ z0| B¡ }tCdUtK|	dT ƒtK|	dS ƒ|	dV |	dW ƒ}| |dG ¡ |dCk�rótD|dG |dH |ƒ W n   |jdI| |d� Y t|d | ¡ ƒ|d< t|d | ¡ ƒ|d< ||d< ||d	< d|d?< | L| |¡ |gd |fS )XNF©ÚcheckStatusr†  r‡  rÎ  râ   r½  ÚSecurityBlobLengthr¼  ÚCapabilitiesÚBÚSecurityBlobr   rƒ   Ú	MechTokenr   ú2NTLMSSP - Microsoft NTLM Security Support ProviderúUnsupported MechType '%s'rÒ  s   ¡0 
¡
+‚7
ÚNativeOSÚNativeLanManÚResponseTokenTú<LúNTLMSSP r  ÚNEGOTIATE_MESSAGErK   rH   ú<qì     }*{Gíé€–˜ Ú
domain_lenÚdomain_max_lené8   Údomain_offsetrM   rG   ÚTargetInfoFields_lenÚTargetInfoFields_max_lenÚTargetInfoFieldsÚTargetInfoFields_offsetó   ÿÿÿÿÿÿÿÿÚVersionr"  Ú
VersionLenó   ÚNegStateÚSupportedMechrž  rÁ  ÚCHALLENGE_MESSAGErÆ   ú)Challenge Message raise, not implemented!rý  úAUTHENTICATE_MESSAGE (%s\%s,%s)Ú	user_nameÚ	host_namer  r  ÚSignSequenceNumberrÂ  râ  ú%User %s\%s authenticated successfullyÚAUTHENTICATE_MESSAGErF   Úuser_domain_namerJ   r   rq   rr   ú=Could not write NTLM Hashes to the specified JTR_Dump_Path %só   úCould not authenticate user!©r±   r²  rG   rT  rU  ú$[!] Could not call auth_callback: %súUnknown NTLMSSP MessageType %dÚAnsiPwdLengthÚUnicodePwdLengthrü  z-User %s\%s authenticated successfully (basic)ÚPrimaryDomainÚAccountr”  ÚAnsiPwdÚ
UnicodePwd)Mr¤  r   rÂ  r‘   ÚSMB_COM_SESSION_SETUP_ANDXÚ0SMBSessionSetupAndX_Extended_Response_ParametersÚ*SMBSessionSetupAndX_Extended_Response_DataÚ'SMBSessionSetupAndX_Extended_ParametersÚ!SMBSessionSetupAndX_Extended_Datar%  r¥  r¦  r   r   ru   r   r   r   rÕ  rÙ  r‘  r˜   ÚgetServerOSr(   r   r   r   ÚNTLMAuthNegotiateÚNTLMSSP_NEGOTIATE_56rT   rU   rS   ÚNTLMSSP_NEGOTIATE_UNICODEÚNTLM_NEGOTIATE_OEMÚNTLMSSP_NEGOTIATE_VERSIONÚNTLMSSP_NEGOTIATE_TARGET_INFOÚNTLMSSP_TARGET_TYPE_SERVERÚNTLMSSP_NEGOTIATE_NTLMÚNTLMSSP_REQUEST_TARGETÚAV_PAIRSr­  r—   ÚNTLMSSP_AV_HOSTNAMEÚNTLMSSP_AV_DNS_HOSTNAMEÚgetServerDomainÚNTLMSSP_AV_DOMAINNAMEÚNTLMSSP_AV_DNS_DOMAINNAMEr    ÚcalendarÚtimegmÚtimeÚgmtimeÚNTLMSSP_AV_TIMEÚNTLMAuthChallengeÚ_SMBSERVER__dropSSPÚNTLMSSP_DROP_SSP_STATICÚgetSMBChallengerò   rv   ÚNTLMAuthChallengeResponserP   ÚgetCredentialsr-  rm   r8   r2   ÚgetJTRdumpPathr�   r�   Úauth_callbackÚprintÚ&SMBSessionSetupAndXResponse_ParametersÚ SMBSessionSetupAndXResponse_DataÚSMBSessionSetupAndX_ParametersÚSMBSessionSetupAndX_Datar	   r±  )r°   r±   rÂ  r‹  r²  r+  r´  rµ  ÚsessionSetupParametersÚsessionSetupDataÚrawNTLMÚblobÚtokenÚmechTypeÚmechStrÚ	respTokenÚmessageTypeÚnegotiateMessageÚansFlagsÚav_pairsÚchallengeMessagerØ   r_   r[   r
  r\   r]   Ú
sessionKeyÚjtr_dump_pathÚntlm_hash_datar€   r@   r@   rA   ÚsmbComSessionSetupAndX«	  sŒ   
€ 
$







"ÿÿÿÿ
ÿ



ýþ
€
ÿÿÿ4ý
ÿ€
û€ÿ÷ÿþ
€z"SMBCommands.smbComSessionSetupAndXc              
   C   s¾  |j | dd�}|d |d< t |d d ¡}t tjj¡}t ¡ }tjj|d< |d |d< |d |d< |d |d< |d  d	¡}zç| d
¡d }|d tjj	@ r‘tjj	tjj
B tjjB |d< t ¡ }	d|	d< tƒ }
td g|
d< |
 ¡ |	d< t ¡ }tjjtjjB tjjB tjjB |d< d|d< n;tjj
tjjB |d< t ¡ }t ¡ }	d|	d< d|v rº|d |	d< t|	 ¡ ƒ|d< nd|	d< d|d< tjjtjjB |d< | ¡ }| dd¡rè| dd¡du rè|d  tjjO  < ||d< tjjtjjB |d< d|d< d|d < d!|d"< d#|d$< d|d%< d|d&< d|d'< d|d(< |	|d< ||d)< |	|d*< ||d+< W n& t�yM } z|jd,| t j!|d-� t" #d.d/¡|d< W Y d }~nd }~ww | $| |¡ | %|¡ d |gt&fS )0NFr1  r	  r¼  r   r  rÐ  r  r[  s   NT LM 0.12 rƒ   rÎ  ó   AAAAAAAAAAAAAAAAÚ
ServerGUIDr8  r   r6  r4  ÚChallengeLengthrF   ÚPayloadÚEncryptionKeyÚ	Challenges   "3DUfwˆr"  rª   Úrpc_apisTÚDialectIndexÚSecurityModeÚMaxMpxCountÚMaxNumberVcsi ú  ÚMaxBufferSizeé   Ú
MaxRawSizeÚ
SessionKeyÚLowDateTimeÚHighDateTimeÚServerTimeZoner½  Ú_dialects_dataÚ_dialects_parameterszsmbComNegotiate: %srÒ  r•  r…  )'r¤  r   rÂ  r‘   ÚSMB_COM_NEGOTIATEr  r  r'  r­   r  r  r’   ÚSMBExtended_Security_Datar   r   rò   ÚSMBExtended_Security_ParametersÚCAP_EXTENDED_SECURITYÚCAP_USE_NT_ERRORSÚCAP_NT_SMBSÚCAP_UNICODEÚSMBNTLMDialect_ParametersÚSMBNTLMDialect_Dataru   r«   Ú
has_optionÚ
getbooleanÚCAP_RPC_REMOTE_APISÚSECURITY_AUTH_ENCRYPTEDÚSECURITY_SHARE_USERrv   rÕ  rÙ  rÚ  r¥  r    r±  r)  r2   )r°   r±   rÂ  r‹  r²  r+  r+  Údialectsr­   r°  r�  r±  r²   r€   r@   r@   rA   ÚsmbComNegotiate®
  sz   ÿÿ
€ý
zSMBCommands.smbComNegotiatec                 C   s¢   |  d|d  tj¡ t ¡ }tjj|d< tjj|d< |d |d< |d |d< |d |d< |d |d< |d |d< d	|d
< t}|d? |d< |d@ |d< d |g|fS )NúNot implemented command: 0x%xr  r  rÎ  r	  rÐ  r  rÁ  s      r¼  rI   r  rÝ   r  )	rÕ  rÙ  r‘  r   r  r‘   r  r  r,   )r°   r±   rÂ  r‹  ÚpacketrØ   r@   r@   rA   rŽ  ÿ
  s   zSMBCommands.defaultN)r�  r‘  r’  rÌ  r9  rF  rL  rO  rX  rc  rh  rn  rz  r~  r…  r–  r�  r¨  r®  rµ  r¼  rÀ  rÅ  rÍ  rù  r  r0  r�  rÁ  rŽ  r@   r@   r@   rA   r  !  sv    
 
 

 

2
.
"
-
.
/
.
9
-
4
&




/
 5
<
K
  
Pr  c                   @   s  e Zd Zed/dd„ƒZedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZed*d+„ ƒZed,d-„ ƒZd.S )0ÚSMB2CommandsFc                 C   sÀ  |j | dd�}t ¡ }tj|d< t|d< d|d< tj|d< d|d	< |du r,|d
 |d
< nd|d
< d|d< t ¡ }d|d< |du rbt |d d ¡}|d  	d¡}d|v sXd|v r^tj
|d< n	tdƒ‚tj
|d< d|d< d|d< d|d< d|d< d|d< t t t ¡ ¡¡|d< t t t ¡ ¡¡|d< d|d< tƒ }	g }
| ¡ r³| ¡ d r³|
td  td! td" g7 }
| ¡ r¾|
td# g7 }
|
|	d$< |	 ¡ |d%< t|d% ƒ|d&< ||d< | | |¡ d |gtfS )'NFr1  r
  ÚStatusrƒ   ÚCreditRequestResponser  r   Ú	SessionIDÚ	MessageIDÚTreeIDr¦  Tr¼  r[  s
   SMB 2.002 s
   SMB 2.??? ÚDialectRevisionzSMB2 not supported, fallbackingrž  Ú
ServerGuidr4  rª  ÚMaxTransactSizeÚMaxReadSizeÚMaxWriteSizeÚ
SystemTimeÚServerStartTimer  ÚSecurityBufferOffsetr{   úMS KRB5 - Microsoft Kerberos 5úKRB5 - Kerberos 5ú KRB5 - Kerberos 5 - User to Userr8  r   ÚBufferÚSecurityBufferLength)r¤  rí   Ú
SMB2PacketÚSMB2_FLAGS_SERVER_TO_REDIRr2   ÚSMB2_NEGOTIATEÚSMB2Negotiate_Responser   rÂ  r'  ÚSMB2_DIALECT_002rv   r=   r{  r|  r}  r~  r   ÚgetKerberosSupportÚgetComputerAccountCredentialsr   ÚgetNTLMSupportrò   ru   r±  )r°   r±   r‹  ÚisSMB1r²  Ú
respPacketr+  rÂ  rÀ  r�  Úsupported_mechtypesr@   r@   rA   Úsmb2Negotiate  sP   


zSMB2Commands.smb2Negotiatec                 C   s>  �zqt j| tƒ d�d }|d }|d d d }tt|d d d ƒ }| ¡ }t|d |d	 |d
 |d |d d�}z||d d d  }	W n% tyl   t 	d|d d d d 
dd„ | ¡ D ƒ¡¡ d tf Y W S w z	| |	d|¡}
W n ty‰   t 	d¡ d tf Y W S w t j|
tƒ d�d }t|d d t|d d ƒƒ}tt|d d ƒ }| |d|d d ¡}t j|tƒ d�d }|d  ¡  ¡ |d< |d d d  ¡  ¡ |d< t|d d |d d  ¡ ƒ}tƒ }d|d < tjjj|d!< |d d |d d< tƒ }|d"  ¡ |d"< |d#  ¡ |d#< |j|d d< |j|d d< | |d$t |¡d ¡|d d< t |¡}t ƒ }t!d% |d&< d'|d(< ||d)< | "¡ }t# $¡ }d*|d+< t%|ƒ|d,< ||d-< d.|d/< |jd d0… |d1< d2|d3< |t&fW S    t ƒ }t!d% |d&< d'|d(< | "¡ }t# $¡ }d*|d+< t%|ƒ|d,< ||d-< |t&f Y S )4N)Úasn1Specr   ÚapReqÚticketzenc-partÚcipherÚetyper]   ÚaesÚpasswordr{   r|   )Úrc4rè  ré  Úuserr|   zoCould not find the correct encryption key! Ticket is encrypted with keytype %d, but keytype(s) %s were suppliedz, c                 S   s   g | ]}t |ƒ‘qS r@   )rå  )Ú.0Úenctyper@   r@   rA   Ú
<listcomp>c  s    z/SMB2Commands._kerberos_auth.<locals>.<listcomp>rÆ   zUCiphertext integrity failed. Most likely the account password or AES key is incorrectÚkeyÚkeytypeÚkeyvalueÚauthenticatoré   ÚcrealmrY  Úcnamezname-stringrT  Úsubkeyé   Úpvnozmsg-typer  Úcusecr‡  rÒ  rP  râ  rO  r<  éH   rÑ  rÖ  rÕ  Tr  rI   r  rƒ   rV  )'r   rP   r   r!   rª  rÝ  r#   ÚKeyErrorry   rz   r¾   r	  r8   Údecryptr"   r   r    rt   r   ÚasOctetsr   r   ÚKerberosMessageTypesÚ
KRB_AP_REPÚvaluer   ÚprettyPrintÚcontentsrí  Úencryptr   r—   r   r   rò   rí   ÚSMB2SessionSetup_Responseru   r2   )r‘  r²  r±   r�  Úap_reqÚ
cipherTextÚ	newCipherÚcomputerAccountCredentialsÚekeysrï  Ú	plainTextÚencTicketPartrš  ÚencApReqAuthenticatorÚApRepAuthenticatorÚencryption_keyÚap_repÚencAPRepÚ
aprepBytesÚacceptÚacceptBytesr+  r@   r@   rA   Ú_kerberos_authO  s€   &þü
þ

zSMB2Commands._kerberos_authc              
   C   s„  t  d| tdƒtdƒd … ¡d }t ¡ }|dk�rjt ¡ }| | ¡ ||d< d}|d tj@ r6|tjO }|d tj	@ rB|tj	O }|d tj
@ rN|tj
O }|d tj@ rZ|tjO }|d tj@ rf|tjO }|d tj@ rr|tjO }|d tj@ r~|tjO }|tjtjB tjB tjB tjB O }|jr—tjdB }t ¡ }d| ¡ v r½| ¡  d¡d  ¡  d	¡|tj< | ¡  d	¡|tj< n| ¡  ¡  d	¡ |tj< |tj< | ¡  ¡  d	¡ |tj< |tj< t   d
dt! "t# $¡ ¡d  ¡|tj%< t &¡ }	||	d< t| ¡  d	¡ƒ|	d< |	d |	d< d|	d< | '¡ |	d< | ¡  d	¡|	d< t|ƒ|	d< t|ƒ|	d< ||	d< dt|	d ƒ |	d< d|	d< d|	d< |du �rXt(ƒ }
d|
d< t)d |
d< |	 *¡ |
d < n|	}
t+}t, -dd!¡|d"< |	|d#< �nÄ|d$k�rst.d%ƒ‚|d&k�r(t /¡ }| | ¡ | 0d'|d  1d	¡|d(  1d	¡|d)  1d	¡f ¡ d}d}| 2¡ }|d(  1d	¡d*k�rôt| 3¡ ƒdk�rô|d(  1d	¡ 4¡ }t5}|| 3¡ v �ró| 3¡ | \}}}t6|||| '¡ ||d# |d ƒ\}}|d u�ród+|d,< ||d-< d|d.< nO|d/ d*k�r%t7|d0 |d/ |d1 |d2 ƒ}| 8¡  | 9|| '¡ ¡\}}d+|d,< ||d-< d|d.< nd|d,< |d tj:@ �r?d+}|j;dk�r<t<}nt=}nd+}t=}|t=k�ràd+|d3< t(ƒ }
d4|
d< |�rZt >¡ }
| 0d5|d)  1d	¡|d(  1d	¡f ¡ ||d6< |d  1d	¡d*k�r‚|d  1d	¡n|d)  1d	¡|d7< |d(  1d	¡|d(< z0| ?¡ }t@|d# d |d( |d |d8 |d9 ƒ}| 0|d: ¡ |d*k�rÃtA|d: |d; |ƒ W n   | 0d<| ¡ Y |�rØd|d=< n|�rßd$|d=< nt(ƒ }
d>|
d< | 0d?¡ |jBd u�r'z|jB|||d  1d	¡|d(  1d	¡|d)  1d	¡d@� W n  t.�y& } ztCdA| ƒ W Y d }~nd }~ww nt.dB| ƒ‚dC|dD< t|
ƒ|dE< |
 *¡ |dF< ||fS )GNr=  r>  r  r   rƒ   r?  rK   r  rH   r@  rA  rB  rC  rD  rE  rF  rM   rG   rG  rH  rI  rJ  rK  rL  r"  rM  FrN  rO  r8  rP  r<  rL   rÁ  rQ  rÆ   rR  rý  rS  rT  rU  rF   Tr  r  rV  r{   Údcipr]   r|   rÂ  râ  rW  rX  rY  rJ   r   rq   rr   rZ  ÚSessionFlagsr[  r\  r]  r^  r_  rú  rÑ  rÖ  rÕ  )Dr¥  r¦  ru   rí   r  r   rl  r%  rm  rT   rU   rS   rn  ro  rW   rp  rq  rr  rs  rt  r�  r‚  ru  rx  r'  r°  r—   ry  rz  r­  rv  rw  r    r{  r|  r}  r~  r  r€  rƒ  r   r   rò   r(   ÚrandomÚrandintrv   r„  rÕ  rP   rÝ  r…  r-  r8   rm   ÚNetLogonÚsetupConnectionÚlogonUserAndGetSessionKeyÚNTLMSSP_NEGOTIATE_ANONYMOUSÚ_SMBSERVER__anonymousLogonr3   r2   ÚEmptyr†  r�   r�   r‡  rˆ  )r‘  r²  r±   r�  r•  r+  r–  r—  r˜  r™  r”  rØ   r_   ÚisGuestÚ
isAnonymusr  r[   r
  r\   r]   rš  Únetlogonr›  rœ  r€   r@   r@   rA   Ú
_ntlm_auth§  s0  $








"
"""
ÿ



ý&þ
€

þ4ý
ÿ€
€

û€ÿ÷zSMB2Commands._ntlm_authc                  C   sJ   t ƒ } td | d< d| d< |  ¡ }t ¡ }d|d< t|ƒ|d< ||d< |S )	Nr8  rP  ó   rO  rú  rÑ  rÖ  rÕ  )r   r   rò   rí   r  ru   )r  r  r+  r@   r@   rA   Úgeneric_negTokenRespp  s   z!SMB2Commands.generic_negTokenRespc                 C   s4  |j | dd�}t |d ¡}|d |d< |d }d}d }t d|dd… ¡d tkr‹t|ƒ}|d	 }	t|d
 d ƒdkrŠ|d
 d }g }
| ¡ r[| 	¡ d r[|
t
d t
d t
d g7 }
| ¡ rf|
t
d g7 }
||
vrŠ|tv rst| }nt|ƒ}|jd| tj|d� t ¡ gd tfS nWt d|dd… ¡d tkr¿t|ƒ}|d }	d|	v r®| ¡ r®t
d }n4| ¡ r·t
d }n+t ¡ gd tfS | d¡rÑ| ¡ rÑd}|}	t
d }n|jdtj|d� t ¡ gd tfS |t
d t
d t
d fv rùt |	||¡\}}n|t
d k�r
t |	|||¡\}}d|d< | | |¡ |gd |fS )NFr1  r¼  r4  rÕ  r5  r   rƒ   r7  r   r{   rÒ  rÓ  rÔ  r8  r9  rÒ  r<  s   NTLMSSP Tz)Unknown or unsupported security blob typerÂ  )r¤  rí   ÚSMB2SessionSetupr¥  r¦  r   r   ru   rÜ  rÝ  r   rÞ  r   r   rÕ  rÙ  r‘  rÄ  r$  r(   r   r   Ú
startswithrÚ  r  r"  r±  )r°   r±   r‹  r²  rŽ  ÚsecurityBlobr�  ÚauthTyper�  r‘  rá  r“  r+  rØ   r@   r@   rA   Úsmb2SessionSetup~  sX   
€


zSMB2Commands.smb2SessionSetupc                 C   s  |  | ¡}t ¡ }tj|d< t|d< d|d< |d |d< |d |d< |d |d< |d	 |d	< |d
 |d
< t ¡ }t |d ¡}t}| ¡ |d d … d |d … }| d¡}	|j	d|	 t
j|d� t |	¡rn|	 d¡d }nt |	¡}t| | ¡ |ƒ}
|
d ur´t|d ƒdkrŠd}nt|d  ¡ ƒd d }|
|d |< ||d | d< ||d
< |j	d||f |d� n|j	d| t
j|d� t}||d< | ¡ dkrÕtj|d< d|d< n	tj|d< d|d< d|d< d|d< ||d< |d  rö| ||d! ¡ | | |¡ d |g|fS )"Nr
  rÅ  rƒ   rÆ  r  rÁ  rÇ  ÚReservedrÈ  rÉ  r¼  Ú
PathOffsetÚ
PathLengthrH   zsmb2TreeConnect: %srÒ  r¹   rý  rÑ  r   r  r¾  zConnecting Share(%d:%s)zSMB2_TREE_CONNECT not found %sr  Ú	ShareTypeé0   Ú
ShareFlagsr4  iÿ ÚMaximalAccessr  r  )r¤  rí   r×  rØ  r2   ÚSMB2TreeConnect_ResponseÚSMB2TreeConnectrò   rP   rÕ  rÙ  r`  r%  r&  r'  r(  r¸   r°  ru   r  r	  rÚ  r)   ÚSMB2_SHARE_TYPE_PIPEÚSMB2_SHARE_TYPE_DISKÚ	signSMBv2r±  )r°   r±   r‹  r²  rà  r+  ÚtreeConnectRequestrØ   rˆ   r.  r·   r/  r@   r@   rA   Úsmb2TreeConnectÁ  sV   

 





zSMB2Commands.smb2TreeConnectc              
   C   s  |  | ¡}t ¡ }t |d ¡}d|d< |d |d v �r|d |d  d dk}t}d|d |d  v r@|d |d  d }nd	}t}d
}	t|d d |d …  d¡ƒ}
|jd|
 t	j
|d� t||
ƒsrt d¡ t ¡ gd tfS tj ||
¡}|d }d}|tjkr�|tjtjB O }nm|tj@ tjkrž|tjtjB O }n\|tj@ tjkr·tj |¡du r´|tjO }nFt}nC|tj@ tjkrÅ|tjO }n5|tj@ tjkrÞtj |¡du rØt}n"|tjO }n|tj@ tjkrútj |¡durút|ƒ| ¡ v durút}|tk�r|d }|tj @ �s|tj!@ �r|tj"O }|tj#@ �s |tj$@ �r7|tj @ �s,|tj!@ �r2|tj%O }n|tj&O }|tj'@ �rB|tj%O }|d }|tj@ tjk�rŽ|tj(@ tj(k�r‰|�s‰z
t )|¡ tj"}W n( t*�yˆ } z|jd|||f t	j+|d� t}W Y d }~n
d }~ww |�rŽt}|tj,@ tj,k�r¢tj -|¡du �r¢t.}|tj/@ tj/k�r­d}	|tk�rzDtj -|¡�rÃt0j1dk�rÃt2}n2t0j1dk�rÎ|tj3O }t4|ƒ| ¡ v �rét5}t6 6¡ }| 7| ¡ t4|ƒ ¡ n|�rïtj"}t 8||¡}W n( t*�y } z|jd|||f t	j+|d� d}t}W Y d }~nd }~ww nt9}|tk�rët: ;¡ }||d< ||d< |t5k�rRd|d< d|d< d|d< d|d< d|d< d|d< d |d!< nLtj -|¡�r_t<j=|d!< n|d! |d!< t>||
t<j?d"�\}}|tk�rž|d |d< |d |d< |d |d< |d# |d#< |d$ |d!< |d |d< |d |d< |tk�rêi |d% |< ||d% | d&< ||d% | d'< |	|d% | d(< i |d% | d)< d|d% | d) d*< d+|d% | d) d,< |t5k�rê||d% | d-< nt ¡ }|tk�rú||d. d/< | @| |¡ |gd |fS )0Nr¼  râ  rÕ  rÉ  rÑ  rP  rQ  rˆ   rÏ  FÚ
NameLengthrH   zsmb2Create: %srÒ  rÄ   ÚCreateDispositionr   Trú  rÒ  zSMB2_CREATE: %s,%s,%srÇ   ÚFileIDrÓ  r  r  r  rS  rÖ  r  r  r  rT  rÙ  r   r  r¿  rÀ  r  rá  ÚOpenÚEnumerationLocationrF   ÚEnumerationSearchPatternrÁ  ÚLastRequestÚSMB2_CREATE)Ar¤  rí   ÚSMB2Create_ResponseÚ
SMB2Creater2   r3   r½   rP   rÕ  rÙ  r`  rÃ   ry   rz   Ú	SMB2Errorr9   r‡   rˆ   r¾   rÞ  rß  rÈ   rà  rá  rÉ   r/   râ  rã  r.   rä  rå  ræ  rç  rè  rÎ   ré  rê  rÍ   rÌ   rë  rì  rl  rv   rÚ  rí  rÊ   r+   rî  rÏ   rÐ   rU  rÑ   r
   rÄ  rï  rð  rŠ   rÜ  r   Úgenerater   ré   rP  rn  r±  )r°   r±   r‹  r²  r+  ÚntCreateRequestrÖ   rØ   rˆ   ró  rÒ   r×   rô  rÙ   rõ  rö  r€   rÚ   rÊ  r÷  rø  r@   r@   rA   Ú
smb2Create  s  



ÿ





€þ

€€ü€





€
zSMB2Commands.smb2Createc              
   C   sª  |  | ¡}t ¡ }t |d ¡}|d  ¡ dkr.d|d v r'|d d d }n|d  ¡ }n|d  ¡ }|d |d v �rG|d |d  d d	k}||d
 v �rDt}|d
 | d }	|d
 | d }
|jd|
 tj|d� d }z+|	t	kr|d
 | d  
¡  n|	tkr™t 
|	¡ ttj |
¡tj |
¡tjƒ\}}W n ty¹ } z|jd| tj|d� t}W Y d }~n”d }~ww |d
 | d du �r
|rÊt}n@ztj |
¡rÝt |d
 | d ¡ nt |d
 | d ¡ W n  t�y	 } z|jd| tj|d� t}W Y d }~nd }~ww |d u�r9|d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |tk�rC|d
 |= nt}nt}| | |¡ |gd |fS )Nr¼  r:  ó   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿr?  r>  rÉ  rÑ  rP  rQ  r¿  rÀ  r  zsmb2Close: %srÒ  rÁ  zSMB2_CLOSE %srá  Tr  r  r  rS  r  r  Ú	EndofFilerT  )r¤  rí   ÚSMB2Close_ResponseÚ	SMB2Closerò   r2   rÕ  rÙ  r`  rÄ  rT  rU  r‡   rQ  rˆ   r)  r(  rz  rv   rÚ  r-   r3   rÊ   ÚshutilÚrmtreerV  rÜ  r±  )r°   r±   r‹  r²  r+  ÚcloseRequestÚfileIDrÖ   rØ   rÉ  r×   r„  r€   r@   r@   rA   Ú	smb2Close¨  st   

ÿ€€þ€€þ


€zSMB2Commands.smb2Closec           
      C   sÈ  |  | ¡}t ¡ }t |d ¡}t}d|d< d|d< |d  ¡ dkr8d|d	 v r1|d	 d d }n|d  ¡ }n|d  ¡ }|d
 |d v rÖ||d v rÓ|d | d }|jd| tj|d� |d tj	kr‰|d tj
krvt ¡ }	||	d< nNttj |¡tj |¡|d ƒ\}	}n;|d tjkr«|d tjkršd}	n*ttj |¡tj |¡|d ƒ}	n|d tjkr·d }	t}n|jd|d  tj|d� |	d urÒt|	ƒ|d< |	|d< nt}nt}| | |¡ |gd |fS )Nr¼  rú  ÚOutputBufferOffsetrâ  rÕ  r:  rF  r?  r>  rÉ  rÑ  r¿  r  zsmb2QueryInfo: %srÒ  ÚInfoTypeÚFileInfoClassra  s       zqueryInfo not supported (%x)ÚOutputBufferLength)r¤  rí   ÚSMB2QueryInfo_ResponseÚSMB2QueryInfor2   rò   rÕ  rÙ  r`  ÚSMB2_0_INFO_FILEÚSMB2_FILE_INTERNAL_INFOrr  rQ  r‡   rˆ   r)  r(  ÚSMB2_0_INFO_FILESYSTEMr}  r  ÚSMB2_0_INFO_SECURITYr3   rÚ  ru   r-   rÜ  r±  )
r°   r±   r‹  r²  r+  Ú	queryInforØ   rM  rÒ   r„  r@   r@   rA   Úsmb2QueryInfoî  sR   



þÿ€zSMB2Commands.smb2QueryInfoc              
   C   sš  |  | ¡}t ¡ }t |d ¡}t}|d  ¡ dkr0d|d v r)|d d d }n|d  ¡ }n|d  ¡ }|d |d v �r¿|d |d  d }|d |d  d	 d
k}	||d v �r¼|d | d }
|jd|
 tj|d� |d tj	k�r®|d }|tj
kr¦t |d ¡}|d dkr¤tj |
¡rœt |
¡rœt}�n%d|d | d< �n|tjkrãt |d ¡}|d }|dkr½d}nt |¡}|d }|dkrÍd}nt |¡}|dkrâ|dkrât |
||f¡ nÞ|tjk�r|d | d }t |d ¡}|d dk�rt ||d d d¡ t |d¡ n°|tjk�r’t |d ¡}t|d  d¡ƒ}tj ||¡}t||ƒ�sE|jdtj |d� t !¡ gd t"fS |d dk�r[tj #|¡�r[t !¡ gd t$fS |	�rat%}n`zt &|
|¡ ||d | d< W nO t'�y‘ } z|jd| tj |d� t%}W Y d }~n4d }~ww |tj(k�r | d ¡ t}n!|jd!| tj |d� t)}n|jd"|d  tj |d� nt*}nt+}| ,| |¡ |gd |fS )#Nr¼  r:  rF  r?  r>  rÉ  rÑ  rˆ   rP  rQ  r¿  r  zsmb2SetInfo: %srÒ  rP  rQ  rÕ  r`  r   Trá  r  r  rS  rÀ  r  rƒ   râ  rH   rÄ   ÚReplaceIfExistsz2Warning: SMB2_FILE_ALLOCATION_INFO not implementedrã  zsetInfo not supported (%x))-r¤  rí   ÚSMB2SetInfo_ResponseÚSMB2SetInfor2   rò   rÕ  rÙ  r`  rU  ÚSMB2_FILE_DISPOSITION_INFOr   ræ  r‡   rˆ   rÊ   r+  r*   rh  r×  rD   rØ  ÚSMB2_FILE_END_OF_FILE_INFOré  rê  r‹   ÚSMB2_FILE_RENAME_INFOÚFILE_RENAME_INFORMATION_TYPE_2r½   rP   r¾   rÃ   rÚ  rB  r9   rÉ   r.   r3   rs  rv   ÚSMB2_FILE_ALLOCATION_INFOr4   r-   rÜ  r±  )r°   r±   r‹  r²  r+  ÚsetInforØ   rM  rˆ   rÖ   r×   rÞ  r„  r  r  rÉ  Ú
renameInforx  ry  r€   r@   r@   rA   Úsmb2SetInfo+  s’   

€


€€€þ
zSMB2Commands.smb2SetInfoc              
   C   s   |  | ¡}t ¡ }t |d ¡}d|d< |d  ¡ dkr2d|d v r+|d d d }n|d  ¡ }n|d  ¡ }|d |d	 v rÂ||d
 v r¿|d
 | d }|d
 | d }|jd| tj|d� t}	z<|t	kr…|d }
t
 |dd¡|
kr„t
 ||
d¡ t
 ||d ¡ n|d
 | d }| |d ¡ |d |d< d|d< W n$ ty¾ } z|jd| tj|d� t}	W Y d }~n
d }~ww t}	nt}	| | |¡ |gd |	fS )Nr¼  râ  rÕ  r:  rF  r?  r>  rÉ  rÑ  r¿  rÀ  r  zsmb2Write: %srÒ  rZ  r   rÆ   rÁ  ÚLengthr[  rÝ   r   zSMB2_WRITE: %s)r¤  rí   ÚSMB2Write_ResponseÚ	SMB2Writerò   rÕ  rÙ  r`  r2   rÄ  r‡   rê  r‹   rÆ  rv   rÚ  r3   r-   rÜ  r±  )r°   r±   r‹  r²  r+  ÚwriteRequestrM  rÉ  rÒ   rØ   r•  rÊ  r€   r@   r@   rA   Ú	smb2Write—  sF   
€€þzSMB2Commands.smb2Writec              
   C   s®  |  | ¡}t ¡ }t |d ¡}d|d< |d  ¡ dkr2d|d v r+|d d d }n|d  ¡ }n|d  ¡ }|d |d	 v rÉ||d
 v rÆ|d
 | d }|d
 | d }|jd| tj|d� d}	zC|tkr||d }
t	 
||
d¡ t	 ||d ¡}n|d
 | d }| |d ¡}d|d< t|ƒ|d< d|d< ||d< t|ƒdkr¥t}	W n$ tyÅ } z|jd| tj|d� t}	W Y d }~n
d }~ww t}	nt}	| | |¡ |gd |	fS )Nr¼  râ  rÕ  r:  rF  r?  r>  rÉ  rÑ  r¿  rÀ  r  zsmb2Read: %srÒ  r   rZ  rf  rÁ  éP   r  rˆ  ÚDataRemainingzSMB2_READ: %s )r¤  rí   ÚSMB2Read_ResponseÚSMB2Readrò   rÕ  rÙ  r`  rÄ  r‡   rê  rÅ  rÇ  ru   r:   rv   rÚ  r3   r-   rÜ  r±  )r°   r±   r‹  r²  r+  ÚreadRequestrM  rÉ  rÒ   rØ   r•  rœ  rÊ  r€   r@   r@   rA   Úsmb2ReadÈ  sL   
€€þzSMB2Commands.smb2Readc              
   C   sò   |  | ¡}t ¡ }t |d ¡}|d |d v rk|d  ¡ }||d v rh|d | d }|d | d }|jd| tj|d	� t}	zt	 
|¡ W n$ tyg }
 z|jd
|
 tj|d	� t}	W Y d }
~
n
d }
~
ww t}	nt}	| | |¡ |gd |	fS )Nr¼  rÉ  rÑ  r:  r¿  rÀ  r  zsmb2Flush: %srÒ  zSMB2_FLUSH %s)r¤  rí   ÚSMB2Flush_ResponseÚ	SMB2Flushrò   rÕ  rÙ  r`  r2   r‡   rf  rv   rÚ  r3   r-   rÜ  r±  )r°   r±   r‹  r²  r+  ÚflushRequestrM  rÉ  rÒ   rØ   r€   r@   r@   rA   Ú	smb2Flushû  s*   
€þzSMB2Commands.smb2Flushc              	   C   sÀ  |  | ¡}t ¡ }t |d ¡}d|d< |d |d v du r&t ¡ gd tfS |d  ¡ dkrDd	|d
 v r=|d
 d	 d }n|d  ¡ }n|d  ¡ }||d v du rZt ¡ gd tfS |d | d }|jd| t	j
|d� tj |d | d ¡du rƒt ¡ gd tfS |d tjtjtjtjtjtjfvr�t ¡ gd tfS |d tj@ r¸d|d | d d< d|d | d d< |d tj@ rÉd|d | d d< |d  d¡}|d | d d dkrø|d | d d dkrø|dkrîd}||d | d d< |d tj@ �r|d dk�r||d | d d< tj tj |d | d ¡|¡}	ttj |	¡tj |	¡|d tj dd�\}
}}|t!k�rFt ¡ gd |fS |dk�rZ|dk�rZ|d8 }|
dd … }
|dk�rt|d | d d dk�rtt ¡ gd t"fS |d | d d dk �r‰t ¡ gd t#fS d}d}t$|d | d d |ƒD ]–}|d | d d  d7  < |d tj%@ �r¸d|
| d< |
|  ¡ }t&|ƒ}d|d  d }z)|
|d   ¡ }t&|ƒ}|| | | }||d  k�ròd|
| d< |
|  ¡ }W n
 t'�yý   Y nw || |d  k�r|d | d d  d8  <  n||d|  7 }||| 7 }|d tj%@ �r/ n�qš|d | d d |k�rHd!|d | d d< d"|d#< ||d < ||d< | (| |¡ |gd |fS )$Nr¼  râ  rÕ  rÉ  rÑ  Fr:  rF  r?  r>  r¿  r  zsmb2QueryDirectory: %srÒ  ÚFileInformationClassr
  r   r;  r<  rF   r=  rH   r  re  T)rE  rÆ   r”  rƒ   r#  r"  rR  r  rú  rO  ))r¤  rí   ÚSMB2QueryDirectory_ResponseÚSMB2QueryDirectoryrB  r%   rò   r'   rÕ  rÙ  r`  r‡   rˆ   rÊ   r&   ÚFILE_DIRECTORY_INFORMATIONÚFILE_FULL_DIRECTORY_INFORMATIONÚ!FILEID_FULL_DIRECTORY_INFORMATIONÚFILE_BOTH_DIRECTORY_INFORMATIONÚ!FILEID_BOTH_DIRECTORY_INFORMATIONÚFILENAMES_INFORMATIONr7   ÚSMB2_REOPENÚSMB2_RESTART_SCANSrP   ÚSMB2_INDEX_SPECIFIEDr¾   r»   rO  r)  r(  r   rË   r2   r/   r$   ÚrangeÚSL_RETURN_SINGLE_ENTRYru   Ú
IndexErrorr±  )r°   r±   r‹  r²  r+  ÚqueryDirectoryRequestrM  rÒ   rG  r×   rK  rL  rØ   rÿ  rµ  ÚnItemr  r   rN  ÚnextDataÚlenNextDataÚnextTotalDatar@   r@   rA   Úsmb2QueryDirectory  s°   
ü"
ý
$€ÿÿzSMB2Commands.smb2QueryDirectoryc                 C   ó   t  ¡ gd tfS r<   )rí   rB  r4   ©r°   r±   r‹  r@   r@   rA   Úsmb2ChangeNotify¤  ó   zSMB2Commands.smb2ChangeNotifyc                 C   s   t  ¡ }|gd tfS r<   )rí   ÚSMB2Echo_Responser2   )r°   r±   r‹  r+  r@   r@   rA   Úsmb2Echo©  s   zSMB2Commands.smb2Echoc                 C   s|   |  | ¡}t ¡ }|d |d v r0|jd|d |d |d  d f |d� |d |d = t}nt}| | |¡ |gd |fS )NrÉ  rÑ  r½  r¾  rÒ  )r¤  rí   ÚSMB2TreeDisconnect_ResponserÕ  r2   rÜ  r±  ©r°   r±   r‹  r²  r+  rØ   r@   r@   rA   Úsmb2TreeDisconnect°  s   
ÿÿzSMB2Commands.smb2TreeDisconnectc                 C   sT   |  | ¡}t ¡ }|d |d krt}nt}d|d< d|d< | | |¡ |gd |fS )NrÇ  rÁ  r   FrÂ  )r¤  rí   ÚSMB2Logoff_ResponserÄ  r2   r±  r‘  r@   r@   rA   Ú
smb2LogoffÂ  s   
zSMB2Commands.smb2Logoffc           	      C   sæ   |  | ¡}t ¡ }t |d ¡}| ¡ }|d |v rT||d  | ||ƒ\}}|tkrQ|d |d< |d |d< d|d< d|d< d|d< t|ƒ|d	< d|d
< ||d< n|}n|jd|d  tj	|d� t
}t ¡ }| | |¡ |gd |fS )Nr¼  ÚCtlCoder:  r   ÚInputOffsetÚ
InputCountép   ÚOutputOffsetÚOutputCountr
  rÕ  z#Ioctl not implemented command: 0x%xrÒ  )r¤  rí   ÚSMB2Ioctl_ResponseÚ	SMB2IoctlÚ	getIoctlsr2   ru   rÕ  rÙ  r‘  r5   rB  r±  )	r°   r±   r‹  r²  r+  ÚioctlRequestÚioctlsÚ
outputDatarØ   r@   r@   rA   Ú	smb2IoctlÔ  s*   

zSMB2Commands.smb2Ioctlc                 C   s.   |  | ¡}t ¡ }t}| | |¡ |gd |fS r<   )r¤  rí   ÚSMB2Lock_Responser2   r±  r‘  r@   r@   rA   Úsmb2Lockñ  s
   
zSMB2Commands.smb2Lockc                 C   rŠ  r<   )rí   rB  r0   r‹  r@   r@   rA   Ú
smb2Cancelý  r�  zSMB2Commands.smb2Cancelc                 C   s&   |  d|d  tj¡ t ¡ gd tfS )NrÂ  r  )rÕ  rÙ  r‘  rí   rB  r4   r‹  r@   r@   rA   rŽ    s   zSMB2Commands.defaultN©F)r�  r‘  r’  rÌ  râ  r  r"  r$  r)  r7  rE  rN  rZ  re  rj  rp  rt  r‰  rŒ  r�  r’  r”  r¡  r£  r¤  rŽ  r@   r@   r@   rA   rÄ    s`    :
W
 I

B
B
 $
E
<
k
0
2

 






rÄ  c                   @   s0   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZdS )ÚIoctlsc                 C   s   t  ¡ tfS r<   )rí   rB  r6   )r°   r±   rž  r@   r@   rA   ÚfsctlDfsGetReferrals
  rR  zIoctls.fsctlDfsGetReferralsc           	   
   C   sÜ   |  | ¡}d}|d  ¡ |d v rb|d |d  ¡  d }t}z#|tkr't}n|d |d  ¡  d }| |d ¡ | |d ¡}W n! tya } z|jd| t	j
|d	� t}W Y d }~nd }~ww t}| | |¡ ||fS )
NrF   r:  r¿  rÀ  rÁ  rÕ  ÚMaxOutputResponsezfsctlPipeTransceive: %s rÒ  )r¤  rò   r2   rÄ  r5   ÚsendallrÇ  rv   rÕ  rÙ  rÚ  r3   r±  )	r°   r±   rž  r²  ÚioctlResponserÉ  rØ   rÊ  r€   r@   r@   rA   ÚfsctlPipeTransceive  s(   
€€þzIoctls.fsctlPipeTransceivec                 C   s^   |  | ¡}t}t |d ¡}t ¡ }d|d< d|d< d|d< tj|d< | | |¡ | ¡ |fS )	NrÕ  r   r4  rž  ÚGuidrƒ   r¦  ÚDialect)r¤  r2   rí   ÚVALIDATE_NEGOTIATE_INFOÚ VALIDATE_NEGOTIATE_INFO_RESPONSErÛ  r±  rò   )r°   r±   rž  r²  rØ   ÚvalidateNegotiateInfoÚvalidateNegotiateInfoResponser@   r@   rA   ÚfsctlValidateNegotiateInfo'  s   

z!Ioctls.fsctlValidateNegotiateInfoN)r�  r‘  r’  rÌ  r§  r«  r²  r@   r@   r@   rA   r¦  	  s    

r¦  c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚSMBSERVERHandlerFc                 C   sN   || _ |d d… \| _| _|| _t ¡ j| _d| _|| _	t
j | |||¡ d S )NrÆ   i,  )Ú_SMBSERVERHandler__SMBÚ_SMBSERVERHandler__ipÚ_SMBSERVERHandler__portÚ_SMBSERVERHandler__requestÚ	threadingÚcurrent_threadÚnameÚ_SMBSERVERHandler__connIdÚ_SMBSERVERHandler__timeOutÚ_SMBSERVERHandler__select_pollr   ÚBaseRequestHandlerÚ__init__)rŠ  r¹  Úclient_addressÚserverÚselect_pollr@   r@   rA   r¿  9  s   zSMBSERVERHandler.__init__c              
   C   s´  | j  d| j| jf ¡ | j  | j| j| j¡ 	 z�tj| j  ¡ d| j| j| j	| j
d�}z| | j¡}W n tjy<   ‚  tjyG   Y W d S w | ¡ tjkr“| ¡  d¡\}}}t d| ¡}t d| ¡}| j  d| j|d  ¡ |d f ¡ t ¡ }| tj¡ | | ¡ ¡ | j	 | ¡ ¡ n!| j  | j| ¡ ¡}	|	D ]}
t|
dƒr®| |
 ¡ ¡ qŸ| |
¡ qŸW n# tyØ } z| j  d	| ¡ d
d l }| !¡  W Y d }~d S d }~ww q)NzIncoming connection (%s,%d)TÚHOST)Ú	sess_portrÊ  rÂ  ó    z"NetBIOS Session request (%s,%s,%s)rƒ   rò   z
Handle: %sr   )"r´  rÕ  rµ  r¶  ÚaddConnectionr»  r   ÚNetBIOSTCPSessionr­  r·  r½  Úrecv_packetr¼  ÚNetBIOSTimeoutÚNetBIOSErrorÚget_typeÚNETBIOS_SESSION_REQUESTÚget_trailerr'  Údecode_nameÚstripÚNetBIOSSessionPacketÚset_typeÚ!NETBIOS_SESSION_POSITIVE_RESPONSEÚset_trailerrÆ  ÚrawDataÚprocessRequestr&  Úsend_packetrò   rv   rw   rx   )rŠ  ÚsessionÚpÚ_ÚrnÚmyÚremote_nameÚmynameÚrr+  r´   r€   rw   r@   r@   rA   ÚhandleD  sN   ÿÿÿ
€€üàzSMBSERVERHandler.handlec                 C   s2   | j  d| j| jf ¡ | j  | j¡ tj | ¡S )NzClosing down connection (%s,%d))	r´  rÕ  rµ  r¶  ÚremoveConnectionr»  r   r¾  Úfinish©rŠ  r@   r@   rA   rá  m  s   zSMBSERVERHandler.finishNr¥  )r�  r‘  r’  r¿  rß  rá  r@   r@   r@   rA   r³  8  s    
)r³  c                   @   st  e Zd Zeddfdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dZd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ejdfd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(dJdK„ Z)d[dMdN„Z*dOdP„ Z+d\dQdR„Z,dSdT„ Z-d]dVdW„Z.dXdY„ Z/dS )^Ú	SMBSERVERNFc                 C   s,  |r4t j| _|d  d¡}t|ƒdkr|d nd}zt|ƒ}W n ty-   t  |¡}Y nw |d|f }dtj	_
tj	 | ||¡ d| _d| _d| _d| _d | _d| _d| _d| _d| _d| _d| _|| _i | _d| _i | _d| _d| _d| _d| _d| _d| _ d | _!t"ƒ | _#t$ƒ | _%t&ƒ | _'t(ƒ | _)t*ƒ | _+t,ƒ | _-d| j)j.i| _/d	| j'j0t1j2j3| j'j4i| _5t1j2j6| j%j7t1j2j8| j%j9t1j2j:| j%j;t1j2j<| j%j=t1j2j>| j%j?t1j2j@| j%jAt1j2jB| j%jCi| _Di t1j2jE| j#jF“t1j2jG| j#jH“t1j2jI| j#jJ“t1j2jK| j#jL“t1j2jM| j#jN“t1j2jO| j#jP“t1j2jQ| j#jR“t1j2jS| j#jT“t1j2jU| j#jV“t1j2jW| j#jX“t1j2jY| j#jZ“t1j2j[| j#j\“t1j2j]| j#j^“t1j2j_| j#j`“t1j2ja| j#jb“t1j2jc| j#jd“t1j2je| j#jf“t1j2jg| j#jht1j2ji| j#jjt1j2jk| j#jlt1j2jm| j#jnt1j2jo| j#jpt1j2jq| j#jrt1j2js| j#jtt1j2ju| j#jvd| j#j.i	¥| _wtxjy| j-jztxj{| j-j|txj}| j-j~i| _i txj€| j+j�“txj‚| j+jƒ“txj„| j+j…“txj†| j+j‡“txjˆ| j+j‰“txjŠ| j+j‹“txjŒ| j+j�“txjŽ| j+j�“txj�| j+j‘“txj’| j+j““txj”| j+j•“txj–| j+j—“txj˜| j+j™“txjš| j+j›“txjœ| j+j�“txjž| j+jŸ“txj | j+j¡“txj¢| j+j£d| j+j.i¥| _¤i | _¥d S )
Nr   ú%rÆ   rƒ   TrF   FrÝ   z\PIPE\LANMAN)¦rï  ÚAF_INET6Úaddress_familyr'  ru   rª  Ú
ValueErrorÚif_nametoindexr   Ú	TCPServerÚallow_reuse_addressr¿  Ú_SMBSERVER__serverNameÚ_SMBSERVER__serverOSÚ_SMBSERVER__serverDomainÚ_SMBSERVER__challengeÚ_SMBSERVER__logÚ_SMBSERVER__computerAccountNameÚ!_SMBSERVER__computerAccountNTHashÚ_SMBSERVER__computerAccountAESÚ#_SMBSERVER__computerAccountPasswordÚ!_SMBSERVER__computerAccountDomainÚ_SMBSERVER__domainControllerIPÚ_SMBSERVER__serverConfigÚ_SMBSERVER__credentialsÚ_SMBSERVER__logFileÚ _SMBSERVER__registeredNamedPipesÚ_SMBSERVER__jtr_dump_pathÚ_SMBSERVER__SMB2Supportr�  Ú_SMBSERVER__KerberosSupportÚ_SMBSERVER__NTLMSupportr  r‡  r  Ú_SMBSERVER__smbCommandsHandlerrÍ  Ú_SMBSERVER__smbTrans2Handlerr“  Ú_SMBSERVER__smbTransHandlerr‰  Ú_SMBSERVER__smbNTTransHandlerrÄ  Ú_SMBSERVER__smb2CommandsHandlerr¦  Ú_SMBSERVER__IoctlHandlerrŽ  Ú_SMBSERVER__smbNTTransCommandsr»  r   r‘   ÚTRANS_TRANSACT_NMPIPErË  Ú_SMBSERVER__smbTransCommandsÚTRANS2_FIND_FIRST2rO  ÚTRANS2_FIND_NEXT2r  ÚTRANS2_QUERY_FS_INFORMATIONr  ÚTRANS2_QUERY_PATH_INFORMATIONrP  ÚTRANS2_QUERY_FILE_INFORMATIONrQ  ÚTRANS2_SET_FILE_INFORMATIONrì  ÚTRANS2_SET_PATH_INFORMATIONrß  Ú_SMBSERVER__smbTrans2Commandsrd  rh  rj  rn  r  r…  rq  rz  r{  r~  r²  rÁ  rf  r�  rÃ  rÅ  r  r0  r¿  rÀ  r·  r¼  rª  r®  ÚSMB_COM_TRANSACTION2rL  ÚSMB_COM_TRANSACTIONr9  ÚSMB_COM_NT_TRANSACTrF  r³  rµ  rþ  r  rÉ  rÍ  r£  r¨  r—  r�  r‹  r–  r\  rc  rR  rX  rM  rO  rÚ  rù  Ú_SMBSERVER__smbCommandsrí   ÚFSCTL_DFS_GET_REFERRALSr§  ÚFSCTL_PIPE_TRANSCEIVEr«  ÚFSCTL_VALIDATE_NEGOTIATE_INFOr²  Ú_SMBSERVER__smb2IoctlsrÙ  râ  ÚSMB2_SESSION_SETUPr)  ÚSMB2_LOGOFFr”  ÚSMB2_TREE_CONNECTr7  ÚSMB2_TREE_DISCONNECTr’  r?  rE  Ú
SMB2_CLOSErN  Ú
SMB2_FLUSHrt  Ú	SMB2_READrp  Ú
SMB2_WRITErj  Ú	SMB2_LOCKr£  Ú
SMB2_IOCTLr¡  ÚSMB2_CANCELr¤  Ú	SMB2_ECHOr�  ÚSMB2_QUERY_DIRECTORYr‰  ÚSMB2_CHANGE_NOTIFYrŒ  ÚSMB2_QUERY_INFOrZ  ÚSMB2_SET_INFOre  Ú_SMBSERVER__smb2CommandsÚ_SMBSERVER__activeConnections)rŠ  Úserver_addressÚhandler_classÚconfig_parserÚipv6Úip_partsÚscope_idr@   r@   rA   r¿  v  s  ÿþþù
ÿþýüûúùø	÷
öõôóòðïîå


ñ
ÿ
þ
ý
ü
û
ú
ù
ø
	÷

ö
õ
ô
ó
ò
ñ
ð
ï
ì
zSMBSERVER.__init__c                 C   ó   | j S r<   )r  râ  r@   r@   rA   r�    ó   zSMBSERVER.getIoctlsc                 C   r/  r<   )r÷  râ  r@   r@   rA   r…    r0  zSMBSERVER.getCredentialsc                 C   s2   z| j |= W n   Y |  dt| j  ¡ ƒ ¡ d S )NzRemaining connections %s)r(  rÕ  r  r	  )rŠ  rº  r@   r@   rA   rà     s
   zSMBSERVER.removeConnectionc                 C   s¶   i | j |< d| j | d< || j | d< || j | d< d| j | d< i | j | d< i | j | d< i | j | d< i | j | d	< d
| j | d< d| j | d< d| j | d< d
| j | d< d S )Nr   Ú	PacketNumÚClientIPÚ
ClientPortrÁ  rÑ  r¿  rõ  r>  Fr  rF   r  r”  r  rÂ  ©r(  )rŠ  rº  ÚipÚportr@   r@   rA   rÆ  '  s   
zSMBSERVER.addConnectionc                 C   r/  r<   r4  râ  r@   r@   rA   ÚgetActiveConnections:  r0  zSMBSERVER.getActiveConnectionsc                 C   s   || j |< d S r<   r4  )rŠ  r°   r  r@   r@   rA   r±  =  ó   zSMBSERVER.setConnectionDataTc                 C   s*   | j | }|du rd|v durtdƒ‚|S )NTrÂ  zUser not Authenticated!)r(  rv   )rŠ  r°   r2  Úconnr@   r@   rA   r¤  B  s
   
zSMBSERVER.getConnectionDatac                 C   r/  r<   )rù  râ  r@   r@   rA   ræ  J  r0  z!SMBSERVER.getRegisteredNamedPipesc                 C   s   || j t|ƒ< dS ©NT©rù  rå  ©rŠ  ÚpipeNameÚaddressr@   r@   rA   ÚregisterNamedPipeM  s   zSMBSERVER.registerNamedPipec                 C   s   || j v r| j t|ƒ= dS dS )NTFr;  ©rŠ  r=  r@   r@   rA   ÚunregisterNamedPipeQ  s   
zSMBSERVER.unregisterNamedPipec                 C   ó   || j v r| j |= d S d S r<   ©r  ©rŠ  ÚtransCommandr@   r@   rA   ÚunregisterTransactionW  ó   
ÿzSMBSERVER.unregisterTransactionc                 C   ó(   || j v r| j | }nd }|| j |< |S r<   rC  ©rŠ  rE  ÚcallbackÚoriginalCommandr@   r@   rA   ÚhookTransaction[  s
   
 
zSMBSERVER.hookTransactionc                 C   rB  r<   ©r  rD  r@   r@   rA   ÚunregisterTransaction2ƒ  rG  z SMBSERVER.unregisterTransaction2c                 C   rH  r<   rM  rI  r@   r@   rA   ÚhookTransaction2‡  ó
   

zSMBSERVER.hookTransaction2c                 C   rB  r<   ©r  rD  r@   r@   rA   ÚunregisterNTTransaction’  rG  z!SMBSERVER.unregisterNTTransactionc                 C   rH  r<   rQ  rI  r@   r@   rA   ÚhookNTTransaction–  rP  zSMBSERVER.hookNTTransactionc                 C   rB  r<   ©r  )rŠ  Ú
smbCommandr@   r@   rA   ÚunregisterSmbCommand¡  rG  zSMBSERVER.unregisterSmbCommandc                 C   rH  r<   rT  )rŠ  rU  rJ  rK  r@   r@   rA   ÚhookSmbCommand¥  s
   
$
zSMBSERVER.hookSmbCommandc                 C   rB  r<   ©r'  )rŠ  Úsmb2Commandr@   r@   rA   ÚunregisterSmb2CommandÑ  rG  zSMBSERVER.unregisterSmb2Commandc                 C   rH  r<   rX  )rŠ  rY  rJ  rK  r@   r@   rA   ÚhookSmb2CommandÕ  s
   

zSMBSERVER.hookSmb2Commandc                 C   sF   |r|  d¡pd}|  d¡pd}|› d|› d�| }| j ||¡ d S )NrY  ÚNULLrT  r¹   z: )Úgetrï  rÕ  )rŠ  Úmsgr  r²  r|   r{   r@   r@   rA   rÕ  Þ  s
   zSMBSERVER.logc                 C   r/  r<   )rë  râ  r@   r@   rA   r­  å  r0  zSMBSERVER.getServerNamec                 C   r/  r<   )rì  râ  r@   r@   rA   rk  è  r0  zSMBSERVER.getServerOSc                 C   r/  r<   )rí  râ  r@   r@   rA   rx  ë  r0  zSMBSERVER.getServerDomainc                 C   r/  r<   )rî  râ  r@   r@   rA   rƒ  î  r0  zSMBSERVER.getSMBChallengec                 C   r/  r<   ©rö  râ  r@   r@   rA   r«   ñ  r0  zSMBSERVER.getServerConfigc                 C   ó
   || _ d S r<   r_  ©rŠ  r²   r@   r@   rA   ÚsetServerConfigô  rC   zSMBSERVER.setServerConfigc                 C   r/  r<   )rú  râ  r@   r@   rA   r†  ÷  r0  zSMBSERVER.getJTRdumpPathc                 C   r/  r<   )Ú_SMBSERVER__dump_hashesrâ  r@   r@   rA   ÚgetDumpHashesú  r0  zSMBSERVER.getDumpHashesc                 C   r/  r<   ©r‡  râ  r@   r@   rA   ÚgetAuthCallbacký  r0  zSMBSERVER.getAuthCallbackc                 C   r`  r<   re  ©rŠ  rJ  r@   r@   rA   ÚsetAuthCallback   rC   zSMBSERVER.setAuthCallbackc                 C   r/  r<   )rü  râ  r@   r@   rA   rÜ    r0  zSMBSERVER.getKerberosSupportc                 C   r/  r<   )rý  râ  r@   r@   rA   rÞ    r0  zSMBSERVER.getNTLMSupportc                 C   s   dS r:  r@   )rŠ  r¹  rÀ  r@   r@   rA   Úverify_request	  s   zSMBSERVER.verify_requestc                 C   s|   t  d|d ¡|d< t ¡ }| |¡ | |¡ t|dƒr%| | ¡ ¡ n| |¡ | ¡ d d… |d< |d  d7  < d S )Nr@  rV  ÚSecurityFeaturesrò   r"  rÆ   )r¥  r    ÚhashlibÚmd5Úupdater&  rò   Údigest)rŠ  r²  rÃ  ÚsigningSessionKeyÚsigningChallengeResponseÚmr@   r@   rA   r*    s   



zSMBSERVER.signSMBv1r   c                 C   sR   d|d< |d  t jO  < | ¡ d|  }t ||tj¡ ¡ }|d d… |d< d S )Ns                   Ú	Signaturer
  râ  rI   )rí   ÚSMB2_FLAGS_SIGNEDrò   ÚhmacÚnewrk  Úsha256rn  )rŠ  rÃ  ro  Ú	padLengthÚ
packetDataÚ	signaturer@   r@   rA   r5  0  s
   zSMBSERVER.signSMBv2c              
   C   s¬  d}d }zt j|d�}t  |d d ¡}W n   tj|d�}|  |d¡}|  ||d ¡ d}Y |  |d¡}g }g }�z–|du �rF|d du r`|d t jjt jj	fvr`t
}	d }
t  |d ¡g}nØ|d t jjkrz| j|d  || ||| jƒ\}}
}	n¾|d t jjkr”| j|d  || ||| jƒ\}}
}	n¤|d t jjkr®| j|d  || ||| jƒ\}}
}	nŠ|d | jv �r+| jdu �r|d t jjk�rz| jtj || |dƒ\}}
}	d}W n` t�y
 } z&dd l}| ¡  |  d	| tj¡ | j|d  || ||ƒ\}}
}	W Y d }~n2d }~ww | j|d  || ||ƒ\}}
}	n| j|d  || ||ƒ\}}
}	n| jd
 || ||ƒ\}}
}	| ||
|	f¡ | |¡ nŠ|d du �rm|d tjtjfv�rmt
}	d }
dg}| ||
|	f¡ | |¡ ncd}|�sÐ|d | jv �rœ| jdu �r�| j|d  || |ƒ\}}
}	n| jd
 || |ƒ\}}
}	n| jd
 || |ƒ\}}
}	| ||
|	f¡ | |¡ |d dk�rË||d d … }tj|d�}nd}|�rrW n t�yì } z|  d|d |f tj¡ ‚ d }~ww |  |d¡}|  ||¡ g }tt|ƒƒD ]ò}|| \}}
}	|| }|
d u �rð|D ]Ø}|du �r�t  ¡ }t jj |d< t jj!t jj"B t jj#B |d t jj$@ B |d< |d |d< |d |d< |d |d< |d |d< |	d? |d< |	d? d
@ |d< |	d
@ |d< | %|¡ |d �rˆ|d  t jj&O  < |  '|||d |d ¡ | |¡ �qt ¡ }tj(|d< |dk�r¦|d  tj)O  < |	|d< |d |d< |d |d< |d |d< |d |d< |d |d < |d! |d!< |d" |d"< t*|d#ƒ�rá| +¡ |d< nt,|ƒ|d< | |¡ �q�q|
}�q|du �rPg }t|ƒ}t-|ƒD ]F\}}t|ƒ d }|d$ |k �rt|ƒ| |d< |d �r,| j||d |d%� t*|d#ƒ�r?| | +¡ |d&  ¡ �q| ||d&  ¡ �qd' .|¡g}i |d(< |S ))NFr  r¼  r   r  TrÂ  r  zSMB2_NEGOTIATE: %srÝ   rF   ÚNextCommandzprocessRequest (0x%x,%s)r  rÎ  rÐ  r  r	  rÁ  rI   r  r"  Ú	_reservedr  r  r  r
  rÅ  rÆ  ÚCreditCharger*  rÇ  rÈ  rÉ  rò   rƒ   )rw  râ  r”  r>  )/r   r  rÂ  rí   r×  r¤  r5  r‘   r²  rf  r3   r  r  r  r  r  r  r  rû  r'  rÙ  rv   rw   rx   rÕ  rÙ  rÚ  r*  r  r±  r�  ru   r  r  r  r  r’   r)  ÚFLAGS2_SMB_SECURITY_SIGNATUREr*  rØ  ÚSMB2_FLAGS_RELATED_OPERATIONSr&  rò   rå  rû  r¾   )rŠ  r°   r  rE  rÂ  rÃ  r²  ÚcompoundedPacketsResponseÚcompoundedPacketsrØ   ÚrespPacketsÚrespCommandsr€   rw   ÚdoneÚpacketsToSendÚ	packetNumÚrespCommandrà  Ú	finalDataÚtotalPacketsÚidxrN  r@   r@   rA   rÕ  8  sf  
ÿûûû

ÿ
ü€õüü
ÿÿý
î€€û

ÿÿÿ

ÿ

Ð3

zSMBSERVER.processRequestc           	      C   s°  | j d u r|d u rd}t ¡ | _ | j  |¡ | j  dd¡| _| j  dd¡| _| j  dd¡| _| j  dd¡re| j  dd¡| _	| j  dd¡| _
| j  dd¡| _| j  dd	¡| _| j  dd
¡| _| j  dd¡| _| j  dd¡| _| j  dd¡rt| j  dd¡ƒ| _nd| _| j  dd¡r‘| j  dd¡| _| j  dd¡r¡| j  dd¡| _nd| _| j  dd¡r´| j  dd¡| _nd| _| j  dd¡rÇ| j  dd¡| _nd| _| j  dd¡rÚ| j  dd¡| _nd| _| j  dd¡rí| j  dd¡| _nd| _| j  dd¡�r| j  dd¡| _nd| _| jdk�rtj| jtjdddd� t| _| j  dd¡}|dk�rQt|ƒ}|  ¡ }|�rM| !d¡\}}}}||| "d¡f| j#| $¡ < |  ¡ }|�s0| %¡  |  &d ¡ d S )!Nzsmb.confrª   Úserver_nameÚ	server_osÚserver_domainÚcomputer_account_nameÚcomputer_account_hashÚcomputer_account_aesÚcomputer_account_passwordÚcomputer_account_domainr  Úlog_filerM   s   AAAAAAAAr›  Údump_hashesFÚSMB2SupportÚDropSSPÚKerberosSupportÚNTLMSupportTÚanonymous_logonÚNoneú'%(asctime)s: %(levelname)s: %(message)sú%m/%d/%Y %I:%M:%S %p)r  r  ÚformatÚdatefmtÚforceÚcredentials_filerF   ú:z
zConfig file parsed)'rö  r   ÚConfigParserrÅ  r]  rë  rì  rí  r»  rð  rñ  rò  ró  rô  rõ  rø  r   rî  rú  r¼  rc  rû  r�  rü  rý  r  rÙ  ÚbasicConfigr‘  ry   rï  rŠ   Úreadliner'  rÏ  r÷  r-  rT  rÕ  )	rŠ  Ú
configFileÚcredentials_fnameÚcredÚlinerº  r
  r\   r]   r@   r@   rA   ÚprocessConfigFile+  st   

ü
ýzSMBSERVER.processConfigFilec                 C   sn   |dks|dkr+t |ƒd rd| }t |ƒd rd| }z
t|ƒ}t|ƒ}W n   Y |||f| j| ¡ < d S )NrF   rÆ   z0%s)ru   r   r÷  r-  ©rŠ  rº  r
  r\   r]   r@   r@   rA   ÚaddCredentialy  s   zSMBSERVER.addCredentialrF   c                 C   s(   || _ || _|| _|| _|| _|| _d S r<   ©rð  rñ  rò  ró  rô  rõ  )rŠ  r{   r|   r  r]   rè  ré  r@   r@   rA   ÚsetComputerAccountCredentials‡  s   
z'SMBSERVER.setComputerAccountCredentialsc                 C   s   | j | j| j| j| j| jdœS )N)r{   r]   rè  ré  r|   r  r«  râ  r@   r@   rA   rÝ  �  s   úz'SMBSERVER.getComputerAccountCredentials)Tr�  r<   )rF   rF   rF   )0r�  r‘  r’  r³  r¿  r�  r…  rà  rÆ  r7  r±  r¤  ræ  r?  rA  rF  rL  rN  rO  rR  rS  rV  rW  rZ  r[  rÙ  r`  rÕ  r­  rk  rx  rƒ  r«   rb  r†  rd  rf  rh  rÜ  rÞ  ri  r*  r5  rÕ  r¨  rª  r¬  rÝ  r@   r@   r@   rA   rã  t  sZ     %
(,	
" 
tN
rã  r  éþÿÿÿ)ÚDCERPCServer)r\  )ÚNetrShareEnumÚNetrShareEnumResponseÚSHARE_INFO_1ÚNetrServerGetInfoÚNetrServerGetInfoResponseÚNetrShareGetInfoÚNetrShareGetInfoResponse)ÚNetrWkstaGetInfoÚNetrWkstaGetInfoResponse)ÚERROR_INVALID_LEVELc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
WKSTServerc                 C   s*   t  | ¡ d| ji| _|  dd| j¡ d S )Nr   )z$6BFFD098-A112-3610-9833-46C3F87E345Az1.0z\PIPE\wkssvc)r®  r¿  r¶  ÚwkssvcCallBacksÚaddCallbacksrâ  r@   r@   rA   r¿  «  s   
ÿzWKSTServer.__init__c                 C   s  t |ƒ}|  d|d  ¡ tƒ }|d dvrt|d< |S |d |d d< |d dkrTd|d d	 d
< t|d d	 d< t|d d	 d< d|d d	 d< d|d d	 d< |S d|d d d< t|d d d< t|d d d< d|d d d< d|d d d< t|d d d< |S )NzNetrWkstaGetInfo Level: %dÚLevel)éd   ée   r  Ú	WkstaInfoÚtagr½  éô  ÚWkstaInfo100Úwki100_platform_idÚwki100_computernameÚwki100_langroupr÷  Úwki100_ver_majorr   Úwki100_ver_minorÚWkstaInfo101Úwki101_platform_idÚwki101_computernameÚwki101_langroupÚwki101_ver_majorÚwki101_ver_minorÚwki101_lanroot)r¶  rÕ  r·  r¸  r\  ©rŠ  r  r¹  Úanswerr@   r@   rA   r¶  ²  s*   
ùzWKSTServer.NetrWkstaGetInfoN)r�  r‘  r’  r¿  r¶  r@   r@   r@   rA   r¹  ª  s    r¹  c                   @   s>   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
d„ Zdd„ ZdS )Ú
SRVSServerc                 C   sD   t  | ¡ i | _d | _d | _| j| j| jdœ| _|  	dd| j¡ d S )N)é   rI   é   )z$4B324FC8-1670-01D3-1278-5A47BF6EE188z3.0z\PIPE\srvsvc)
r®  r¿  Ú_sharesÚ_SRVSServer__serverConfigÚ_SRVSServer__logFiler¯  r´  r²  ÚsrvsvcCallBacksr»  râ  r@   r@   rA   r¿  Ò  s   
ýzSRVSServer.__init__c                 C   r`  r<   )rÕ  ra  r@   r@   rA   rb  á  rC   zSRVSServer.setServerConfigNc                 C   sŽ   |d urt  ¡ | _| j |¡ | j ¡ }| j dd¡| _| jdkr,tj| jtj	ddd� || 
d¡= i | _|D ]}t| j |¡ƒ| j|< q7d S )Nrª   r’  r™  rš  r›  )r  r  rœ  r�  )r   r¡  rÕ  rÅ  r¬   r]  rÖ  rÙ  r¢  r‘  r­   rÔ  r®   r¯   )rŠ  r¤  r¬   r´   r@   r@   rA   r¨  ä  s    


ýÿzSRVSServer.processConfigFilec                 C   sÄ   t |ƒ}|  d|d  ¡ |d d d…  ¡ }tƒ }|| jv rP| j| }d|d d< |d |d d	 d
< |d |d d	 d< |d d |d d	 d< d|d< |S d|d d< t|d d	< d|d< |S )NzNetrGetShareInfo Level: %dr¼  ÚNetNamer  rƒ   Ú
InfoStructrÀ  r™  Ú
ShareInfo1Úshi1_netnamerœ  Ú	shi1_typer   Úshi1_remarkr   r  i	  )r´  rÕ  r°  rµ  rÔ  r\  )rŠ  r  r¹  ÚsrÐ  r·   r@   r@   rA   r´  ÷  s    

üzSRVSServer.NetrShareGetInfoc                 C   sœ   t |ƒ}|  d|d  ¡ tƒ }d|d d< d|d d d< |d	 |d d d
< d|d d d< d|d d d< d|d d d< t|d d d< d|d< |S )NzNetrServerGetInfo Level: %dr¼  r¾  rÙ  rÀ  rÁ  ÚServerInfo101Úsv101_platform_idr¡  Ú
sv101_nameé   Úsv101_version_majorrƒ   Úsv101_version_minorÚ
sv101_typeÚsv101_commentr   r  )r²  rÕ  r³  r\  rÏ  r@   r@   rA   r²    s   zSRVSServer.NetrServerGetInfoc                 C   sÔ   t |ƒ}|  d|d d  ¡ tƒ }d|d d< d|d d d< t| jƒ|d< t| jƒ|d d d d	< d
|d< | jD ],}tƒ }|d |d< | j| d |d< | j| d d |d< |d d d d  |¡ q;|S )NzNetrShareEnum Level: %drÙ  r¼  rƒ   Ú	ShareInforÀ  ÚTotalEntriesÚLevel1ÚEntriesReadr   r  r™  rÛ  rœ  rÜ  r   rÝ  rÕ  )r¯  rÕ  r°  ru   rÔ  r±  r*  )rŠ  r  r¹  Ú	shareEnumr´   rº  r@   r@   rA   r¯    s   
zSRVSServer.NetrShareEnumr<   )	r�  r‘  r’  r¿  rb  r¨  r´  r²  r¯  r@   r@   r@   rA   rÑ  Ñ  s    
rÑ  c                   @   s¾   e Zd ZdZdddedfdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zd1d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d0S )2ÚSimpleSMBServeraÍ  
    SimpleSMBServer class - Implements a simple, customizable SMB Server

    :param string listenAddress: the address you want the server to listen on
    :param integer listenPort: the port number you want the server to listen on
    :param string configFile: a file with all the servers' configuration. If no file specified, this class will create the basic parameters needed to run. You will need to add your shares manually tho. See addShare() method
    z0.0.0.0i½  rF   Fc              	   C   s°  |dkr|||f|d�| _ | j  |¡ d | _n—t ¡ | _| j d¡ | j ddd dd„ tdƒD ƒ¡¡ | j ddd d	d„ tdƒD ƒ¡¡ | j dd
d dd„ tdƒD ƒ¡¡ | j ddd¡ | j ddd¡ | j ddd¡ | j ddd¡ | j d¡ | j ddd¡ | j ddd¡ | j ddd¡ | j ddd¡ |||f| j|d�| _ | j  ¡  t	ƒ | _
d| j
_tƒ | _d| j_| j  dd| j
 ¡ f¡ | j  dd| j ¡ f¡ d S )NrF   )r,  rª   rŠ  c                 S   ó   g | ]}t  tj¡‘qS r@   ©r  ÚchoiceÚstringÚascii_letters©rì  rÙ  r@   r@   rA   rî  D  ó    z,SimpleSMBServer.__init__.<locals>.<listcomp>r"  r‹  c                 S   rí  r@   rî  rò  r@   r@   rA   rî  E  ró  rŒ  c                 S   rí  r@   rî  rò  r@   r@   rA   rî  H  ró  r’  r™  r¤  rQ  rŸ  rM   ÚAAAAAAAAAAAAAAAAr  r   rP  rœ  Ú3rˆ   )r+  r,  TÚsrvsvcz	127.0.0.1Úwkssvc)Ú_SimpleSMBServer__serverr¨  Ú_SimpleSMBServer__smbConfigr   r¡  Úadd_sectionÚsetr¾   r�  rÑ  Ú_SimpleSMBServer__srvsServerÚdaemonr¹  Ú_SimpleSMBServer__wkstServerr?  ÚgetListenPort)rŠ  ÚlistenAddressÚ
listenPortr¤  Úsmbserverclassr,  r@   r@   rA   r¿  :  s<   

ÿ$
ÿ
zSimpleSMBServer.__init__c                 C   r/  r<   )rø  râ  r@   r@   rA   Ú	getServerc  r0  zSimpleSMBServer.getServerc                 C   s"   | j  ¡  | j ¡  | j ¡  d S r<   )rü  Ústartrþ  rø  Úserve_foreverrâ  r@   r@   rA   r  f  s   

zSimpleSMBServer.startc                 C   s   | j  ¡  d S r<   )rø  Úserver_closerâ  r@   r@   rA   Ústopk  r8  zSimpleSMBServer.stopc                 C   s   | j  ||¡S r<   )rø  r?  r<  r@   r@   rA   r?  n  r8  z!SimpleSMBServer.registerNamedPipec                 C   s   | j  |¡S r<   )rø  rA  r@  r@   r@   rA   rA  q  s   z#SimpleSMBServer.unregisterNamedPipec                 C   ó
   | j  ¡ S r<   )rø  ræ  râ  r@   r@   rA   ræ  t  rC   z'SimpleSMBServer.getRegisteredNamedPipesÚ0Únoc                 C   sˆ   |  ¡ }| j |¡ | j |d|¡ | j |d|¡ | j |d|¡ | j |d|¡ | j | j¡ | j | j¡ | j ¡  | j ¡  d S )Nr   rP  rœ  rˆ   )r°  rù  rú  rû  rø  rb  rü  r¨  )rŠ  r¾  Ú	sharePathÚshareCommentÚ	shareTyperÖ   r·   r@   r@   rA   ÚaddSharew  s   
zSimpleSMBServer.addSharec                 C   sD   | j  | ¡ ¡ | j | j ¡ | j | j ¡ | j ¡  | j ¡  d S r<   )rù  Úremove_sectionr°  rø  rb  rü  r¨  )rŠ  r¾  r@   r@   rA   ÚremoveShareƒ  s
   
zSimpleSMBServer.removeSharec                 C   s8   |dkr| j  dd|¡ | j | j ¡ | j ¡  d S d S )NrF   rª   rM   ©rù  rû  rø  rb  r¨  )rŠ  rM   r@   r@   rA   ÚsetSMBChallengeŠ  s
   ýzSimpleSMBServer.setSMBChallengec                 C   ó,   | j  dd|¡ | j | j ¡ | j ¡  d S )Nrª   r’  r  ©rŠ  ÚlogFiler@   r@   rA   Ú
setLogFile�  ó   zSimpleSMBServer.setLogFilec                 C   r  )Nrª   rŸ  r  r  r@   r@   rA   ÚsetCredentialsFile•  r  z"SimpleSMBServer.setCredentialsFilec                 C   s   | j  ||||¡ d S r<   )rø  rª  r©  r@   r@   rA   rª  š  s   zSimpleSMBServer.addCredentialc                 C   s°   | j  dd|d d… ¡ | j  dd|¡ | j  dd|¡ | j  dd|p$d¡ | j  dd|p.d¡ | j  dd	|p8d¡ | j  dd
|¡ | j  dd|¡ | j | j ¡ | j ¡  d S )Nrª   rŠ  r  rŒ  r�  rŽ  rF   r�  r�  r‘  r  r  )rŠ  r�  rŽ  r�  r�  r‘  r  r@   r@   rA   ÚsetComputerAccount�  s   z"SimpleSMBServer.setComputerAccountc                 C   óF   |du r| j  ddd¡ n| j  ddd¡ | j | j ¡ | j ¡  d S )NTrª   r”  ÚTrueÚFalser  ©rŠ  r   r@   r@   rA   ÚsetSMB2Support­  ó
   zSimpleSMBServer.setSMB2Supportc                 C   r  )NTrª   r—  r  r  r  r  r@   r@   rA   ÚsetNTLMSupportµ  r  zSimpleSMBServer.setNTLMSupportc                 C   r  )NTrª   r–  r  r  r  r  r@   r@   rA   ÚsetKerberosSupport½  r  z"SimpleSMBServer.setKerberosSupportc                 C   r  r<   )rø  rf  râ  r@   r@   rA   rf  Å  rC   zSimpleSMBServer.getAuthCallbackc                 C   s   | j  |¡ d S r<   )rø  rh  rg  r@   r@   rA   rh  È  s   zSimpleSMBServer.setAuthCallbackc                 C   r  )NTrª   r•  r  r  r  r  r@   r@   rA   Ú
setDropSSPË  r  zSimpleSMBServer.setDropSSPN)rF   r	  r
  )r�  r‘  r’  Ú__doc__rã  r¿  r  r  r  r?  rA  ræ  r  r  r  r  r  rª  r  r  r   r!  rf  rh  r"  r@   r@   r@   rA   rì  1  s,    )
rì  c                   @   sF   e Zd ZejZejjZ	ej
Ze d¡ddfdd„Zdd„ Zdd	„ ZdS )
r  r"  NrF   c                 C   sV   || _ || _|d ur|| _n|d d… | _t|ƒ| _|| _|| _|| _d | _d | _	d S )Nr  )
r  r�  Úcomputer_namer   rŽ  r‘  Úclient_challengeÚprimary_namerò  Údce)rŠ  r  r�  rŽ  r‘  r%  r$  r&  r@   r@   rA   r¿  Ù  s   

zNetLogon.__init__c           	   	   C   s<  t j| j| j| jdd�}t |¡}| ¡ }| ¡  |j	t
jt | j¡d� t
 || j| jd | j¡}|d }t
 d | j|| j¡}t
 | j|¡}t
 || jd | jd t
jj| jd |d¡}| | jd| j¡ | tj¡ | | j¡ |j	t
jdt | j¡d	�}t
  ||¡}| !|¡ t
 "|| j| j|¡}|d
 | _#|| _$d S )NÚncacn_ip_tcp)ÚdataRepresentationÚprotocol)Útransfer_syntaxr™  ÚServerChallengeiÿÿ`ÚTHIS_IS_IGNORED_IN_IMPACKETrƒ   )Úalterr+  ÚReturnAuthenticator)%r   Úhept_mapr  Únrpc_uidÚsyntaxr   ÚDCERPCTransportFactoryÚget_dce_rpcrð  Úbindr   ÚMSRPC_UUID_NRPCr   Úbin_to_uuidtupÚhNetrServerReqChallenger&  r$  r%  ÚComputeSessionKeyStrongKeyrŽ  ÚComputeNetlogonCredentialÚhNetrServerAuthenticate3r�  ÚNETLOGON_SECURE_CHANNEL_TYPEÚWorkstationSecureChannelÚset_credentialsr‘  Úset_auth_typer   ÚRPC_C_AUTHN_NETLOGONÚset_auth_levelÚauthn_level_packetÚComputeNetlogonAuthenticatorÚset_session_keyÚhNetrLogonGetCapabilitiesrò  r'  )	rŠ  Úbinding_string_nrpcÚrpctransportr'  r+  Úserverchallrš  Ú
clientcredÚauthr@   r@   rA   r  ç  s,   
þ


zNetLogon.setupConnectionc                 C   s@  t  ¡ }d|d< | jd |d< t jj|d< t jj|d< t jj|d d< |d  d	¡|d d
 d d< d|d d
 d d< |d  d	¡|d d
 d d< d|d d
 d d< ||d d
 d< |d |d d
 d< |d |d d
 d< | j|d< d|d d< d|d d< d|d< | j	 
|¡}t |d d  d! |d" ¡}||d# fS )$Nr™  ÚLogonServerÚComputerNameÚValidationLevelÚ
LogonLevelÚLogonInformationrÀ  rG   rH   ÚLogonNetworkTransitiveÚIdentityÚLogonDomainNamei   ÚParameterControlrT  ÚUserNamerF   ÚWorkstationÚLmChallenger   ÚNtChallengeResponserJ   ÚLmChallengeResponser   s           r/  Ú
Credentialr   Ú	TimestampÚ
ExtraFlagsÚValidationInformationÚValidationSam4ÚUserSessionKeyrN   r  )r   ÚNetrLogonSamLogonWithFlagsr$  ÚNETLOGON_VALIDATION_INFO_CLASSÚNetlogonValidationSamInfo4ÚNETLOGON_LOGON_INFO_CLASSÚ$NetlogonNetworkTransitiveInformationrP   rò  r'  r¹  r   rZ   )rŠ  r_   r^   r¹  r+  Ú
signingKeyr@   r@   rA   r    s(   
z"NetLogon.logonUserAndGetSessionKey)r�  r‘  r’  r   r6  r1  r   ÚDCERPCÚ	NDRSyntaxr2  ÚRPC_C_AUTHN_LEVEL_PKT_PRIVACYrB  r  Ú	randbytesr¿  r  r  r@   r@   r@   rA   r  Ô  s    r  r<   )“r{  rï  r}  r™   r¥  r¸  rÙ  Úlogging.configr%  r‡   r,  r‚  rÏ   r  rJ  rð  rk  rt  Úbinasciir   r   r   Úimpacket.dcerpc.v5r   r   r   r   Úsixr	   r
   Ú	six.movesr   r   Úpyasn1.codec.derr   r   Úimpacketr   r   r   r   r   rí   Úimpacket.spnegor   r   r   r   r   r   Úimpacket.krb5.asn1r   r   r   r   r   Úimpacket.krb5r   Úimpacket.krb5.cryptor    r!   r"   r#   Úimpacket.nt_errorsr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   Ú	getLoggerr�  ry   rÄ  rÜ  rB   rE   rm   r�   r�   r•   r˜   r£   r©   rµ   r¸   r½   rÃ   rÛ   r‘   r’   r  rO  rQ  rP  rˆ  r‰  r“  rÍ  r  rÄ  r¦  r¾  r³  ÚThreadingMixInré  rã  rU  rÄ  Úimpacket.dcerpc.v5.rpcrtr®  Úimpacket.dcerpc.v5.dtypesr\  Úimpacket.dcerpc.v5.srvsr¯  r°  r±  r²  r³  r´  rµ  Úimpacket.dcerpc.v5.wkstr¶  r·  Úimpacket.system_errorsr¸  r¹  rÑ  rì  r  r@   r@   r@   rA   Ú<module>   sÐ    d
	7,
	/6 	a  ,                      /<      -$'` $