
    5i,                         d dl Z d dlZddlT ddlmZ  G d d          Z G d d          Z G d	 d
          Z G d d          ZdS )    N   )*)PROCESSOR_ARCHITECTUREc                       e Zd Zd Zd ZdS )VirtualSegmentc                 >    || _         || _        || _        d | _        d S N)startendstart_file_addressdata)selfr
   r   r   s       N/home/kali/Ninja/venv/lib/python3.11/site-packages/minidump/aminidumpreader.py__init__zVirtualSegment.__init__   s#    $*$(.$$)))    c                 .    | j         |k    o
|| j        k    S r	   )r
   r   )r   r
   r   s      r   inrangezVirtualSegment.inrange   s    	u		/tx/r   N)__name__
__module____qualname__r   r    r   r   r   r      s2          0 0 0 0 0r   r   c                   .    e Zd ZddZd Zd Zd Zd ZdS )	AMinidumpBufferedMemorySegment (  c                     |j         | _        |j        | _        |j        |j         z
  | _        |j        | _        || _        g | _        d S r	   )start_virtual_addressstart_addressend_virtual_addressend_address
total_sizer   	chunksizechunks)r   memory_segmentr!   s      r   r   z'AMinidumpBufferedMemorySegment.__init__   sG    %;$#7$"69]]$/*=$$.$+++r   c                 6    | j         |cxk    o
| j        k     nc S r	   )r   r   r   positions     r   r   z&AMinidumpBufferedMemorySegment.inrange    s*    		x	:	:	:	:$*:	:	:	:	::r   c                 D    |                      |          sd S | j        |z
  S r	   )r   r   r%   s     r   remaining_lenz,AMinidumpBufferedMemorySegment.remaining_len#   s)    	h		 
$		H	$$r   c                 l   K   |                      |dd           d {V }|                    ||          S )Nr   )readfind)r   file_handlepatternstartposr   s        r   r,   z#AMinidumpBufferedMemorySegment.find(   sA      yya,,	,	,	,	,	,	,$	7H	%	%%r   c                   K   |N|                     | j        |z              d {V  |                    | j        | j        |z   z
             d {V S | j        D ]9}|                    ||          r!|j        ||j        z
  ||j        z
           c S :| j        d| j	        z  k    r| j        }t          d|| j                  }|                     | j                   d {V  |                    |           d {V |_        | j                            |           |j        ||j        z
  ||j        z
           S t          ||z
  | j	                  }||z   | j        k    r
| j        |z
  }t          |||z   | j        |z             }|                     |j                   d {V  |                    |           d {V |_        | j                            |           |j        ||j        z
  ||j        z
           S )N   r   )seekr   r+   r   r"   r   r   r
   r    r!   r   appendmax)r   r-   r
   r   chunkr!   vss          r   r+   z#AMinidumpBufferedMemorySegment.read,   sN     [			$1E9	:	::::::::  !1T5Lu5T!UVV
V
V
V
V
V
VV{ > >emmE3 >:eek)3+<<====> 
_$.(((9q)T%<==2			$1	2	22222222##I........27;b
'%"("C"(N2
333u9t~..)
Y)))%'9eU9_d.E.MNN"./////////""9--------"'+R	!3>1	22r   Nr   )r   r   r   r   r   r(   r,   r+   r   r   r   r   r      sd           ; ; ;% % %
& & &3 3 3 3 3r   r   c                   ~    e Zd ZddZd ZddZd ZddZd	 Zd
 Z	ddZ
d Zd Zd Zd Zd Zd Zd Zd ZddZdS )AMinidumpBufferedReaderr   c                 L    || _         g | _        || _        d | _        d | _        d S r	   )readermemory_segmentssegment_chunk_sizecurrent_segmentcurrent_position)r   r;   r=   s      r   r   z AMinidumpBufferedReader.__init__I   s/    $+$.$$$r   c                 T  K   | j         D ](}|                    |          r|| _        || _         dS )| j        j         D ]X}|                    |          rAt          || j                  }| j                             |           || _        || _         dS Yt          d|z            )z

		N)r!   z4Memory address 0x%08x is not in process memory space)	r<   r   r>   r?   r;   r   r=   r3   	Exception)r   requested_positionr#   
newsegments       r   _select_segmentz'AMinidumpBufferedReader._select_segmentQ   s      
 ,  n/00 )D.D
