o
    Žõ±j%  ã                   @   s¼   d dl Z d dlZd dlT d dlmZ d dlZG dd„ dƒZG dd„ dƒZG dd	„ d	ƒZG d
d„ dƒZ	e
dkr\dZeedƒ�Ze	 e ¡ ¡ZW d  ƒ n1 sOw   Y  eeeƒƒ dS dS )é    N)Ú*)Úsha1c                   @   ó8   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
S )ÚCredHistú
	c                 C   s   d | _ d | _d S ©N)ÚversionÚguid©Úself© r   úš/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/dpapi/structures/masterkeyfile.pyÚ__init__   s   
zCredHist.__init__c                 C   ó   t  t | ¡¡S r   )r   Úfrom_bufferÚioÚBytesIO©Údatar   r   r   Ú
from_bytes   ó   zCredHist.from_bytesc                 C   s.   t ƒ }tj|  d¡ddd�|_|  d¡|_|S ©Né   ÚlittleF©Úsignedé   )r   Úintr   Úreadr   r	   ©ÚbuffÚskr   r   r   r      s   zCredHist.from_bufferc                 C   ón   d}| j D ]/}t| j | tƒr't| j | ƒD ]\}}|d||t|ƒf 7 }qq|d|t| j | ƒf 7 }q|S )Nz== CredHist ==
ú   %s: %s: %sú	%s: %s 
©Ú__dict__Ú
isinstanceÚlistÚ	enumerateÚstr©r   ÚtÚkÚiÚitemr   r   r   Ú__str__!   ó   
ÿzCredHist.__str__N©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústaticmethodr   r   r0   r   r   r   r   r      s    

r   c                   @   r   )Ú	DomainKeyr   c                 C   ó(   d | _ d | _d | _d | _d | _d | _d S r   )r   Úsecret_lengthÚaccess_check_lengthr	   ÚsecretÚaccess_checkr
   r   r   r   r   .   ó   
zDomainKey.__init__c                 C   r   r   )r8   r   r   r   r   r   r   r   r   6   r   zDomainKey.from_bytesc                 C   sz   t ƒ }tj|  d¡ddd�|_tj|  d¡ddd�|_tj|  d¡ddd�|_|  d¡|_|  |j¡|_|  |j¡|_	|S r   )
r8   r   r   r   r   r:   r;   r	   r<   r=   r   r   r   r   r   :   s   zDomainKey.from_bufferc                 C   r"   )Nz== DomainKey ==
r#   r$   r%   r+   r   r   r   r0   E   r1   zDomainKey.__str__Nr2   r   r   r   r   r8   +   s    


r8   c                   @   s@   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	dS )Ú	MasterKeyz?
	Represents a key, which can be for a masterkey or backupkey
	c                 C   r9   r   )r   ÚsaltÚiteration_countÚhash_algorithmÚcrypto_algorithmr   r
   r   r   r   r   S   r>   zMasterKey.__init__c                 C   r   r   )r?   r   r   r   r   r   r   r   r   [   r   zMasterKey.from_bytesc                 C   sˆ   t ƒ }tj|  d¡ddd�|_|  d¡|_tj|  d¡ddd�|_ttj|  d¡ddd�ƒ|_ttj|  d¡ddd�ƒ|_	|  ¡ |_
|S r   )r?   r   r   r   r   r@   rA   Ú
ALGORITHMSrB   rC   r   r   r   r   r   r   _   s   
zMasterKey.from_bufferc                 C   sØ  | j tjkr	t}nt| j  d }t| j d t| j d  }d}d}t|ƒ|k rr| j|jdddd� }|d7 }t	 
|||¡ ¡ }t| jd ƒD ] }t	 
|||¡ ¡ }	t |tj¡t |	tj¡A  t|	ƒtj¡}qG||7 }t|ƒ|k s(|d |… }
|
d t| j d … }|
t| j d d … d t| j d … }t| j d |t| j d	 |d
�}| | j¡}|dd … }|d d… }|dd … d t| j  d … }t	 
|||¡ ¡ }t	 
|||¡ ¡ }|d t| j  d … |krê|S d S )Né   r   é   ó    r   ÚbigFr   é   )ÚmodeÚIViÀÿÿÿr   )rB   rD   Ú	CALG_HMACr   ÚALGORITHMS_DATArC   Úlenr@   Úto_bytesÚhmacÚnewÚdigestÚrangerA   r   r   ÚsysÚ	byteorderÚdecryptr   )r   ÚkeyÚ	hash_typeÚkeylenÚtemp_key_blobr.   ÚUÚderivedÚ_ÚactualÚtemp_keyÚ	crypt_keyÚivÚcipherÚ	cleartextÚkey_decÚ	hmac_saltÚhmac_resÚhmac_keyÚ	hmac_calcr   r   r   rV   j   s8   ,ù	("zMasterKey.decryptc                 C   r"   )Nz== MasterKey ==
r#   r$   r%   r+   r   r   r   r0   ‘   r1   zMasterKey.__str__N)
r3   r4   r5   r6   r   r7   r   r   rV   r0   r   r   r   r   r?   O   s    


'r?   c                   @   r   )ÚMasterKeyFilez¸
	A masterkeyfile is a file that can hold multiple different keys, namely the masterkey, backupkey, credential history key, domainkey. 
	Not necessarily all of them present in a file
	c                 C   s^   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d S r   )r   Úunk1Úunk2r	   Úunk3ÚpolicyÚflagsÚmasterkey_lengthÚbackupkey_lengthÚcredhist_lengthÚdomainkey_lengthÚ	masterkeyÚ	backupkeyÚcredhistÚ	domainkeyr
   r   r   r   r   ¡   s   
zMasterKeyFile.__init__c                 C   r   r   )ri   r   r   r   r   r   r   r   r   ³   r   zMasterKeyFile.from_bytesc                 C   s„  t ƒ }tj|  d¡ddd�|_tj|  d¡ddd�|_tj|  d¡ddd�|_|  d¡ d¡|_tj|  d¡ddd�|_	tj|  d¡ddd�|_
tj|  d¡ddd�|_tj|  d¡ddd�|_tj|  d¡ddd�|_tj|  d¡ddd�|_tj|  d¡ddd�|_|jdkr“t |  |j¡¡|_|jdkr¢t |  |j¡¡|_|jdkr±t |  |j¡¡|_|jdkrÀt |  |j¡¡|_|S )	Nr   r   Fr   éH   z	utf-16-leé   r   )ri   r   r   r   r   rj   rk   Údecoder	   rl   rm   rn   ro   rp   rq   rr   r?   rs   rt   r   ru   r8   rv   r   r   r   r   r   ·   s*   



zMasterKeyFile.from_bufferc                 C   r"   )Nz== MasterKeyFile ==
r#   r$   r%   r+   r   r   r   r0   Ò   r1   zMasterKeyFile.__str__Nr2   r   r   r   r   ri   œ   s    

ri   Ú__main__z…C:\Users\victim\AppData\Roaming\Microsoft\Protect\S-1-5-21-3448413973-1765323015-1500960949-1105\4c9764dc-aa99-436c-bb30-ff39b3dd407cÚrb)r   rT   Úpypykatz.dpapi.constantsÚhashlibr   rP   r   r8   r?   ri   r3   ÚfilenameÚopenÚfr   r   ÚmkfÚprintr*   r   r   r   r   Ú<module>   s    $MBÿû