
    *1f@                     H   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n"# e$ r dZe                    d	           Y nw xY wd
edefdZd
ej         defdZ!dedefdZ"dedefdZ#dej        j$        defdZ% G d dej        j&                  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-dS )!    N)wraps)AnyCallableDictListTuple)text_filter)
interfaces	renderers)format_hintsTFz&Disassembly library capstone not foundvaluereturnc                    t          | t                    st          dt          |                      g }g }d}d}| D ]}|                    |d           |                    d|cxk     rdk    rn nt          |          nd           |dz  d	k    rV|d
z  }|d                    ||d	z
  |dz                      z  }|dz  }|d                    ||d	z
  |dz                      z  }|d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: r    02x    ~   .      
    	)
isinstancebytes	TypeErrortypeappendchrjoin)r   asciihexcountoutputbytes         O/home/panchajanya/Development/work/volatility3/volatility3/cli/text_renderer.pyhex_bytes_as_textr(      s+    eU## MKd5kkKKLLLE
CEF  

d==!!!$"5"5"5"5"5"5"5"5"5SYYY3???AI!dNFchhs519uqy#89:::FdNFbggeEAI	$9:;;;F
M    c                 4   | j         rt          |           S t          | | j        d          }| j        rht          |           dz  dz
  t          |          cxk    rt          |           dz  k    r+n n(d                    |                    d                    S t          |          dz
  t          |                    d          d                   cxk    rt          |          k    rn n|                    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_nullslenr!   split)r   string_representations     r'   multitypedata_as_textr6   7   s5   
 ~ ( '''yQQQ >	Ua!	$9 : :NNNNs5zzA~NNNNNyy.44V<<===!""Q&$**6221566	& 	& 	& 	&$%%	& 	& 	& 	& 	& %**622155U###r)   funcc                 Z     t                     dt          dt          f fd            }|S )Nxr   c                     t          | t          j        j                  rt          | t          j                  rdS dS  |           S )NN/A-)r   r
   r   BaseAbsentValueNotApplicableValue)r9   r7   s    r'   wrappedzoptional.<locals>.wrappedM   sG    a-=>> 	!Y9:: ustAwwr)   r   r   r1   r7   r?   s   ` r'   optionalrB   L   sF    
4[[3 3      [ Nr)   c                 Z     t                     dt          dt          f fd            }|S )Nr9   r   c                      t                    |           }|dk    s|dk    rdS t          | t          j                  r
| j        r| S t          | t
                    r)t          | t          j        t          j        f          s| S d| dS )Nr<   r;   r   ")rB   r   r   MultiTypeDataconverted_intintHexBin)r9   resultr7   s     r'   r?   z quoted_optional.<locals>.wrappedZ   s    $""S==FeOO2a344 	 	;a 	j ,"23'
 '
 	 ;6}}}r)   r@   rA   s   ` r'   quoted_optionalrL   Y   sF    
4[[
3 
3 
 
 
 
 
 [
 Nr)   disasmc                 L   t           rt          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	        L|| j	                 
                    | j        | j                  D ] }|d|j        dd|j         d|j         z  }!|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   Nz
0xr9   z:	r   )CAPSTONE_PRESENTcapstoneCsCS_ARCH_X86
CS_MODE_32
CS_MODE_64CS_ARCH_ARMCS_MODE_ARMCS_ARCH_ARM64architecturerM   dataoffsetaddressmnemonicop_strQuickTextRenderer_type_renderersr   )rM   disasm_typesr%   is       r'   display_disassemblyrf   j   s      [!5x7JKK{8#79LMM;x3X5IJJ[!79MNN	
 
 *!&"56==V]  J J IIIIIIqxIII,U3FK@@@r)   c                   4    e Zd ZU dZdZdZdZej        e	d<   dS )CLIRendererz5Class to add specific requirements for CLI renderers.unnamedFNfilter)
__name__
__module____qualname____doc__namestructured_outputrj   r	   	CLIFilter__annotations__ r)   r'   rh   rh      s6         ??D$(FK!(((((r)   rh   c                   @   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dS )rb   c                     d| dS N0bbrs   r9   s    r'   <lambda>zQuickTextRenderer.<lambda>       Z!ZZZ r)   c                     d| dS N0xr9   rs   ry   s    r'   rz   zQuickTextRenderer.<lambda>   r{   r)   c                 @    d                     d | D                       S )Nr   c                     g | ]}|d S r   rs   .0rx   s     r'   
<listcomp>z.QuickTextRenderer.<lambda>.<locals>.<listcomp>       +B+B+B1qJJ+B+B+Br)   r!   ry   s    r'   rz   zQuickTextRenderer.<lambda>   !    #((+B+B+B+B+B"C"C r)   c                 ,    |                      d          S Nz%Y-%m-%d %H:%M:%S.%f %Zstrftimery   s    r'   rz   zQuickTextRenderer.<lambda>       ajj9R.S.S r)   defaultc                     |  S Nrs   ry   s    r'   rz   zQuickTextRenderer.<lambda>       f r)   quickc                     d S r   rs   selfs    r'   get_render_optionsz$QuickTextRenderer.get_render_options       r)   gridr   Nc                     t           j        }g }j        D ]}|                    |j                    |                    d                    d                    |                               dt          j	        j
        f fd}j        s                    ||           n                    d||           |                    d           dS )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
{}
r   nodec                    j         r!j                              | j                  r|S |                    d           |                    dt          d| j        dz
            z  | j        dk    rdndz              g }t          t          j                            D ]c}j        |         }j        	                    |j
        j        d                   }|                     || j        |                              d|                    d                    d	                    |                               |                                 |S )
Nr   *r   r   r   r   r   z{}r   )rj   valueswritemax
path_depthranger3   columnsrc   getr   r   formatr!   flush)r   accumulatorlinecolumn_indexcolumnrendererr   r   s         r'   visitorz)QuickTextRenderer.render.<locals>.visitor   sP   { #t{11$+>> #""d###c!T_q0111/Q..22S:   D %c$,&7&7 8 8 A Al3/33K!5i!@  HHT[%>??@@@@dkk$))D//::;;;r)   Nr   functioninitial_accumulatorr   )sysstdoutr   r   ro   r   r   r!   r
   r   TreeNode	populatedpopulatevisit)r   r   outfdr   r   r   s   ``    r'   renderzQuickTextRenderer.render   s     
l 	* 	*FKK6;())))HOODIIdOO44555	*.7 	 	 	 	 	 	 	* ~ 	OMM'5))))JJD7JNNNDr)   )rk   rl   rm   r   rJ   rB   rI   HexBytesr(   rF   rL   r6   r
   r   Disassemblyrf   r   datetimerc   ro   r   TreeGridr   rs   r)   r'   rb   rb      s        ((#7#788((#7#788xx(9::"OO4I$J$J(((3F*G*GxxCCDD88$S$STT88,,--	O D  ,:/8 ,T , , , , , ,r)   rb   c                   @    e Zd ZdZdZd Zdej        j        ddfdZ	dS )NoneRendererzOutputs no resultsnonec                     d S r   rs   r   s    r'   r   zNoneRenderer.get_render_options   r   r)   r   r   Nc                 F    |j         s|                    d d           d S d S )Nc                     dS )NTrs   )r9   ys     r'   rz   z%NoneRenderer.render.<locals>.<lambda>   s    t r)   T)r   r   )r   r   s     r'   r   zNoneRenderer.render   s4    ~ 	3MM++T22222	3 	3r)   )
rk   rl   rm   rn   ro   r   r
   r   r   r   rs   r)   r'   r   r      sV        D  3:/8 3T 3 3 3 3 3 3r)   r   c                   D   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dS )CSVRendererc                     d| dS rv   rs   ry   s    r'   rz   zCSVRenderer.<lambda>   r{   r)   c                     d| dS r}   rs   ry   s    r'   rz   zCSVRenderer.<lambda>   r{   r)   c                 @    d                     d | D                       S )Nr   c                     g | ]}|d S r   rs   r   s     r'   r   z(CSVRenderer.<lambda>.<locals>.<listcomp>   r   r)   r   ry   s    r'   rz   zCSVRenderer.<lambda>   r   r)   c                 ,    |                      d          S r   r   ry   s    r'   rz   zCSVRenderer.<lambda>   r   r)   r   c                     |  S r   rs   ry   s    r'   rz   zCSVRenderer.<lambda>   r   r)   csvTc                     d S r   rs   r   s    r'   r   zCSVRenderer.get_render_options   r   r)   r   r   Nc                     t           j        }dg}j        D ]}|                    |j                    t          j        ||dd          }|                                 dt          j	        j
        f fd}j        s                    ||           n                    d||           |                    d           dS )	zoRenders each row immediately to stdout.

        Args:
            grid: The TreeGrid object to render
        	TreeDepthr   \)lineterminator
escapecharr   c                 v   dt          t          d| j        dz
                      i}t          t	          j                            D ]Y}j        |         }j                            |j        j        d                   } || j	        |                   ||j
         <   Z|                    |           |S )Nr   r   r   r   )r1   r   r   r   r3   r   rc   r   r   r   ro   writerow)r   r   rowr   r   r   r   r   s         r'   r   z#CSVRenderer.render.<locals>.visitor   s    C4?Q+>$?$? @ @AC %c$,&7&7 8 8 L Ll3/33K!5i!@  )1\1J(K(Kv{$%%  %%%r)   Nr   )r   r   r   r   ro   r   
DictWriterwriteheaderr
   r   r   r   r   r   r   )r   r   r   header_listr   writerr   s   ``     r'   r   zCSVRenderer.render   s     
"ml 	1 	1F&+/0000;t
 
 
 	
	*.7 
	 
	 
	 
	 
	 
	 
	 ~ 	PMM'6****JJD7JOOODr)   )rk   rl   rm   r   rJ   rB   rI   r   r(   rF   r6   r
   r   r   rf   r   r   rc   ro   rp   r   r   r   rs   r)   r'   r   r      s       ((#7#788((#7#788xx(9::"HH-B$C$C(((3F*G*GxxCCDD88$S$STT88,,--	O D  #:/8 #T # # # # # #r)   r   c                   Z    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dS )	PrettyTextRendererprettyc                     d S r   rs   r   s    r'   r   z%PrettyTextRenderer.get_render_options  r   r)   r   r   Nc                 8    t           j        }t           j                            d           d}d}d                    d t          d          D                       t          d j        D                       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                    ||           n                    d||           dt)                              d                    z   dz   g}t          t-          j                            D ][}j        |         }	|                    dt)          |dz             z   dz   |z   t)          |	j                           z   dz              \|                    |          dz   }
dgd j        D             z   }|                     |
j        |            |D ]\  }t5          fdD                       }D ]*}	|	         dg|t-          |	                   z
  z  z   |	<   +t          |          D ]wdk    r8|                     |
j        d|z  g fdj        D             R             @|                     |
j        d|z  g fdj        D             R             xdS )r   zFormatting...
>z | r   c              3   l   K   | ]/}t          j        t          j        t          j        z             V  0d S r   )randomchoicestringascii_uppercasedigits)r   _s     r'   	<genexpr>z,PrettyTextRenderer.render.<locals>.<genexpr>+  sG       %
 %
FGFM&06=@AA%
 %
 %
 %
 %
 %
r)      c                 D    g | ]}|j         t          |j                   fS rs   )ro   r3   r   r   s     r'   r   z-PrettyTextRenderer.render.<locals>.<listcomp>/  s)    HHHfk3v{++,HHHr)   r   r   r   c           	         t          	                    d          | j                  	<   
j        r!
j                            | j                  r|S i }t          t          j                            D ]}j        |         }
j                            |j	        
j        d                   } || j        |                   }t          
fd| 
                    d          D                       }t          	                    |j        t          |j                            |          	|j        <   |
                    d          ||<   |                    | j        |f           |S )Nr   r   c                 T    g | ]$}t                              |                    %S rs   )r3   tab_stop)r   r9   r   s     r'   r   z>PrettyTextRenderer.render.<locals>.visitor.<locals>.<listcomp>F  s-    JJJqSq))**JJJr)   r   )r   r   r   rj   r   r   r3   r   rc   r   r4   ro   r   )r   r   r   r   r   r   r]   field_widthr   max_column_widthsr   tree_indent_columns           r'   r   z*PrettyTextRenderer.render.<locals>.visitor2  sw   
 58!%%&8!<<do5 501 { #t{11$+>> #""D %c$,&7&7 8 8 0 0l3/33K!5i!@   xL 9::!JJJJtIOOD4I4IJJJ  25%))&+s6;7G7GHH+2 2!&+.  $zz$//V6777r)   Nr   z{0:<r   zs}{r   :r   c                     g | ]	}|j         
S rs   )ro   r   s     r'   r   z-PrettyTextRenderer.render.<locals>.<listcomp>f  s    GGGGGGr)   c                 :    g | ]}t          |                   S rs   )r3   )r   r   r   s     r'   r   z-PrettyTextRenderer.render.<locals>.<listcomp>i  s%    BBB6Sf..BBBr)   r   c                 R    g | ]#}                     |                            $S rs   r   r   r   indexr   r   s     r'   r   z-PrettyTextRenderer.render.<locals>.<listcomp>q  >       $* !%d6l5.A B B  r)   r   c                 R    g | ]#}                     |                            $S rs   r   r   s     r'   r   z-PrettyTextRenderer.render.<locals>.<listcomp>{  r   r)   )r   r   stderrr   r!   r   dictr   r
   r   r   r   r   rH   r   Columnr   r   r   r   r1   r   r3   r   ro   r   r   )r   r   r   display_alignmentcolumn_separatorr   final_outputformat_string_listr   r   format_stringcolumn_titlesdepth	nums_liner   r   r   r   s   ``            @@@@r'   r   zPrettyTextRenderer.render  s    

*+++ WW %
 %
KPQS99%
 %
 %
 
 
 !HH4<HHH
 
	&/	eCj.B.I5.P)Q$QRS	 %T*"6"=u"DEEFG	 	 	 	 	 	 	 	 	: TV~ 	VMM'<0000JJD7JUUU S*../A1EEFFFM
 "#dl"3"344 		 		L\,/F%%lQ&''( $$ '455	6
     )--.@AADHGG$,GGGG(M(-8999' 	 	KE4BBBBTBBBCCI W W#F|ty3tF|CTCT7T/UVVy))  A::KK,,%K     .2l        KK,,%K     .2l       		 	r)   r   c                     d}|                     d          dk    rP|                     d          }d|||z  z
  z  }|                    d|d          }|                     d          dk    P|S )Nr   r   r   r   r   )findr+   )r   r   	tab_widthre   pads        r'   r   zPrettyTextRenderer.tab_stop  sq    	iioo""		$Aa)m45C<<c1--D iioo"" r)   )rk   rl   rm   rb   rc   ro   r   r
   r   r   r   r1   r   rs   r)   r'   r   r     s        '7OD  f:/8 fT f f f fP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dS )JsonRendererc                 @    d                     d | D                       S )Nr   c                     g | ]}|d S r   rs   r   s     r'   r   z)JsonRenderer.<lambda>.<locals>.<listcomp>  r   r)   r   ry   s    r'   rz   zJsonRenderer.<lambda>  r   r)   c                 l    t          | t          j        j                  s|                                 nd S r   )r   r
   r   r=   	isoformatry   s    r'   rz   zJsonRenderer.<lambda>  s.    a!5!EFFAKKMMM r)   r   c                     | S r   rs   ry   s    r'   rz   zJsonRenderer.<lambda>  s    Q r)   JSONTr   c                     d S r   rs   r   s    r'   r   zJsonRenderer.get_render_options  r   r)   c           	          |                     d                    t          j        |dd                               dS )z6Outputs the JSON data to a file in a particular formatz{}
r.   T)indent	sort_keysN)r   r   jsondumps)r   r   rK   s      r'   output_resultzJsonRenderer.output_result  s7    FMM$*VA"N"N"NOOPPPPPr)   r   c                     t           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                    ||           n                    d ||                                ||d                    d S )Nr   r   r   r   c                    |\  }}dg i}t          t          	j                            D ]}	j        |         }
j                            |j        
j        d                   } |t          | j                  |                   }t          |t          j
        j                  rd }|||j        <   | j        r,|| j        j                 d                             |           n|                    |           ||| j        <   ||fS )N
__childrenr   )r   r3   r   rc   r   r   listr   r   r
   r   r=   ro   parentpathr   )r   r   acc_map
final_tree	node_dictr   r   r   r]   r   r   s            r'   r   z$JsonRenderer.render.<locals>.visitor  s   
 #.GZ)5r(:I %c$,&7&7 8 8 . .l3/33K!5i!@   xT[ 1 1, ?@@dJ$8$HII  D)-	&+&&{ -(),7>>yIIII!!),,,!*GDIZ((r)   r   r   )r   r   r   r
   r   r   r   r   r1   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	) 	) 	) 	) 	) 	) 	)0 ~ 	VMM'<0000JJD7JUUU5,q/22222r)   N)rk   rl   rm   r   r   rL   r(   r
   r   r   rf   rF   r6   r   rB   r   rc   ro   rp   r   RenderOptionr   r  r   r   rs   r)   r'   r	  r	    s        /@AA(//:M*N*N"OO4I$J$JxxCCDD 
 

 	;;O DD)=)J$K    Q Q Q&3:/8 &3 &3 &3 &3 &3 &3r)   r	  c                       e Zd ZdZd ZdS )JsonLinesRendererJSONLc                     |D ]@}|                     t          j        |d                     |                     d           AdS )z&Outputs the JSON results as JSON linesT)r  r   N)r   r  r  )r   r   rK   r   s       r'   r  zJsonLinesRenderer.output_result  sQ     	 	DKK
44888999KK	 	r)   N)rk   rl   rm   ro   r  rs   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   	getLoggerrk   vollogrS   rT   ImportErrordebugr   r1   r(   rF   r6   rB   rL   r   rf   Rendererrh   rb   r   r   r   r	  r"  rs   r)   r'   <module>r0     s   


      



       3 3 3 3 3 3 3 3 3 3 3 3 3 3 ' ' ' ' ' ' 7 7 7 7 7 7 7 7 8 8 8 8 8 8		8	$	$;OOOO ; ; ;
LL9:::::;
U s    6$!; $ $ $ $ $*
8 
 
 
 
 
( x    "A
 4 @ AS A A A A6) ) ) ) )*&/ ) ) )= = = = = = = =@
3 
3 
3 
3 
3; 
3 
3 
35 5 5 5 5+ 5 5 5pv v v v v v v vr>3 >3 >3 >3 >3; >3 >3 >3B         s   A A<;A<