o
    Žõ±jŽ  ã                   @   sX   d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
mZ G dd„ deƒZdS )é    N)Úlogger)Úhexdump)ÚTDESÚAESÚMODE_CFBÚMODE_CBC)ÚPackageDecryptorc                       s^   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
dd„ Z‡  ZS )ÚLsaDecryptor_NT6c                    s6   t ƒ  dd ||¡ || _d | _d | _d | _|  ¡  d S )NÚLsaDecryptor)ÚsuperÚ__init__Údecryptor_templateÚivÚaes_keyÚdes_keyÚacquire_crypto_material)ÚselfÚreaderr   Úsysinfo©Ú	__class__© úš/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/lsadecryptor/lsa_decryptor_nt6.pyr      s   zLsaDecryptor_NT6.__init__c                 C   sh   |   d¡ |  ¡ }| j |¡ | j d¡}|   dt||d� ¡ |  |¡| _|  |¡| _	|  
|¡| _d S )NzAcquireing crypto stuff...éP   z.Memory looks like this around the signature
%s©Ústart)ÚlogÚfind_signaturer   ÚmoveÚpeekr   Úget_IVr   Úget_des_keyr   Úget_aes_keyr   )r   ÚsigposÚdatar   r   r   r      s   
z(LsaDecryptor_NT6.acquire_crypto_materialc                 C   ó   |   d¡ |  || jjj¡S )NzAcquireing DES key...)r   Úget_keyr   Úkey_patternÚoffset_to_DES_key_ptr©r   Úposr   r   r   r!   "   ó   
zLsaDecryptor_NT6.get_des_keyc                 C   r%   )NzAcquireing AES key...)r   r&   r   r'   Úoffset_to_AES_key_ptrr)   r   r   r   r"   &   r+   zLsaDecryptor_NT6.get_aes_keyc                 C   s†   |   d¡ | jjd| jjjdd�}t|ƒdkr't d| jjj 	¡  ¡ t
dƒ‚|   dd	 d
d„ |D ƒ¡ ¡ |   d|d  ¡ |d S )Nz.Looking for main struct signature in memory...z
lsasrv.dllT)Ú
find_firstr   zsignature not found! %szLSA signature not found!z/Found candidates on the following positions: %sú c                 s   s   � | ]}t |ƒV  qd S )N)Úhex)Ú.0Úxr   r   r   Ú	<genexpr>1   s   € z2LsaDecryptor_NT6.find_signature.<locals>.<genexpr>zSelecting first one @ 0x%08x)r   r   Úfind_in_moduler   r'   Ú	signatureÚlenr   Údebugr/   Ú	ExceptionÚjoin)r   Úflr   r   r   r   *   s   
zLsaDecryptor_NT6.find_signaturec                 C   sT   |   d¡ | j || jjj ¡}| j |¡ | j | jjj¡}|   dt	|ƒ ¡ |S )Nz
Reading IVzIV data: %s)
r   r   Úget_ptr_with_offsetr   r'   Úoffset_to_IV_ptrr   ÚreadÚ	IV_lengthr   )r   r*   Úptr_ivr$   r   r   r   r    5   s   

zLsaDecryptor_NT6.get_IVc                 C   s  | j  || ¡}|  d| ¡ | j  |¡}|  d| ¡ | j  |¡ | j  d¡}|  dt||d� ¡ | j | j ¡}| 	¡ r~|j
j}| j  |¡ | j  d¡}|  dt||d� ¡ |j
 | j | jj¡}|  d|j ¡ | 	¡ r€|  dt|jjƒ ¡ |jjS d S d S )	Nzkey handle pointer is @ 0x%08xzkey handle is @ 0x%08xr   zBCRYPT_HANLE_KEY_DATA
%sr   zBCRYPT_KEY_DATA
%szHARD_KEY SIZE: 0x%xzHARD_KEY data:
%s)r   r:   r   Úget_ptrr   r   r   r   Úkey_handle_structÚverifyÚptr_keyÚvaluer<   Ú
key_structÚsizeÚhardkeyr$   )r   r*   Ú
key_offsetrB   r$   ÚkbhkÚkbkr   r   r   r&   G   s(   ÷zLsaDecryptor_NT6.get_keyé€   c                 C   sœ   d}t |ƒ}|rL|d r,t d| ¡ | jr| js|S t| jt| j|d�}| |¡}|S t d| ¡ | jr9| js;|S t	| jt
| jd d… ƒ}| |¡}|S )Nó    é   zAES-CFB - %s)ÚIVÚsegment_sizezTDES - size %s)r5   r   r6   r   r   r   r   Údecryptr   r   r   )r   Ú	encryptedrN   Ú	cleartextrE   Úcipherr   r   r   rO   [   s    
û
zLsaDecryptor_NT6.decryptc                 C   sh   |   d¡ |   d t| jƒ| j ¡ ¡¡ |   d t| jƒ| j ¡ ¡¡ |   d t| jƒ| j ¡ ¡¡ d S )NzRecovered LSA encryption keys
zIV ({}): {}zDES_KEY ({}): {}zAES_KEY ({}): {})r   Úformatr5   r   r/   r   r   )r   r   r   r   Údumpn   s   
"zLsaDecryptor_NT6.dump)rJ   )Ú__name__Ú
__module__Ú__qualname__r   r   r!   r"   r   r    r&   rO   rT   Ú__classcell__r   r   r   r   r	      s    	

r	   )Ú	tracebackÚpypykatzr   Úpypykatz.commons.commonr   Úunicrypto.symmetricr   r   r   r   Ú%pypykatz.lsadecryptor.package_commonsr   r	   r   r   r   r   Ú<module>   s   