
    [
#g1B                     N   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZmZmZ d dlmZ d dlmZmZ d dlmZ  ej,                  e      Z	 dZd dlZd"d
ededefdZ d
ejB                  defdZ"dedefdZ#dedefdZ$dej&                  jJ                  defdZ& G d dej&                  jN                        Z( G d de(      Z) G d de(      Z* G d de(      Z+ G d de(      Z, G d de(      Z- G d  d!e-      Z.y# e$ r dZej9                  d	       Y w xY w)#    N)wraps)AnyCallableDictListTuple)text_filter)
interfaces	renderers)format_hintsTFz&Disassembly library capstone not foundvaluewidthreturnc                 \   t        | t              st        dt        |              d}d}t	        |       D ]W  \  }}||ddz  }t        |      }|d|cxk  rdk  rn n|ndz  }||z  |d	z
  k(  s;||z  }|t        |       d	z
  k  r|dz  }d}Y |r|d
|t        |      z
  z  z  }||z  }|S )zRenders HexBytes as text.

    Args:
        value: A series of bytes to convert to text

    Returns:
        A text representation of the hexadecimal bytes plus their ascii equivalents, separated by newline characters
    z#hex_bytes_as_text takes bytes not:  
02x     ~   .   z   )
isinstancebytes	TypeErrortype	enumeratechrlen)r   r   
printablesoutputcountbytechars          O/home/panchajanya/Development/work/volatility3/volatility3/cli/text_renderer.pyhex_bytes_as_textr&      s     eU#=d5k]KLLJF 'tT#Ja. 4ydd2d2d;
5=EAI%j Fs5zA~%$J ( %53z?233*M    c                    | j                   rt        |       S t        | | j                  d      }| j                  rRt        |       dz  dz
  t        |      cxk  rt        |       dz  k  r#n n dj                  |j                  d            S t        |      dz
  t        |j                  d      d         cxk  rt        |      k  r!n t        |       S |j                  d      d   S t        |       S )zRenders the bytes as a string where possible, otherwise it displays hex data

    This attempts to convert the string based on its encoding and if no data's been lost due to the split on the null character, then it displays it as is
    replace)encodingerrors   r   r    r   )show_hexr&   strr*   split_nullsr   joinsplit)r   string_representations     r%   multitypedata_as_textr4   <   s    
 ~~ ''yQ	Ua!	$9 :Ns5zA~Nyy.44V<==!"Q&$**62156	&$%	&
 U## %**62155U##r'   funcc                 H     t               dt        dt        f fd       }|S )Nxr   c                     t        | t        j                  j                        rt        | t        j                        ryy |       S )NN/A-)r   r
   r   BaseAbsentValueNotApplicableValue)r7   r5   s    r%   wrappedzoptional.<locals>.wrappedR   s8    a--==>!Y99:Awr'   r   r   r/   r5   r=   s   ` r%   optionalr@   Q   s.    
4[3 3   Nr'   c                 H     t               dt        dt        f fd       }|S )Nr7   r   c                     t              |       }|dk(  s|dk(  ryt        | t        j                        r| j                  r| S t        | t
              r-t        | t        j                  t        j                  f      s| S d| dS )Nr:   r9   r   ")r@   r   r   MultiTypeDataconverted_intintHexBin)r7   resultr5   s     r%   r=   z quoted_optional.<locals>.wrapped_   s    $"S=FeOa334Xaj  ,"2"23'
 X6(!}r'   r>   r?   s   ` r%   quoted_optionalrJ   ^   s.    
4[
3 
3 
 
 Nr'   disasmc                    t         r<t        j                  t        j                  t        j                        t        j                  t        j                  t        j
                        t        j                  t        j                  t        j                        t        j                  t        j                  t        j                        d}d}| j                  e|| j                     j                  | j                  | j                        D ]/  }|d|j                  dd|j                   d|j                   z  }1 |S t!        j"                  t$           | j                        S )zRenders a disassembly renderer type into string format.

    Args:
        disasm: Input disassembly objects

    Returns:
        A string as rendered by capstone where available, otherwise output as if it were just bytes
    )intelintel64armarm64r   z
