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mZ d dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZ dd Zd$d
dZG dd dZG dd dZG dd dZd%dee dededededepmededefddZdd  Zd!d" Zed#kre  dS dS )&    N)logger)PureWindowsPath)List)SMBConnectionFactory)SMBFilec                 C   s   i 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}t d|  t j}|sHtd|  | \}}t|}| }t|||  S )NB   K   KBM   MBGi   @GBTl        TBPl           PBEl            EBZl            ZBYl               YBz#^\s*([\d\.]+)\s*([KMGTPEZY]?B?)\s*$zInvalid size format: )	rematchstrip
IGNORECASE
ValueErrorgroupsfloatupperint)size_strunitsr   numberunit r(   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/examples/smbdownloader.pyconvert_size   sT   	
r*      c                 C   sN   |  dd dd}tdd|}tdd|}t||kr%|| d  }|S )N\_/z[<>:"/\\|?*]z\s+)replacer   sublen)unc_path
max_lengthfilenamer(   r(   r)   flatten_unc_path_to_filename4   s   r5   c                   @      e Zd Zdd Zdd ZdS )FileTargetGenc                 C   
   || _ d S N)r4   )selfr4   r(   r(   r)   __init__F      
zFileTargetGen.__init__c              
      s   zEd}t | jd0}|D ]%}| }|dkrq|tt |fI d H  tdI d H  |d7 }qW d    n1 s=w   Y  |d fW S  t	y\ } z
||fW  Y d }~S d }~ww )Nr   r r   )
openr4   r   putstruuiduuid4asynciosleep	Exception)r:   target_qcntflineer(   r(   r)   runI   s$   

zFileTargetGen.runN__name__
__module____qualname__r;   rL   r(   r(   r(   r)   r7   E       r7   c                   @   r6   )ListTargetGenc                 C   r8   r9   )targets)r:   rS   r(   r(   r)   r;   Y   r<   zListTargetGen.__init__c              
      s   z+d}| j D ] }|d7 }| }|tt |fI d H  tdI d H  q|d fW S  tyB } z
||fW  Y d }~S d }~ww )Nr   r   )	rS   r   r@   rA   rB   rC   rD   rE   rF   )r:   rG   rH   targetrK   r(   r(   r)   rL   \   s   

zListTargetGen.runNrM   r(   r(   r(   r)   rR   X   rQ   rR   c                   @   s4   e Zd ZdddZdefddZd	d
 Zdd ZdS )SMBDownloaderFTr   c                 C   sb   t || _g | _i | _d | _d| _dtj 	d | _
d | _|| _|| _|| _|| _|| _d S )Nr   zsmbget_errors_%s.txtz%Y%m%d_%H%M%S)r   from_urlsmb_mgrtarget_gens_SMBDownloader__skip_targetstask_q_SMBDownloader__total_targetsdatetimenowstrftime_SMBDownloader__error_filenametarget_gen_taskshow_progress
flat_names	max_fsizestore_errorssilent)r:   smb_urlra   rb   rc   rd   re   r(   r(   r)   r;   k   s   
zSMBDownloader.__init__excc                 C   s   d|t |f }|dt|j7 }| jdu r#| jdu r!t| d S t| j	d}|
|d  W d    d S 1 s<w   Y  d S )NzTarget: %s
Error: %s
r>   Faz
)rA   join	traceback	format_tb__traceback__rd   re   printr?   r_   write)r:   target_addressrT   rg   errorstrrI   r(   r(   r)   __write_errory   s   

"zSMBDownloader.__write_errorc                    s\   | j D ]'}|| jI d H \}}|  j|7  _|d ur"td|  | jd I d H  qd S )NzTarget gen error! %s)rX   rL   rZ   r[   rm   r@   )r:   
target_gentotalerrr(   r(   r)   __target_gen   s   
zSMBDownloader.__target_genc              
      s  z)t  | _t |  | _	 | j I d H }|d u r W dS |\}}t|j}| j	du r6t