FF 3  n/00 /$JabbbJ
+++%D.D
FF 	HK]]^^^r   r   c                   K   |dk    r| j         j        |z   }n6|dk    r| j        |z   }n%|dk    r| j         j        |z
  }nt	          d          | j                             |          st	          d          || _        dS )aD  
		Changes the current address to an offset of offset. The whence parameter controls from which position should we count the offsets.
		0: beginning of the current memory segment
		1: from current position
		2: from the end of the current memory segment
		If you wish to move out from the segment, use the 'move' function
		r   r   r1   z.Seek function whence value must be between 0-2z5Seek would cross memory segment boundaries (use move)N)r>   r   r?   r   rA   r   )r   offsetwhencets       r   r2   zAMinidumpBufferedReader.seekg   s       q[[)F211{{v%11{{'&011	C	D	DD			%	%a	(	( L	J	K	KK$&r   c                 @   K   |                      |           d{V  dS )z@
		Moves the buffer to a virtual address specified by address
		N)rD   )r   addresss     r   movezAMinidumpBufferedReader.move~   s3       	W%%%%%%%%%&r   Nc                    K   |$| j         j        j        t          j        k    rd}nd}| j        |z  }|dk    rdS ||z
  |z  }|                     |d           d{V  dS )zD
		Repositions the current reader to match architecture alignment
		N      r   r   )r;   sysinfoProcessorArchitecturer   AMD64r?   r2   )r   	alignmentrF   offset_to_aligneds       r   alignzAMinidumpBufferedReader.align   s       
k/3I3OOOIII 9,&q[[	6 6)Y6		#Q'''''''''&r   c                     | j         S )z)
		Returns the current virtual address
		)r?   )r   s    r   tellzAMinidumpBufferedReader.tell   s     
	r   c                   K   | j         |z   }| j                            |dz
            st          d          | j                            | j        j        | j         | j        j        z
  || j        j        z
             d{V S )z@
		Returns up to length bytes from the current memory segment
		r   #Would read over segment boundaries!N)r?   r>   r   rA   r+   r;   r-   r   )r   lengthrH   s      r   peekzAMinidumpBufferedReader.peek   s       f$!			%	%a!e	,	, :	8	9	99#(()@$BWZ^ZnZ|B|  @A  DH  DX  Df  @f  g  g  
g  
g  
g  
g  
g  
g  gr   r*   c                 8  K   |dk     rt          d          |dk    rt| j                            | j                  }|sdS | j        }| j        j        | _        | j                            | j        j        || j        j        z
  d           d{V S | j        |z   }| j        	                    |dz
            st          d          | j        }|| _        | j                            | j        j        || j        j        z
  || j        j        z
             d{V S )z
		Returns data bytes of size size from the current segment. If size is -1 it returns all the remaining data bytes from memory segment
		r*   zYou shouldnt be doing thisNr   rX   )
rA   r>   r(   r?   r   r+   r;   r-   r   r   )r   sizerH   old_new_poss       r   r+   zAMinidumpBufferedReader.read   s_      
BYY	/	0	00	RZZ))$*?@@1
 4&;/;4$))$+*A;QUQeQsCsuyzz
z
z
z
z
z
zz
d"!			%	%a!e	,	, :	8	9	99%+$#(()@+PTPdPrBrtux|  yM  y[  u[  \  \  
\  
\  
\  
\  
\  
\  \r   c                 (  K   | j         j        j        t          j        k    r8|                     d           d{V }t                              |dd          S |                     d           d{V x}}t                              |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
		rM   NlittleT	byteordersignedrN   r;   rO   rP   r   rQ   r+   int
from_bytesr   rH   s     r   read_intz AMinidumpBufferedReader.read_int   s       
[.2H2NNNYYq\\1
..4.
@
@@11q
..4.
@
@@r   c                 $  K   | j         j        j        t          j        k    r8|                     d           d{V }t                              |dd          S |                     d           d{V }t                              |dd          S )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
		rM   Nr_   Fr`   rN   rc   rf   s     r   	read_uintz!AMinidumpBufferedReader.read_uint   s       
[.2H2NNNYYq\\1
..5.
A
AAYYq\\1
..5.
A
AAr   c                    K   | j                             | j        j        |           d{V }|dk    rdS || j        z   S )z:
		Searches for a pattern in the current memory segment
		Nr*   )r>   r,   r;   r-   r?   )r   r.   poss      r   r,   zAMinidumpBufferedReader.find   sS       "''(?IIIIIIII#BYY
"	t$	$$r   c                    K   g }d}	 | j                             | j        j        ||dz              d{V }|dk    rn#|                    || j         j        z              Y|S )zp
		Searches for all occurrences of a pattern in the current memory segment, returns all occurrences as a list
		r*   Tr   N)r>   r,   r;   r-   r3   r   )r   r.   rk   
last_founds       r   find_allz AMinidumpBufferedReader.find_all   s       	#*?*//0GR\_`R`aaaaaaaa:B	::j4/==>>>	? 
*r   c                    K   | j                             |           d{V }t          |          dk    rdS |d         S )zx
		Searches for the pattern in the whole process memory space and returns the first occurrence.
		This is exhaustive!
		Nr   r*   )r;   searchlen)r   r.   pos_ss      r   find_globalz#AMinidumpBufferedReader.find_global   sL      
 ""7++
+
+
+
+
+
+%ZZ1__
"	q/r   c                 F   K   | j                             |           d{V S )z
		Searches for the pattern in the whole process memory space and returns a list of addresses where the pattern begins.
		This is exhaustive!
		N)r;   rp   )r   r.   s     r   find_all_globalz'AMinidumpBufferedReader.find_all_global   s0      
 {!!'**	*	*	*	*	*	**r   c                 p   K   |                      |           d {V  |                                  d {V S r	   )rK   ri   )r   rk   s     r   get_ptrzAMinidumpBufferedReader.get_ptr   sJ      		#~~						r   c                 d  K   | j         j        j        t          j        k    r[|                     |           d {V  |                     d           d {V }t                              |dd          }|dz   |z   S |                     |           d {V  | 	                                 d {V S )NrN   r_   Tr`   )