0xr7   z:		)CAPSTONE_PRESENTcapstoneCsCS_ARCH_X86
CS_MODE_32
CS_MODE_64CS_ARCH_ARMCS_MODE_ARMCS_ARCH_ARM64architecturerK   dataoffsetaddressmnemonicop_strQuickTextRenderer_type_renderersr   )rK   disasm_typesr!   is       r%   display_disassemblyre   o   s    [[!5!5x7J7JK{{8#7#79L9LM;;x33X5I5IJ[[!7!79M9MN	
 *!&"5"56==V]] D1SBqxxjII ,,U3FKK@@r'   c                   <    e Zd ZU dZdZdZdZej                  e	d<   y)CLIRendererz5Class to add specific requirements for CLI renderers.unnamedFNfilter)
__name__
__module____qualname____doc__namestructured_outputri   r	   	CLIFilter__annotations__ r'   r%   rg   rg      s     ?D$(FK!!(r'   rg   c                   h   e Zd Zej                   ed       ej                   ed       ej                   ee      ej                   e
e      ej                  j                   ee      e ed       ej"                   ed       d ed       iZdZd Zd	ej                  j*                  d
dfdZy)ra   c                     d| dS N0bbrr   r7   s    r%   <lambda>zQuickTextRenderer.<lambda>       r!AZr'   c                     d| dS N0xr7   rr   rx   s    r%   ry   zQuickTextRenderer.<lambda>   rz   r'   c                 N    dj                  | D cg c]  }|d c}      S c c}w Nr   r   r1   r7   rw   s     r%   ry   zQuickTextRenderer.<lambda>   !    #((+B1qgJ+B"C+B   "c                 $    | j                  d      S Nz%Y-%m-%d %H:%M:%S.%f %Zstrftimerx   s    r%   ry   zQuickTextRenderer.<lambda>       ajj9R.Sr'   defaultc                     |  S Nrr   rx   s    r%   ry   zQuickTextRenderer.<lambda>       fr'   quickc                      y r   rr   selfs    r%   get_render_optionsz$QuickTextRenderer.get_render_options       r'   gridr   Nc                     t         j                  }g }j                  D ]  }|j                  |j                            |j                  dj                  dj                  |                   dt        j                  j                  f fd}j                  sj                  ||       nj                  d||       |j                  d       y)Renders each column immediately to stdout.

        This does not format each line's width appropriately, it merely tab separates each field

        Args:
            grid: The TreeGrid object to render
        z
{}
rQ   nodec                 d   g }t        j                        D ]\  \  }}j                  j                  |j                  j                  d         }|j                   || j                  |                ^ j                  rj                  j                  |      r|S |j                  d       |j                  dt        d| j                  dz
        z  | j                  dk  rdndz          |j                  dj                  d	j                  |                   |j                          |S )
Nr   r   *r   r   r   r   z{}rQ   )r   columnsrb   getr   appendvaluesri   writemax
path_depthformatr1   flush)r   accumulatorlinecolumn_indexcolumnrendererr   r   s         r%   visitorz)QuickTextRenderer.render.<locals>.visitor   s   D(1$,,(?$f//33KK!5!5i!@ HT[[%>?@	 )@ {{t{{11$7""d#c!T__q011//Q.2S: dkk$))D/:;r'   Nr   functioninitial_accumulatorr   )sysstdoutr   r   rn   r   r   r1   r
   r   TreeNode	populatedpopulatevisit)r   r   outfdr   r   r   s   ``    r%   renderzQuickTextRenderer.render   s     

llFKK6;;-) # 	HOODIIdO45	*..77 	* ~~MM'5)JJD7JNDr'   )rj   rk   rl   r   rH   r@   rG   HexBytesr&   rD   rJ   r4   r
   r   Disassemblyre   r   datetimerb   rn   r   TreeGridr   rr   r'   r%   ra   ra      s    (#78(#78x(9:""O4I$J(((3F*GxCD8$ST8,-	O D,://88 ,T ,r'   ra   c                   R    e Zd ZdZdZd Zdej                  j                  ddfdZ	y)NoneRendererzOutputs no resultsnonec                      y r   rr   r   s    r%   r   zNoneRenderer.get_render_options   r   r'   r   r   Nc                 D    |j                   s|j                  d d       y y )Nc                      y)NTrr   )r7   ys     r%   ry   z%NoneRenderer.render.<locals>.<lambda>   s    tr'   T)r   r   )r   r   s     r%   r   zNoneRenderer.render   s    ~~MM+T2 r'   )
