o
    j*                     @   sf   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 G dd dZdS )    N)	transportsrvsscmr)smbsmb3LOG)SMBConnection)FILE_WRITE_DATAFILE_DIRECTORY_FILEc                   @   sn   e Zd ZdddZedd Zedd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )ServiceInstall Nc                 C   s   d| _ t|dkr|nddd tdD | _|d u r,ddd tdD d | _n|| _|| _t|tj	s>t|t
jrEt|d	| _n|| _d| _d S )
Nr   r   c                 S      g | ]}t tjqS  randomchoicestringascii_letters.0ir   r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/serviceinstall.py
<listcomp>!       z+ServiceInstall.__init__.<locals>.<listcomp>   c                 S   r   r   r   r   r   r   r   r   $   r      z.exe)existingConnection)_rpctransportlenjoinrange_ServiceInstall__service_name$_ServiceInstall__binary_service_name_ServiceInstall__exeFile
isinstancer   SMBr   SMB3r   
connectionshare)self	SMBObjectexeFileserviceNamebinary_service_namer   r   r   __init__   s   * 
zServiceInstall.__init__c                 C      | j S N)r!   r)   r   r   r   r,   3      zServiceInstall.serviceNamec                 C   r/   r0   )r"   r1   r   r   r   binaryServiceName7   r2   z ServiceInstall.binaryServiceNamec                 C   r/   r0   )r(   r1   r   r   r   getShare;   s   zServiceInstall.getSharec                 C   s   t d| j   z/tj| j | j d| jd| _| j }|  |	t
j t
|d}|d d d W S    t d| j    )	NzRequesting shares on %s.....z\srvsvcfilenamesmb_connection   
InfoStruct	ShareInfoLevel1z,Error requesting shares on %s, aborting.....)r   infor'   getRemoteHostr   SMBTransportr   get_dce_rpcconnectbindr   MSRPC_UUID_SRVShNetrShareEnumcritical)r)   dce_srvsrespr   r   r   	getShares>   s   

zServiceInstall.getSharesc              
   C   s   t d| j| j f  zt| j|| jd }W n ty8 } zt	|
ddkr,n|W Y d }~nd }~ww t| j|d  t| j|d  d|| jf }ztj| j|| jd | jd |d tjd}W |d S    t d| j| j f   )	NzCreating service %s on %s..... ERROR_SERVICE_DOES_NOT_EXISTr   lpServiceHandlez%s\%s)lpBinaryPathNamedwStartTypezError creating service %s on %s)r   r<   r!   r'   r=   r   hROpenServiceWrpcsvc	ExceptionstrfindhRDeleteServicehRCloseServiceHandler"   hRCreateServiceWSERVICE_DEMAND_STARTrD   )r)   handler(   pathrF   ecommandr   r   r   createServiceP   s*   
zServiceInstall.createServicec                 C   s   t d| j   tj| j | j d| jd| _| j | _| j	  | j
tj zt| j}W |d S    t d| j   td)NzOpening SVCManager on %s.....z\svcctlr5   z#Error opening SVCManager on %s.....zUnable to open SVCManager
lpScHandle)r   r<   r'   r=   r   r>   r   r?   rN   r@   rA   r   MSRPC_UUID_SCMRhROpenSCManagerWrD   rO   )r)   rF   r   r   r   openSvcManagerl   s   
zServiceInstall.openSvcManagerc                 C   sr   t d|  t|trt|d}n|}|}|dd}z| j|||j W n   t 	d|   |
  d S )NzUploading file %srb/\z&Error uploading file %s, aborting.....)r   r<   r$   rP   openreplacer'   putFilereadrD   close)r)   srctreedstfhfpathnamer   r   r   	copy_file|   s   
zServiceInstall.copy_filec              
   C   s   d }|d D ]u}|d t jks|d t jkr{|d d d }d}zNz| j|}| jj|dttd W n   tj	dd	d
 t
d|  Y ntd|  t|}W |dkr`| j|  |S  |S W |dkrn| j| q|dkrz| j| w w q|S )NBuffer	shi1_typeshi1_netnamer   ra   )creationOptionrO   Texc_infozshare '%s' is not writable.zFound writable share %s)r   STYPE_DISKTREESTYPE_SPECIALr'   connectTreeopenFiler	   r
   r   debugrD   r<   rP   disconnectTree)r)   shareswriteableSharer   r(   tidr   r   r   findWritableShare   s:   z ServiceInstall.findWritableSharec           	   
   C   s  | j  rtd | j   | ` d S d}d}z~|  }| || _| jd u r*W dS | | j	| j| j
 d}|  }|dkr| j  }| j dkrMd}n|dkrYd|| jf }nd	| j }| || j|}d}|dkrtd
| j  z	t| j| W n   Y t| j| t| j| W dS W dS  ty } zYtd|  tjddd zt| j|tj W n   Y |du rz| j | j| j
 W n   Y |du rz	t| j| W n   Y W Y d }~dS W Y d }~dS W Y d }~dS d }~ww )Nz Authenticated as Guest. AbortingFTr   zadmin$z%systemroot%r   z\\%s\%sz\\127.0.0.1\zStarting service %s.....z2Error performing the installation, cleaning up: %srO   rs   )r'   isGuestSessionr   rD   logoffrG   r~   r(   rm   r#   r"   r^   getServerNamelowerrZ   r<   r!   r   hRStartServiceWrN   rS   rO   ry   hRControlServiceSERVICE_CONTROL_STOP
deleteFilerR   )	r)   
fileCopiedserviceCreatedr{   
svcManager
serverNamerW   servicerX   r   r   r   install   st   





&

zServiceInstall.installc                 C   s~  d}d}z`|   }|dkrQt| j|| jd }|d }td| j  zt| j|tj W n   Y td| j  t	| j| t
| j| t
| j| td| j  | j| j| j W d S  ty   td zt| j|tj W n   Y |du rz| j| j| j W n   z| j| j| j W n   Y Y |du rzt	| j| W Y d S    Y Y d S Y d S w )	NTr   rH   rJ   zStopping service %s.....zRemoving service %s.....zRemoving file %s.....z0Error performing the uninstallation, cleaning up)r^   r   rM   rN   r!   r   r<   r   r   rR   rS   r"   r'   r   r(   rO   rD   )r)   r   r   r   rF   r   r   r   r   	uninstall   sP   
zServiceInstall.uninstall)r   N)__name__
__module____qualname__r.   propertyr,   r3   r4   rG   rZ   r^   rm   r~   r   r   r   r   r   r   r      s    


:r   )r   r   impacket.dcerpc.v5r   r   r   impacketr   r   r   impacket.smbconnectionr   impacket.smb3structsr	   r
   r   r   r   r   r   <module>   s   