d||f }|dddd }|| jv rGq| j|}|4 I d H  | I d H \}}|d urm|| j|< | ||| t|}	|	|dI d H \}}|d ur| ||| 	 W d   I d H  q|	j| jkr| jd	u rtd
|  	 W d   I d H  q| jdu rtjd| |	jdddd}
n| jd	u rtd|  t|d:}|	 2 z,3 d H W \}}|d ur| ||| q|d u r n|| | jdu r|
t| q6 W d    n	1 sw   Y  W d   I d H  n1 I d H s&w   Y  q tyB } z
d	|fW  Y d }~S d }~ww )NT)TNz%s_%sz\\r>   r,   r   r=   FzFile %s is too large, skipping!zDownloading %sr   r
   )descrs   r'   
unit_scaleunit_divisorwb) rD   QueuerZ   create_task_SMBDownloader__target_genr`   getr   namerb   r5   r/   splitrY   rW   create_connection_newtargetlogin_SMBDownloader__write_errorr   from_uncpathr?   sizerc   re   rm   ra   tqdmread_chunkedrn   updater1   rF   )r:   ttidrT   	file_namero   
connectionr-   rt   smbfilepbarrI   datarK   r(   r(   r)   rL      sp   









 *4zSMBDownloader.runN)FTr   FF)rN   rO   rP   r;   rF   r   r|   rL   r(   r(   r(   r)   rU   j   s
    
rU   FTr   rS   
from_stdinverbosera   rb   rc   rd   re   c	                    s  |dkrt tj |dkr"t d t d tjtjd t|}t	| |||||d}	g }
t
|dkrF|du rF|	jttj n"|D ]}zt|d}|  |	jt| W qH   |
| Y qHt
|
dkrv|	jt|
 t
|	jdkrtd d S |	 I d H S )	Nr      T)level)ra   rb   rc   rd   re   r   r=   z#[-] No suitable targets were found!)r   setLevelloggingDEBUGrD   get_event_loop	set_debugbasicConfigr*   rU   r1   rX   appendrR   sysstdinr?   closer7   rm   rL   )rf   rS   r   r   ra   rb   rc   rd   re   smbgetnotfilerT   rI   r(   r(   r)   smbdownloader   s2   

r   c               
      s  dd l } | jdd}|jddddd |jdd	d
dd |jddd
dd |jdd
dd |jdd
dd |jdd
dd |jdtddd |jddd |jdddd  | }t|j|j|j|j	|j
|j |j|j|j	I d H \}}|d urtd!|  td" td d S )#Nr   zSMB File downloader)descriptionz-vz	--verbosecount)actiondefaultz-sz--stdin
store_truezRead targets from stdin)r   helpz-ez--store-errorszStore errors in a filez--silentzDo not show any outputz--no-flat-namesznDo not flatten file names. This will keep the original file name, but will overwrite files with the same name.z
--progresszShow progressz
--max-size1Mz;Maximum length of the flattened file name. Default is 1 MB.)typer   r   urlzdConnection URL base, target can be set to anything. Example: "smb2+ntlm-password://TEST\victim@test")r   rS   *z1UNC paths of file eg. \\HOST\SHARE\file_or_folder)nargsr   z[-] Error! %sr   )argparseArgumentParseradd_argumentrA   
parse_argsr   r   rS   r   r   progressno_flat_namesmax_sizerd   re   rm   r   exit)r   parserargsr-   rt   r(   r(   r)   amain   s$   6
r   c                   C   s   t t  d S r9   )rD   rL   r   r(   r(   r(   r)   main  s   r   __main__)r+   )r   FTr   FF)r   r   r\   rj   r   r   aiosmbr   rB   rD   pathlibr   typingr   !aiosmb.commons.connection.factoryr   aiosmb.commons.interfaces.filer   r*   r5   r7   rR   rU   rA   boolr#   r   r   r   rN   r(   r(   r(   r)   <module>   s0   
#4`"