rj   rk   rl   rm   rn   r   r
   r   r   r   rr   r'   r%   r   r      s.    D3://88 3T 3r'   r   c                   l   e Zd Zej                   ed       ej                   ed       ej                   ee      ej                   ee
      ej                  j                   ee      e ed       ej                    ed       d ed       iZdZdZd	 Zd
ej                  j*                  ddfdZy)CSVRendererc                     d| dS ru   rr   rx   s    r%   ry   zCSVRenderer.<lambda>   rz   r'   c                     d| dS r|   rr   rx   s    r%   ry   zCSVRenderer.<lambda>   rz   r'   c                 N    dj                  | D cg c]  }|d c}      S c c}w r   r   r   s     r%   ry   zCSVRenderer.<lambda>   r   r   c                 $    | j                  d      S r   r   rx   s    r%   ry   zCSVRenderer.<lambda>   r   r'   r   c                     |  S r   rr   rx   s    r%   ry   zCSVRenderer.<lambda>   r   r'   csvTc                      y r   rr   r   s    r%   r   zCSVRenderer.get_render_options   r   r'   r   r   Nc                     t         j                  }dg}j                  D ]  }|j                  |j                            t        j                  ||dd      }|j                          dt        j                  j                  f fd}j                  sj                  ||       nj                  d||       |j                  d       y)	zoRenders each row immediately to stdout.

        Args:
            grid: The TreeGrid object to render
        	TreeDepthr   \)lineterminator
escapecharr   c                    dt        t        d| j                  dz
              i}g }t        j                        D ]z  \  }}j
                  j                  |j                  j
                  d         } || j                  |         ||j                   <   |j                  ||j                             | j                  rj                  j                  |      r|S |j                  |       |S )Nr   r   r   r   )r/   r   r   r   r   rb   r   r   r   rn   r   ri   writerow)	r   r   rowr   r   r   r   r   r   s	          r%   r   z#CSVRenderer.render.<locals>.visitor  s    C4??Q+>$? @ACD(1$,,(?$f//33KK!5!5i!@ )1\1J(Kv{{m%C6;;-12 )@ {{t{{11$7""  %r'   Nr   )r   r   r   r   rn   r   
DictWriterwriteheaderr
   r   r   r   r   r   r   )r   r   r   header_listr   writerr   s   ``     r%   r   zCSVRenderer.render   s     

"mllF&++0 # ;t
 		*..77 	" ~~MM'6*JJD7JODr'   )rj   rk   rl   r   rH   r@   rG   r   r&   rD   r4   r
   r   r   re   r   r   rb   rn   ro   r   r   r   rr   r'   r%   r   r      s    (#78(#78x(9:""H-B$C(((3F*GxCD8$ST8,-	O D(://88 (T (r'   r   c                   v    e Zd Zej                  ZdZd Zdej                  j                  ddfdZ
