
    Xf<                         d dl Z d dlZd dlZd dlmZm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 d dlmZ d dlmZ d d	lmZ  ej        e          Z G d
 dej        j                  ZdS )    N)packunpack)ListOptionalTuple)AESARC4DES)MD5)
interfaces	renderers)requirements)registry)hivelistc                      e Zd ZdZdZdZed             Zg dZg dZ	dZ
dZd	Zd
ZdZdZdZedej        defd            Zedej        deej        j                 fd            Zedej        dee         fd            Zedej        dedee         fd            Zededededee         fd            Zedej        dej        dedee eef                  fd            Z!ede"de eef         fd            Z#ed edefd!            Z$ed"e"deded#efd$            Z%edej        dej        dee         fd%            Z&dej        dej        fd&Z'd' Z(d(S ))HashdumpzDumps user hashes from memory)   r   r   )   r   r   c                 v    t          j        ddddg          t          j        dt          j        d          gS )	NkernelzWindows kernelIntel32Intel64)namedescriptionarchitecturesr   )r   r   r   )r   pluginversion)r   ModuleRequirementPluginRequirementr   HiveList)clss    `/home/panchajanya/Development/work/volatility3/volatility3/framework/plugins/windows/hashdump.pyget_requirementszHashdump.get_requirements   sR     *,()4  
 *(99  	
 		
    (   r   r   r   r      r%      r&      r'      r(      r)      r*      r+      r,      r-      r.      r/      r0      r1      r2       r3   #   r4   %   r5   &   r6   )   r7   *   r8   ,   r9   /   r:   1   r;   2   r<   4   r=   7   r>   8   r?   ;   r@   =   rA   >   rB   @   rC   C   rD   E   rE   F   rF   I   rG   J   rH   L   rI   O   rJ   Q   rK   R   rL   T   rM   W   rN   X   rO   [   rP   ]   rQ   ^   rR   a   rS   b   rT   d   rU   g   rV   h   rW   k   rX   m   rY   n   rZ   p   r[   s   r\   u   r]   v   r^   y   r_   z   r`   |   ra      rb      rc      rd      re      rf      rg      rh      ri      rj      rk      rl      rm      rn      ro      rp      rq      rr      rs      rt      ru      rv      rw      rx      ry      rz      r{      r|      r}      r~      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r      r   )r'      r%   r   r(   	   r)      r      r      r*   
      r&   s/   !@#$%^&*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&% s)   0123456789012345678901234567890123456789 s   NTPASSWORD s   LMPASSWORD s   KGS!@#$%s   Ӵ5Ӵ5s   1j1<Yhivekeyc                     d }	 |r|                     |          }nC# t          $ r6 t                              d|                                 d| d           Y nw xY w|S )Nz)Unable to load the required registry key \z from this memory image)get_keyKeyErrorvolloginfoget_name)r!   r   r   results       r"   get_hive_keyzHashdump.get_hive_keyI  s    	 +c** 	 	 	KKkDMMOOkkskkk    	 s    =AAsamhivereturnc                 v    d}|                      ||          }|sg S d |                                D             S )NzSAM\Domains\Account\Usersc                 (    g | ]}|j         d k    |S )Names)Name).0ks     r"   
<listcomp>z*Hashdump.get_user_keys.<locals>.<listcomp>_  s$    GGGaQVw5F5F5F5F5Fr$   )r   get_subkeys)r!   r   user_key_pathuser_keys       r"   get_user_keyszHashdump.get_user_keysU  sK     7##G];; 	IGG8//11GGGGr$   syshivec                     d}d|ddz   }g d}                      ||          }|sd S d}|D ]b}                      ||dz   |z             }d }	|r#|                    |j        dz   |j                  }	|	 d S ||	                    d	          z  }ct          j        |          t           fd
t          t                              D                       }
|
S )Nr   
ControlSet03z\Control\Lsa)JDSkew1GBGData r   r%   	utf-16-lec                 6    g | ]}j         |                  S  )bootkey_perm_table)r   ibootkey_strr!   s     r"   r   z(Hashdump.get_bootkey.<locals>.<listcomp>z  s&    UUU[/23UUUr$   )
r   readClassClassLengthdecodebinascii	unhexlifybytesrangelen)r!   r   cslsa_baselsa_keyslsabootkeylkr   
class_databootkey_scrambledr   s   `          @r"   get_bootkeyzHashdump.get_bootkeya  s    ''''*::111w11 	4 	6 	6B""7HtOb,@AACJ J$\\#)a-II
!ttz((555GG(11!UUUUUU3{CSCS=T=TUUU
 
 ! r$   r   c                    d}|sd S |                      ||          }|sd S d }|                                D ]=}|                                dk    r#|                    |j        dz   |j                  }>|sd S |d         }|dk    rt          j                    }|                    |dd         | j	        z   |z   | j
        z              |                                }	t          j        |	          }
|
                    |dd                   }|S |d	k    rS|d
d         }|dd         }t          j        |t          j        |          }|                    |          }|d d         S d S )NzSAM\Domains\AccountFr%   r   r   r[   rc      r   x      rw   r+   )r   
get_valuesr   r   r   
DataLengthhashlibmd5updateaqwertyanumdigestr	   newencryptr   MODE_CBCdecrypt)r!   r   r   sam_account_pathsam_account_keysam_datavrevisionr   rc4_keyrc4hbootkeyivencryptedHBootKeyciphers                  r"   get_hbootkeyzHashdump.get_hbootkey~  s    3 	4**74DEE 	4 ++-- 	B 	BAzz||s"""<<
ALAA 	4D>q==+--CJJxT	*S[87BSXMNNNjjllG(7##C{{d# H O]]$t)$B (d 3WWclB77F~~&788HCRC= tr$   r   enc_hashsaltc                    |                      |          \  }}t          j        |t          j                  }t          j        |t          j                  }	t	          j        |d d         t          j        |          }
|
                    |          }|                    |d d                   |	                    |dd                   z   S )Nr+   r'   )
sid_to_keyr
   r   MODE_ECBr   r   r   )r!   ridr   r   _lmntstrr  des_k1des_k2des1des2r   obfkeys               r"   decrypt_single_salted_hashz#Hashdump.decrypt_single_salted_hash  s     >>#..wvs|,,wvs|,,#2#d;;))||F2A2J''$,,1R4L+
 +
 
 	
r$   userc                    	 t          t          |                                          d          }n# t          $ r Y d S w xY wd }|                                D ]=}|                                dk    r#|                    |j        dz   |j                  }>|sd S t          d|dd                   d         dz   }t          d|dd	                   d         }t          d|d
d                   d         dz   }	t          d|dd                   d         }
||dz   |dz            }d }|dk    r4|dk    r-||dz   |dz            }| 	                    |||| j
                  }nJ|dk    rD|dk    r>||dz   |dz            }||dz   |dz            }|                     |||| j
        |          }d }||	dz   |	dz            }|dk    r4|
dk    r-||	dz   |	dz            }| 	                    |||| j                  }nJ|dk    rD|
dk    r>||	dz   |	dz            }||	dz   |	dz            }|                     |||| j        |          }||fS )Nr+   Vr%   <L   r   r      ru   rw      r{   r   r            r?   r=   r'      )intstrr   
ValueErrorr   r   r   r   r   decrypt_single_hashalmpasswordr  antpassword)r!   r  r   r   r  r   r   	lm_offsetlm_len	nt_offsetnt_lenlm_revisionlmhashenc_lm_hashlm_saltnthashnt_revisionenc_nt_hashnt_salts                      r"   get_user_hasheszHashdump.get_user_hashes  s   
	c$--//**B//CC 	 	 	44	"" 	B 	BAzz||s"""<<
ALAA 	44$t)!455a84?	htDy122154$t)!455a84?	htDy12215y1}y1}<='!!||&y4'7)d:J'JK00;  G##||"9q=9r>#AB&y2~	B'FG77; 
 y1}y1}<='!!||&y1}y2~'EF00;  G##||"9q=9r>#AB&y2~	B'FG77;  v~s   /2 
A A sidc                    |dz  |dz	  dz  |dz	  dz  |dz	  dz  g}||dd         z  }|d         g|dd         z   }||dd         z  }|                      t          |                    |                      t          |                    fS )zITakes rid of a user and converts it to a key to be used by the DES cipher   r'   r+   r  r   r   )sidbytes_to_keyr   )r!   r+  bytestr1bytestr2s       r"   r  zHashdump.sid_to_key  s     $JAXBY$BY$	
 	HQqSM!QK=8AaC=0HQqSM!""5??33S5H5H(OO6
 6
 
 	
r$   sc           	         |d         dz	  |d         dz  dz  |d         dz	  z  |d         dz  dz  |d         dz	  z  |d         dz  dz  |d         dz	  z  |d         d	z  dz  |d         dz	  z  |d         d
z  dz  |d         dz	  z  |d         dz  dz  |d         dz	  z  |d         dz  g}t          d          D ]&}||         dz  ||<   | j        ||                  ||<   't          |          S )z=Builds final DES key from the strings generated in sid_to_keyr   r   r   r   r   r   r&   r%   r   r2   ?   rb   r'   )r   
odd_parityr   )r!   r1  r   r   s       r"   r.  zHashdump.sidbytes_to_key  s    aDAIdTkaAaDAI.dTkaAaDAI.dTkaAaDAI.dTkaAaDAI.dTkaAaDAI.dTkaAaDAI.aD4K	
 q 	, 	,AVq[CF^CF+CFFSzzr$   r  lmntstrc                 &   |                      |          \  }}t          j        |t          j                  }t          j        |t          j                  }t	          j                    }	|	                    |d d         t          d|          z   |z              |	                                }
t          j        |
          }|	                    |          }|
                    |d d                   |
                    |dd                    z   S )Nr+   r  r'   )r  r
   r   r  r   r   r   r   r	   r   r   )r!   r  r   r   r5  r  r  r	  r
  r   r   r   r  s                r"   r  zHashdump.decrypt_single_hash  s     >>#..wvs|,,wvs|,,gii

8ETE?T$__4w>???**,,hwX&&||F2A2J''$,,122J+
 +
 
 	
r$   c                 x   d }|                                 D ]=}|                                dk    r#|                    |j        dz   |j                  }>|sd S t          d|dd                   d         dz   }t          d|dd                   d         }|t          |          k    rd S ||||z            }|S )	Nr  r%   r  r   r+   r   r  r  )r   r   r   r   r   r   r   )r!   r  r   valuer   name_offsetname_lengthusernames           r"   get_user_namezHashdump.get_user_name  s     "" 	? 	?Azz||s""QVaZ>> 	4T5d#344Q7$>T5d#344Q7U##4{['@@Ar$   c              #     K   |t                               d           |t                               d           |                     |          }|                     ||          }|r|                     |          D ]}|                     |||          }|r|\  }}|                     ||          }	|	t          j                    }	nt          |	dd          }	t          t          j        |p| j                  d          }
t          t          j        |p| j                  d          }t          t          |                                          d          }d|	||
|ffV  d S t                               d	           d S )
Nz,SYSTEM address is None: No system hive foundz&SAM address is None: No SAM hive foundr   ignore)errorszlatin-1r+   r   zHbootkey is not valid)r   debugr   r   r   r*  r<  r   NotAvailableValuer  r   hexlifyempty_lmempty_ntr  r   warning)selfr   r   r   r   r  retr#  r&  r   lmoutntoutr  s                r"   
_generatorzHashdump._generator3  s      ?LLGHHH?LLABBB""7++$$Wg66 	4**733 9 9**4(CC 9%(NFF  --dG<<D|(:<<"4XFFF 01H4= I I9UUE 01H4= I I9UUEc$--//22B77CtS%78888!9 9$ NN233333r$   c                    | j                             dd           }d }d }| j        j        | j         d                  }t          j                            | j        | j        |j        |j	        |d n|g          D ]}|
                                                    d          d                                         dk    r|}|
                                                    d          d                                         dk    r|}t          j        dt          fd	t           fd
t          fdt          fg|                     ||                    S )Noffsetr   )hive_offsetsr   SYSTEMSAMUserr  r#  r&  )configgetcontextmodulesr   r    
list_hivesconfig_path
layer_namesymbol_table_namer   splitupperr   TreeGridr  r  rJ  )rF  rL  r   r   r   r   s         r"   runzHashdump.runQ  s5   400%dk(&;<%00L$!'fX 1 
 
 
	 
	D }}$$T**2.4466(BB}}$$T**2.4466%??!c]UCL8S/Hc?KOOGW--
 
 	
r$   N))__name__
__module____qualname____doc___required_framework_version_versionclassmethodr#   r4  r   r   r   r  r  lmkeyrC  rD  r   RegistryHiver  r   r   r   objectsObjectInterfacer   r   r   r   r   r  CM_KEY_NODEr   r*  r  r  r.  r  r<  rJ  r]  r   r$   r"   r   r      s,       ''"+H

 

 [

A A AJH  ( BG8D!K!KERHRH	 5 	C 	 	 	 [	 	H+	H	j 0	1	H 	H 	H [	H !("7 !HUO ! ! ! [!8 &+&6;&	%& & & [&P 

!

-2

DI

	%

 

 

 [

 4'42:2G4SX4	%u%	&4 4 4 [4l 
S 
U5%<%8 
 
 
 [
  %    [" 

!&
27
BG
 
 
 [
" '2:2G	%   [&4,47?7L4 4 4 4<
 
 
 
 
r$   r   )r   r   loggingstructr   r   typingr   r   r   Crypto.Cipherr   r	   r
   Crypto.Hashr   volatility3.frameworkr   r   #volatility3.framework.configurationr   0volatility3.framework.symbols.windows.extensionsr   $volatility3.plugins.windows.registryr   	getLoggerr^  r   pluginsPluginInterfacer   r   r$   r"   <module>rv     s,              ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (       7 7 7 7 7 7 7 7 < < < < < < E E E E E E 9 9 9 9 9 9		8	$	$P	
 P	
 P	
 P	
 P	
z!1 P	
 P	
 P	
 P	
 P	
r$   