r;   rO   rP   r   rQ   rK   r+   rd   re   ri   )r   rk   rH   ptrs       r   get_ptr_with_offsetz+AMinidumpBufferedReader.get_ptr_with_offset  s      	[.2H2NNN	3YYq\\1	x$	?	?3
'C-	3  
 
 
 
 
 
  r   Fc                 ^   K   | j                             ||||| j                   d {V }|S )N)
find_firstreverse_orderr!   )r;   search_moduler=   )r   module_namer.   r|   r}   rH   s         r   find_in_modulez&AMinidumpBufferedReader.find_in_module  sb      K%%k7er  @D  @W%  X  X  X  X  X  X  X  X!	
(r   r7   )r   r	   )r*   )FF)r   r   r   r   rD   r2   rK   rT   rV   rZ   r+   rg   ri   r,   rn   rs   ru   rw   rz   r   r   r   r   r9   r9   H   s<          _ _ _,	 	 	 	.	 	 		 	 	 	   g g g\ \ \ \.A A AB B B% % %  	 	 	+ + +     ! ! !     r   r9   c                   8    e Zd Zd Zd
dZd ZddZddZd Zd	S )AMinidumpFileReaderc                     |j         j         | _         |j        | _        |j        r|j        j        | _        d| _        n|j        j        | _        d| _        |j        | _        |j        | _        d| _        d| _        |j        j	        t          j        t          j        fv rd| _        d| _        d S | j        j	        t          j        t          j        fv rd| _        d| _        d S t#          d| j        j	        z            )NTFrN   z<LrM   z<Qz<Unknown processor architecture %s! Please fix and submit PR!)modulesrO   memory_segments_64r<   is_fulldumpfilenamer-   sizeof_longunpack_longrP   r   rQ   AARCH64
sizeof_ptr
unpack_ptrINTELARMrA   )r   minidumpfiles     r   r   zAMinidumpFileReader.__init__  s    %-$,%$,$ &9I44 '6F44'$-!-$ $$/4J4PRhRp3qqq4?4???|).D.J.     4?4???	QTXT`Tvv	w	wwr   r   c                 $    t          | |          S )N)r=   )r9   )r   r=   s     r   get_buffered_readerz'AMinidumpFileReader.get_buffered_reader2  s    	 <N	O	O	OOr   c                     | j         D ]Z}t          j        |j                                                                      |                                          dk    r|c S [d S )Nr*   )r   ntpathbasenamenamelowerr,   )r   r   mods      r   get_module_by_namez&AMinidumpFileReader.get_module_by_name5  sd    \  coch%%'',,[->->-@-@AARGGJJJ H	r   Fc                 6  K   |                      |          }|t          d|z            g }| j        D ]c}|j        |j        cxk    r|j        k     rEn !||                    || j        ||           d {V z  }t          |          dk    r|du r|c S d|S )NzCould not find module! %sr|   r!   r   T)	r   rA   r<   baseaddressr   
endaddressasearchr-   rq   )	r   r   r.   r|   r}   r!   r   needlesmss	            r   r~   z!AMinidumpFileReader.search_module;  s      ,,#[	.<	=	=='   b	o1BBBBCNBBBBBRZZ)9
`iZjjjjjjjjjG
7||aJ$..^^^	.r   c                 p   K   g }| j         D ])}||                    || j        ||           d {V z  }*|S )Nr   )r<   r   r-   )r   r.   r|   r!   rH   r   s         r   rp   zAMinidumpFileReader.searchH  sZ      !  d dbbjj$"2Ybjccccccccc11	
(r   c                    K   | j         D ];}|                    |          r$|                    ||| j                   d {V c S <t	          dt          |          z            )NzAddress not in memory range! %s)r<   r   areadr-   rA   hex)r   	virt_addrr\   segments       r   r+   zAMinidumpFileReader.readO  s      % B Bgooi   By$0@AAAAAAAAAAAB3c)nnDEEEr   Nr7   )FFr   )Fr   )	r   r   r   r   r   r   r~   rp   r+   r   r   r   r   r     s        x x x8P P P P        F F F F Fr   r   )	structr   common_structsstreams.SystemInfoStreamr   r   r   r9   r   r   r   r   <module>r      s          < < < < < <	0 	0 	0 	0 	0 	0 	0 	0/3 /3 /3 /3 /3 /3 /3 /3bH H H H H H H HZ>F >F >F >F >F >F >F >F >F >Fr   