o
    ji                     @   s   d dl Z d dlmZ d dlT ddlT G dd dZG dd dZed	krce je j	d
 dZ
ee
Zeejjd eeZeej eeeZe ZejD ]Zeeeje  qQed dS dS )    N)pypykatz)*   c                   @   s    e Zd Zdd Zedd ZdS )RekallModulec                 C   s   d | _ d | _d | _d | _d S N)name
start_addrend_addrsizeself r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/commons/readers/rekall/rekallreader.py__init__   s   
zRekallModule.__init__c                 C   s@   t  }t| j |_t| j|_t| j|_	|j|j	 |_
|S r   )r   strBaseDllNamelowerr   intDllBaser   SizeOfImager
   r	   )modulermr   r   r   from_module   s   zRekallModule.from_moduleN)__name__
__module____qualname__r   staticmethodr   r   r   r   r   r      s    r   c                   @   s   e Zd Zd)ddZdd Zed)ddZed)dd	Zd
d Zdd Z	d*ddZ
dd Zdd Zdd Zdd Z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S ),RekallReaderNc                 C   s@   d| _ d| _d| _d| _d| _i | _|| _d| _|| _d| _	dS )z
		Timestamp override will change the msv_dll_timestamp value.
		If None > no change
		If 0 > it disables the ANIT_MIMIKATZ structs on certain builds
		If 1 > it enforces to use the ANTI_MIMIKATZ structs on certain builds
		N)
session
lsass_taskcctask_ascur_posmodulestimestamp_overrideprocessor_architectureBuildNumbermsv_dll_timestamp)r   r$   buildnumberr   r   r   r   "   s   
zRekallReader.__init__c                 C   sp   | j j | _|   | j | _|  | _| j	s| 
 | _	| jr2| jdkr*dt_n| jdkr2dt_|   d S )Nr   iGSr   i HS)r   pluginsr    search_lsassr   get_process_address_spacer!   get_archr%   r&   get_buildnumberr$   sysinfor'   load_modulesr   r   r   r   setup8   s   



zRekallReader.setupc                 C   s@   t d|   tj| g dt dddddgd}t|||S )	NzInvoking recall on file %s)rsdspewindows_kernel_filer   fulll       
 z4https://github.com/google/rekall-profiles/raw/masterz#http://profiles.rekall-forensic.com)filename
autodetectloggerautodetect_build_localautodetect_scan_lengthprofile_path)logginginfor   Session	getLoggerr   from_session)memory_filer$   r(   rsessionr   r   r   from_memory_fileH   s   	zRekallReader.from_memory_filec                 C   s   t ||}| |_|  |S r   )r   r   r0   )r   r$   r(   rrr   r   r   r?   W   s   
zRekallReader.from_sessionc                 C   s   t | jjjS r   )r   r   PebOSBuildNumberr   r   r   r   r-   ^   s   zRekallReader.get_buildnumberc                 C   s&   | j jddd  dkrtjS tjS )Narch64)r   profilemetadataKatzSystemArchitectureX64X86r   r   r   r   r,   a   s   zRekallReader.get_archc                 C   sN   |du r| j tjkrd}nd}| j| }|dkrdS || | }| | dS )zD
		Repositions the current reader to match architecture alignment
		N      r   )r%   rK   rL   r"   read)r   	alignmentoffsetoffset_to_alignedr   r   r   alignf   s   

zRekallReader.alignc                 C   s   | j S )z)
		Returns the current virtual address
		r"   r   r   r   r   tellv   s   zRekallReader.tellc                 C   8   | j tjkrtj| ddddS tj| ddddS )z
		Reads an integer. The size depends on the architecture. 
		Reads a 4 byte small-endian singed int on 32 bit arch
		Reads an 8 byte small-endian singed int on 64 bit arch
		rN   littleT	byteordersignedrO   r%   rK   rL   r   
from_bytesrP   r   r   r   r   read_int|      zRekallReader.read_intc                 C   rW   )z
		Reads an integer. The size depends on the architecture. 
		Reads a 4 byte small-endian unsinged int on 32 bit arch
		Reads an 8 byte small-endian unsinged int on 64 bit arch
		rN   rX   FrY   rO   r\   r   r   r   r   	read_uint   r_   zRekallReader.read_uintc                 C   s   |  | |  S r   )mover`   r   posr   r   r   get_ptr   s   
zRekallReader.get_ptrc                 C   sJ   | j tjkr| | tj| dddd}|d | S | | |  S )NrO   rX   TrY   )r%   rK   rL   ra   r   r]   rP   r`   )r   rc   ptrr   r   r   get_ptr_with_offset   s   

z RekallReader.get_ptr_with_offsetc                 C   s
   || _ d S r   rU   rb   r   r   r   ra      s   
zRekallReader.movec                 C   s"   | j | j|}|  j|7  _|S r   r!   rP   r"   )r   r
   datar   r   r   rP      s   zRekallReader.readc                 C   s   | j | j|S r   rg   )r   r
   r   r   r   peek   s   zRekallReader.peekc                 C   sv   | j  | _| j  D ]-}t|| jt|j	 < t|j	 dkr8t
|j| _| jdkr8| jjd d| _qd S )Nz
msv1_0.dllr   zWARNING! msv.dll timestamp not found! This could cause errors with older windows builds. You might need to specify it manually for anti_mimikatz structs!)r   r+   r!   get_load_modulesr   r   r#   r   r   r   r   TimeDateStampr'   r   r;   r<   )r   r   r   r   r   r/      s   
zRekallReader.load_modulesc                 C   s   | j jd g }| j jjdd D ]}|| qt|dkr(| j jd t|dkr2td|d | _	| j
| j	 d S )NzSearching LSASS processz	lsass.exe)
proc_regexr   zAWARNING! Multiple processes matched the filter!! Using first one!r   zLSASS.exe not found!)r   r;   r<   r)   pslistfilter_processesappendlen	Exceptionr   r    SwitchProcessContext)r   taskstaskr   r   r   r*      s   
zRekallReader.search_lsassc                 C   s\   | j  D ]&}| j| j j}|std| t|j |kr!q| j	j
d |  S d S )NzCant get module! %szFound module!)r   rj   r!   vtop
obj_offsetrq   r   r   r   r   r;   r<   )r   module_namer   process_offsetr   r   r   load_module   s   zRekallReader.load_moduleFc           
      C   s   |  | jvrtd| | j|   }g }tjj|g| j d}| jj	
d|j  |jt|jt|jdD ]\}}	|t| q9|S )Nz'Module is not in lsass emmory space! %s)needlesaddress_spacezmodule.start_addr %s)rR   maxlen)r   r#   rq   rekallscanMultiStringScannerr   r+   r   r;   r<   r   r   r
   ro   )
r   rw   pattern
find_firstreverse_orderr   resscannerhit_r   r   r   find_in_module   s   "zRekallReader.find_in_module)NNr   )FF)r   r   r   r   r0   r   rB   r?   r-   r,   rT   rV   r^   r`   rd   rf   ra   rP   ri   r/   r*   ry   r   r   r   r   r   r   !   s,    



r   __main__)levelz
memory.dmprF   zDone!)r;   pypykatz.pypykatzr   pypykatz.commons.common r   r   r   basicConfigDEBUGr@   readerprintr   rI   rJ   KatzSystemInfofrom_rekallreaderr.   architecturepstartmimilogon_sessionsluidr   r   r   r   r   <module>   s(   	 ?


