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mZm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ e ¡ dkrTedƒ‚de d¡ d	kr_d
ndZG dd„ dejƒZG dd„ dej ƒZ!G dd„ dej ƒZ"dd„ Z#dZ$dZ%dZ&dZ'dZ(e$e%B e&B e'B Z)e)e(B Z*e#ƒ e"j+j,kr¤e)e(B dB Z-ne)e(B dB Z-dZ.dZ/dZ0dZ1dZ2dZ3dZ4d Z5dZ6d!Z7d"Z8d#Z9d$Z:d%Z;dZ<dZ=d&Z>d'Z?d(Z@d"ZAd'ZBd(ZCd&ZDd)ZE	 ejFZGeGjHZIejJj
eI_KejjLjMZNejJj
eN_KeGjOZOejJj
eO_KeZPejjLjQZRee
e
ePe
e
efeR_SejJjeR_Ke Te¡ZUe Te
¡ZVejjLjWZWd*eW_SeeW_KejjLjXZXeefeX_Se	eX_KejjLjYZYefeY_Se	eY_KejjLjZZZe
e	e
feZ_SeeZ_Kejj[j\Z\ee
ee
e
e
e
fe\_Se	e\_Kd+d,„ Z]d-d.„ Z^d/d0„ Z_d6d1d2„Z`d3d4„ Zaebd5k�r{eaƒ  dS dS )7é    N)	ÚHANDLEÚBOOLÚDWORDÚHWNDÚ	HINSTANCEÚHKEYÚLPVOIDÚLPWSTRÚPBOOL)Úc_ulongÚc_char_pÚc_intÚc_void_pÚWinErrorÚget_last_errorÚwindll)Úenable_debug_privilegeÚWindowsz/This script will ovbiously only work on Windowsé   ÚPé    FTc                   @   sh   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )ÚMINIDUMP_TYPEr   é   é   é   r   é   r   é@   é€   é   i   é   i   é   i    i @  i €  é   é   é   é   é   iÿÿ N)Ú__name__Ú
__module__Ú__qualname__ÚMiniDumpNormalÚMiniDumpWithDataSegsÚMiniDumpWithFullMemoryÚMiniDumpWithHandleDataÚMiniDumpFilterMemoryÚMiniDumpScanMemoryÚMiniDumpWithUnloadedModulesÚ&MiniDumpWithIndirectlyReferencedMemoryÚMiniDumpFilterModulePathsÚMiniDumpWithProcessThreadDataÚ"MiniDumpWithPrivateReadWriteMemoryÚMiniDumpWithoutOptionalDataÚMiniDumpWithFullMemoryInfoÚMiniDumpWithThreadInfoÚMiniDumpWithCodeSegsÚMiniDumpWithoutAuxiliaryStateÚMiniDumpWithFullAuxiliaryStateÚ"MiniDumpWithPrivateWriteCopyMemoryÚ MiniDumpIgnoreInaccessibleMemoryÚMiniDumpWithTokenInformationÚMiniDumpWithModuleHeadersÚMiniDumpFilterTriageÚMiniDumpValidTypeFlags© r@   r@   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minidump/utils/createminidump.pyr      s0    r   c                   @   s4   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )ÚWindowsBuildi(
  iÎ  ip  i°  ið#  i€%  i (  iZ)  i98  i×:  N)r&   r'   r(   ÚWIN_XPÚWIN_2K3Ú	WIN_VISTAÚWIN_7ÚWIN_8ÚWIN_BLUEÚWIN_10_1507ÚWIN_10_1511ÚWIN_10_1607ÚWIN_10_1707r@   r@   r@   rA   rB   -   s    rB   c                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚWindowsMinBuildiÄ	  i¸  iˆ  iX  i@  i¸$  iH&  N)
r&   r'   r(   rC   rD   rE   rF   rG   rH   ÚWIN_10r@   r@   r@   rA   rM   9   s    rM   c                  C   sF   G dd„ dt jƒ} tt jjdƒ}| ƒ }t  | ¡|_|t  |¡ƒ |jS )Nc                   @   sD   e Zd Zdejfdejfdejfdejfdejfdejd fgZdS )	z&getWindowsBuild.<locals>.OSVersionInfoÚdwOSVersionInfoSizeÚdwMajorVersionÚdwMinorVersionÚdwBuildNumberÚdwPlatformIdÚszCSDVersionr   N)r&   r'   r(   Úctypesr   Úc_charÚ_fields_r@   r@   r@   rA   ÚOSVersionInfoD   s    úrX   ÚGetVersionExA)	rU   Ú	StructureÚgetattrr   Úkernel32ÚsizeofrO   ÚbyrefrR   )rX   ÚGetVersionExÚversionr@   r@   rA   ÚgetWindowsBuildC   s   ra   r!   r"   r#   r$   r%   iÿÿ  iÿ  r   r   r   i    i   é   é   l        i   @i    i   r   r   r   i  r@   c                 C   s>   t ƒ }t| t |¡ƒ}|dkrt d¡ ttƒ ƒ t|j	ƒ S )Nr   z#Failed to get process version info!)
r   ÚIsWow64ProcessrU   r^   ÚloggingÚwarningr   r   ÚboolÚvalue)Úprocess_handleÚis64Úresr@   r@   rA   Úis64bitProcº   s   

rl   c                  C   sz   t d } | ƒ }t ƒ }tt |¡t |¡t |¡ƒ}|dkr't ttƒ ƒ¡ g S t	|j
t t ƒ ¡ ƒ}dd„ |d |… D ƒS )Nr    r   c                 S   ó   g | ]}|‘qS r@   r@   )Ú.0Úir@   r@   rA   Ú
<listcomp>Ô   ó    zenum_pids.<locals>.<listcomp>)r   ÚEnumProcessesrU   r^   r]   re   Úerrorr   r   Úintrh   )Ú	max_arrayÚpProcessIdsÚpBytesReturnedrk   Ú	nReturnedr@   r@   rA   Ú	enum_pidsÃ   s   ýry   c                  C   s¦   i } t ƒ D ]K}d| |< tttB d|ƒ}|d u r$t d|ttƒ ƒf ¡ qtj	t
 ƒ }tdƒ}t|d|t |¡ƒ}|dkrIt d|ttƒ ƒf ¡ q|j ¡ | |< q| S )Nz	Not foundFz:[Enum Processes]Failed to open process PID: %d Reason: %s r    r   zD[Enum Proceses]Failed GetProcessImageFileName on PID: %d Reason: %s )ry   ÚOpenProcessÚPROCESS_QUERY_INFORMATIONÚPROCESS_VM_READre   Údebugr   r   rU   rV   ÚMAX_PATHr   ÚQueryFullProcessImageNamer^   rh   Údecode)Úpid_to_nameÚpidri   Ú
image_nameÚmax_pathrk   r@   r@   rA   Úenum_process_names×   s   
r…   c           
      C   sX  |rt  d¡ tƒ }ddg| }t  d| ¡ t  d|  ¡ ttd| ƒ}|d u r9t  d|  ¡ t  ttƒ ƒ¡ d S t  d| ¡ t	|ƒ}|t
krYt  d	t
sOd
nd|sTd
ndf ¡ t  d¡ t|ttB dd ttd ƒ}|dkr}t  d¡ t  ttƒ ƒ¡ d S t  d¡ t|| ||dddƒ}	t|	ƒs�t  d¡ t  ttƒ ƒ¡ t  d¡ t|ƒ t|ƒ d S )NúEnabling SeDebugPrivilegeÚfailureÚsuccessúSeDebugPrivilege assignment %szOpening process PID: %dFzFailed to open process PID: %dzProcess handle: 0x%04xz]process architecture mismatch! This could case error! Python arch: %s Target process arch: %sÚx86Úx64z$Creating file handle for output filer   éÿÿÿÿzFailed to create filezDumping process to filezFailed to dump process to filezDump file created succsessfully)re   r}   r   rz   ÚPROCESS_ALL_ACCESSrf   rs   r   r   rl   ÚIS_PYTHON_64Ú
CreateFileÚFILE_GENERIC_READÚFILE_GENERIC_WRITEÚFILE_CREATE_ALWAYSÚFILE_ATTRIBUTE_NORMALÚMiniDumpWriteDumprg   ÚinfoÚCloseHandle)
r‚   Úoutput_filenameÚmindumptypeÚ
with_debugÚassignedÚmsgri   rj   Úfile_handlerk   r@   r@   rA   Úcreate_dumpì   s:   
"




r�   c                  C   s   dd l } | jdd�}|jddddd� |jd	d
dddd� |jdd�}d|_d|_|jddd�}|jddd�}|jdd�}|jddtdd� |jdddd� |jddd dd!� | 	¡ }|j
dkrhtjtjd"� n|j
d#krutjtjd"� ntjd#d"� tjtjB }|jr™t d$¡ tƒ }d%d&g| }	t d'|	 ¡ |jdkr¾tƒ }
d(d)„ |
D ƒ}| ¡  |D ]}t d*||
| f ¡ q®d S |jdk�r|jrÚt d+|j ¡ t|j|j||jd,� |j�rtƒ }
|
D ]!}|
|  |j¡d-k�rt d+| ¡ t||j||jd,�  d S qãt d.¡ d S d S d S )/Nr   z.Tool to create process dumps using windows API)Údescriptionz-dz--with-debugÚ
store_truezbenable SeDebugPrivilege, use this if target process is not in the same user context as your script)ÚactionÚhelpz-vz	--verboseÚcountzverbosity, add more - see more)r    Údefaultr¡   Úcommands)r¡   TÚcommandÚenumzEnumerate running processesÚdumpzDump running process)Úrequiredz-pz--pidzPID of process to dump)Útyper¡   z-nz--namezName of process to dumpz-oz	--outfilezOutput .dmp file name)r¡   r¨   )Úlevelr   r†   r‡   rˆ   r‰   c                 S   rm   r@   r@   )rn   Úpr@   r@   rA   rp   1  rq   zmain.<locals>.<listcomp>zPID: %d Name: %szDumpig process PID %d)r™   rŒ   zFailed to find process by name!)ÚargparseÚArgumentParserÚadd_argumentÚadd_subparsersr¨   ÚdestÚ
add_parserÚadd_mutually_exclusive_grouprt   Ú
parse_argsÚverbosere   ÚbasicConfigÚINFOÚDEBUGr   r)   r+   r™   r}   r   r¥   r…   Úsortr•   r‚   r�   ÚoutfileÚnameÚfind)r¬   ÚparserÚ
subparsersÚenumerate_groupÚ
dump_groupÚtarget_groupÚargsr˜   rš   r›   r�   Útr‚   r@   r@   rA   Úmain  s^   



ýôrÃ   Ú__main__)F)cÚosÚsysrU   r¦   Úplatformre   ÚstructÚctypes.wintypesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Úminidump.utils.privilegesr   ÚsystemÚ	ExceptionÚcalcsizerŽ   ÚIntFlagr   ÚEnumrB   rM   ra   ÚDELETEÚREAD_CONTROLÚ	WRITE_DACÚWRITE_OWNERÚSYNCHRONIZEÚSTANDARD_RIGHTS_REQUIREDÚSTANDARD_RIGHTS_ALLrE   rh   r�   ÚFILE_SHARE_READÚFILE_SHARE_WRITEÚFILE_SHARE_DELETEÚFILE_FLAG_OPEN_REPARSE_POINTÚFILE_FLAG_BACKUP_SEMANTICSÚFILE_CREATE_NEWr’   ÚFILE_OPEN_EXISTINGÚFILE_OPEN_ALWAYSÚFILE_TRUNCATE_EXISTINGr�   r‘   ÚFILE_GENERIC_EXECUTEÚFILE_GENERIC_ALLÚFILE_ATTRIBUTE_READONLYÚFILE_ATTRIBUTE_HIDDENÚFILE_ATTRIBUTE_DIRECTORYr“   ÚFILE_ATTRIBUTE_REPARSE_POINTÚGENERIC_READÚFILE_READ_ATTRIBUTESr{   r|   r~   ÚpsapiÚPsapiÚGetProcessImageFileNameAÚGetProcessImageFileNameÚwintypesÚrestyper\   ÚQueryFullProcessImageNameAr   rr   ÚLPSECURITY_ATTRIBUTESÚCreateFileWr�   ÚargtypesÚPOINTERÚPHANDLEÚPDWORDÚGetCurrentProcessrd   r–   rz   ÚDbgHelpr”   rl   ry   r…   r�   rÃ   r&   r@   r@   r@   rA   Ú<module>   s¾    ,$
	




ù
	







	
!
8
ÿ