dedefdZy)	PrettyTextRendererprettyc                      y r   rr   r   s    r%   r   z%PrettyTextRenderer.get_render_options!  r   r'   r   r   Nc                     t         j                  }t         j                  j                  d       d}d}dj	                  d t        d      D              t        j                  D cg c]#  }|j                  t        |j                        f% c}      dt        j                  j                  dt        t        t        t         t        j                  j"                  t$        f   f      d	t        t        t        t         t        j                  j"                  t$        f   f      f fd
}g }j&                  sj)                  ||       nj+                  d||       dt-        j/                  d            z   dz   g}t1        j                        D ]G  \  }	}|j3                  dt-        |	dz         z   dz   |z   t-        |j                           z   dz          I |j	                  |      dz   }
dgj                  D cg c]  }|j                   c}z   }|j                   |
j4                  |        |D ]
  \  }}t7        |D cg c]  }t        ||          c}      }|D ]   }||   dg|t        ||         z
  z  z   ||<   " t        |      D ]  }|dk(  rS|j                   |
j4                  d|z  gj                  D cg c]  } j9                  ||   |          c}        [|j                   |
j4                  d|z  gj                  D cg c]  } j9                  ||   |          c}          yc c}w c c}w c c}w c c}w c c}w )r   zFormatting...
>z | r   c              3      K   | ]8  }t        j                  t        j                  t        j                  z          : y wr   )randomchoicestringascii_uppercasedigits).0_s     r%   	<genexpr>z,PrettyTextRenderer.render.<locals>.<genexpr>5  s-      %
FGFMM&006==@A%
s   >A    r   r   r   c                    t        j                  d      | j                        <   i }g }t        
j                        D ]  \  }}j
                  j                  |j                  j
                  d         } || j                  |         }t        | j                  d      D cg c]  }t        j                  |             c}      }	t        j                  |j                  t        |j                              |	      |j                  <   |j                  d      ||<   |j                  |        j                  rj                  j                  |      r|S |j                  | j                  |f       |S c c}w )Nr   r   r   )r   r   r   r   r   rb   r   r   r2   r   tab_stoprn   r   ri   )r   r   r   rendered_liner   r   r   r\   r7   field_widthr   max_column_widthsr   tree_indent_columns             r%   r   z*PrettyTextRenderer.render.<locals>.visitor<  s\   
 58!%%&8!<doo501 DM(1$,,(?$f//33KK!5!5i!@  L 9:!7;fOOD4IJqSq)*J 25%))&++s6;;7GH+2!&++.  $zz$/V$$T* )@ {{t{{11-@""67 Ks   +!F
Nr   z{0:<r   zs}{r   :r   r   r   )r   r   stderrr   r1   rangedictr   rn   r   r
   r   r   r   r   rF   r   Columnr   r   r   r   r/   r   r   r   r   r   r   )r   r   r   display_alignmentcolumn_separatorr   r   final_outputformat_string_listr   format_stringcolumn_titlesdepthr   	nums_lineindexr   r   s   ``              @@r%   r   zPrettyTextRenderer.render$  sV    



*+ WW %
KPQS9%
 
 !;?<<Hfkk3v{{+,H
	&&//	eCj.B.B.I.I5.P)Q$QRS	 %T*"6"6"="=u"DEEFG	 	> TV~~MM'<0JJD7JU S*../A1EFFM
 %.dll$; L&%%lQ&'( $$ '45	6
  %< )--.@ADH$,,GGG(M((-89'KE4TB6Sf.BCI#F|ty3tF|CT7T/UVV y)A:KK,,,%K /3ll$* !%d6l5.A B KK,,,%K /3ll$* !%d6l5.A B *	 (u Ip  H Cs   ,(MMM
M$'M)r   c                     d}|j                  d      dk\  rD|j                  d      }d|||z  z
  z  }|j                  d|d      }|j                  d      dk\  rD|S )N   rQ   r   r   r   )findr)   )r   r   	tab_widthrd   pads        r%   r   zPrettyTextRenderer.tab_stop  sb    	iio"		$Aa)m45C<<c1-D iio" r'   )rj   rk   rl   ra   rb   rn   r   r
   r   r   r   r/   r   rr   r'   r%   r   r     sM    '77ODg://88 gT gRS S r'   r   c                   >   e Zd Zej                   ee      ej                  j                   ee
      ej                   ee      e ed       ej                  d dd iZdZdZdeej                  j(                     fdZd	 Zd
ej                  j.                  fdZy)JsonRendererc                 N    dj                  | D cg c]  }|d c}      S c c}w r   r   r   s     r%   ry   zJsonRenderer.<lambda>  r   r   c                 n    t        | t        j                  j                        s| j	                         S d S r   )r   r
   r   r;   	isoformatrx   s    r%   ry   zJsonRenderer.<lambda>  s0    a!5!5!E!EF KKM r'   r   c                     | S r   rr   rx   s    r%   ry   zJsonRenderer.<lambda>  s    Qr'   JSONTr   c                      y r   rr   r   s    r%   r   zJsonRenderer.get_render_options  r   r'   c           	      p    |j                  dj                  t        j                  |dd                   y)z6Outputs the JSON data to a file in a particular formatz{}
r,   T)indent	sort_keysN)r   r   jsondumps)r   r   rI   s      r%   output_resultzJsonRenderer.output_result  s$    FMM$**VA"NOPr'   r   c                 (    t         j                  }|j                  d       i g f}dt        j                  j
                  dt        t        t        t        t        t        f   f   t        t        t        t        f      f   dt        t        t        t        t        t        f   f   t        t        t        t        f      f   f fd}j                  sj                  ||       nj                  d ||        j                  ||d          y )Nr   r   r   r   c                    |\  }}dg i}g }t        
j                        D ]  \  }}j                  j                  |j                  j                  d         } |t        | j                        |         }	t        |	t        j                  j                        rd }	|	||j                  <   |j                  |	        j                  rj                  j                  |      r|S | j                  r,|| j                  j                     d   j                  |       n|j                  |       ||| j                  <   ||fS )N
__childrenr   )r   r   rb   r   r   listr   r   r
   r   r;   rn   r   ri   parentpath)r   r   acc_map
final_tree	node_dictr   r   r   r   r\   r   r   s             r%   r   z$JsonRenderer.render.<locals>.visitor  s    
 #.GZ)5r(:ID(1$,,(?$f//33KK!5!5i!@  T[[ 1, ?@dJ$8$8$H$HID)-	&++&D! )@ {{t{{11$7""{{((),7>>yI!!),!*GDIIZ((r'   r   r   )r   r   r   r
   r   r   r   r   r/   r   r   r   r   r   r
  )r   r   r   r   r   s   ``   r%   r   zJsonRenderer.render  s    

D H 	
	)&&//	)tCc3h$78$tCH~:NNO	) 4T#s(^+,d4S>.BBC	): ~~MM'<0JJD7JU5,q/2r'   N)rj   rk   rl   r   r   rJ   r&   r
   r   r   re   rD   r4   r   r@   r   rb   rn   ro   r   RenderOptionr   r
  r   r   rr   r'   r%   r   r     s    /@A((/:M*N""O4I$JxCD 

 	;O DD)=)=)J)J$K Q+3://88 +3r'   r   c                       e Zd ZdZd Zy)JsonLinesRendererJSONLc                     |D ]9  }|j                  t        j                  |d             |j                  d       ; y)z&Outputs the JSON results as JSON linesT)r  r   N)r   r  r	  )r   r   rI   r   s       r%   r
  zJsonLinesRenderer.output_result  s/    DKK

4489KK r'   N)rj   rk   rl   rn   r
  rr   r'   r%   r  r    s    Dr'   r  )   )/r   r   r  loggingr   r   r   	functoolsr   typingr   r   r   r   r   volatility3.clir	   volatility3.frameworkr
   r   volatility3.framework.renderersr   	getLoggerrj   vollogrR   rS   ImportErrordebugr   rF   r/   r&   rD   r4   r@   rJ   r   re   Rendererrg   ra   r   r   r   r   r  rr   r'   r%   <module>r%     sW         
  3 3 ' 7 8			8	$;U 3  @$!;!; $ $*
8 
 
( x "A
 4 4 @ @ AS A6)*&&// )= =@
3; 
3:+ :zw wtC3; C3L K  ;
LL9:;s   D	 	D$#D$