
    [
#g.                    R   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Zd dl	m
Z
mZmZmZmZmZmZ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 d dlmZmZ d dlmZm Z  d d	lm!Z!m"Z" d d
lm#Z#m$Z$ d dlm%Z%m&Z& d dlm'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/ d dl0m1Z1  ejd                  e3      Z4 G d de-jj                        Z6 G d de-jj                        Z7 G d dejp                        Z9 G d dejp                        Z: G d dejp                        Z; G d dejp                        Z< G d dejp                        Z= G d d ejp                        Z> G d! d"ejp                        Z? G d# d$ejp                        Z@ G d% d&ejp                  ej                  j                        ZB G d' d(ejp                        ZC G d) d*ejp                        ZD G d+ d,ejp                        ZE G d- d.ejp                        ZF G d/ d0ejp                        ZG G d1 d2ejp                        ZH G d3 d4ejp                        Z G d5 d6ejp                        ZI G d7 d8ejp                        ZJ G d9 d:ejp                        ZK G d; d<ejp                        ZL G d= d>ejp                        ZM G d? d@ejp                        ZN G dA dBejp                        ZO G dC dDejp                        ZP G dE dFejp                        ZQ G dG dHejp                        ZR G dI dJejp                        ZS G dK dLejp                        ZT G dM dNeT      ZU G dO dPejp                        ZV G dQ dRejp                        ZW G dS dTejp                        ZX G dU dVejp                        ZY G dW dXejp                        ZZy)Y    N)datetime)	GeneratorIterableIteratorOptionalTupleListUnionDict)	constants
exceptionsobjects
interfacessymbols)
conversion)requirements)
SOCK_TYPESSOCK_FAMILY)IP_PROTOCOLSIPV6_PROTOCOLS)
TCP_STATESNETLINK_PROTOCOLS)ETH_PROTOCOLSBLUETOOTH_STATES)BLUETOOTH_PROTOCOLSSOCKET_STATES)CAPABILITIES)linear)utility)genericlinuxintermed)elfc                        e Zd Z fdZed        Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zdeeef   fdZd Zd Zed        Zed        Zed        Z xZS )modulec                 2    t        |   |i | d | _        y N)super__init___mod_mem_type)selfargskwargs	__class__s      i/home/panchajanya/Development/work/volatility3/volatility3/framework/symbols/linux/extensions/__init__.pyr)   zmodule.__init__#   s    $)&)!    c                 x   | j                   c	 | j                  j                  j                  | j	                         t
        j                  z   dz         j                  | _         | j                   S | j                   S # t        j                  $ r* t        j                  d       i | _         Y | j                   S w xY w)zIReturn the mod_mem_type enum choices if available or an empty dict if notmod_mem_typezOUnable to find mod_mem_type enum. This message can be ignored for kernels < 6.4)r*   _contextsymbol_spaceget_enumerationget_symbol_table_namer   BANGchoicesr   SymbolErrorvollogdebugr+   s    r/   r2   zmodule.mod_mem_type'   s     %	(%)]]%?%?%O%O..09>>ANR&' " !!!t!!! )) (e &("!!!(s   AA< </B98B9c                 @   | j                  d      r'	 | j                  | j                  d      j                  S | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      # t        $ r t        d      w xY w)NmemMOD_TEXTzUmodule -> get_module_base: Unable to get module base. Cannot read base from MOD_TEXT.core_layoutmodule_corez4module -> get_module_base: Unable to get module base
has_memberr>   r2   baseKeyErrorAttributeErrorr@   rA   r<   s    r/   get_module_basezmodule.get_module_base;       ??5!xx 1 1* =>CCC
 __]+##(((__]+###STT  $k    %B Bc                    | j                  d      ru	 | j                  | j                  d      j                  | j                  | j                  d      j                  z   | j                  | j                  d      j                  z   S | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      # t        $ r t        d      w xY w)	Nr>   MOD_INIT_TEXTMOD_INIT_DATAMOD_INIT_RODATAzmodule -> get_init_size: Unable to determine .init section size of module. Cannot read size of MOD_INIT_TEXT, MOD_INIT_DATA, and MOD_INIT_RODATAinit_layout	init_sizezImodule -> get_init_size: Unable to determine .init section size of module)rC   r>   r2   sizerE   rF   rN   rO   r<   s    r/   get_init_sizezmodule.get_init_sizeI   s    ??5!	HHT..?@EEhht00ABGGHhht001BCDIIJ __]+##(((__[)>>!W
 	
  $ g s   A3C C+c                 *   | j                  d      r	 | j                  | j                  d      j                  | j                  | j                  d      j                  z   | j                  | j                  d      j                  z   | j                  | j                  d      j                  z   S | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d	      # t        $ r t        d      w xY w)
Nr>   r?   MOD_DATA
MOD_RODATAMOD_RO_AFTER_INITzmodule -> get_core_size: Unable to determine core size of module. Cannot read size of MOD_TEXT, MOD_DATA, MOD_RODATA, and MOD_RO_AFTER_INIT.r@   	core_sizez@module -> get_core_size: Unable to determine core size of module)rC   r>   r2   rP   rE   rF   r@   rV   r<   s    r/   get_core_sizezmodule.get_core_size]   s   ??5!
HHT..z:;@@hht00<=BBChht00>?DDE hht001DEFKKL __]+##(((__[)>>!N
 	
  $ c s   BC= =Dc                 @   | j                  d      r'	 | j                  | j                  d      j                  S | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      # t        $ r t        d      w xY w)Nr>   r?   zUmodule -> get_module_core: Unable to get module core. Cannot read base from MOD_TEXT.r@   rA   z4module -> get_module_core: Unable to get module corerB   r<   s    r/   get_module_corezmodule.get_module_corer   rH   rI   c                 @   | j                  d      r'	 | j                  | j                  d      j                  S | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      # t        $ r t        d      w xY w)Nr>   rK   zZmodule -> get_module_core: Unable to get module init. Cannot read base from MOD_INIT_TEXT.rN   module_initz4module -> get_module_init: Unable to get module init)rC   r>   r2   rD   rE   rF   rN   r[   r<   s    r/   get_module_initzmodule.get_module_init   s    ??5!xx 1 1/ BCHHH
 __]+##(((__]+###STT  $p rI   c                 @    t        j                  | j                        S )z&Get the name of the module as a string)r   array_to_stringnamer<   s    r/   get_namezmodule.get_name   s    &&tyy11r0   c           	      t   | j                   j                  | j                         t        j                  z   dz   | j
                  j                  |j                  | j                   j                  j                  | j                         t        j                  z   dz         d      }d}||   r|dz   }||   r|S )z-Try to determine the number of valid sectionsarraypointer   
layer_nameoffsetsubtypecountr      )
r3   objectr6   r   r7   volrf   attrsr4   get_type)r+   grparridxs       r/   _get_sect_countzmodule._get_sect_count   s    mm""&&(9>>9GCxx**99MM..77**,y~~=	I  # 
 #h'C #h
r0   c           	   #   V  K   | j                   j                  d      r| j                   j                  }n%| j                  | j                   j                        }| j
                  j                  | j                         t        j                  z   dz   | j                  j                  | j                   j                  j                  j                  | j
                  j                  j                  | j                         t        j                  z   dz         |      }|D ]  }|  yw)zGet sections of the module	nsectionsrb   module_sect_attrre   N)
sect_attrsrC   rt   rr   ro   r3   rk   r6   r   r7   rl   rf   rm   rg   r4   rn   )r+   	num_sectsrp   attrs       r/   get_sectionszmodule.get_sections   s     ??%%k211I,,T__-@-@AImm""&&(9>>9GCxx**??((,,33MM..77**,y~~=@RR  # 
 DJ s   D'D)c                     t         j                  j                  | j                  dddd t        j
                        }|S )Nelf_symbol_tabler!   r#   )native_typesclass_types)r"   IntermediateSymbolTablecreater3   r#   r}   )r+   elf_table_names     r/   get_elf_table_namezmodule.get_elf_table_name   s@    !99@@MM A 
 r0   c           	   #   F  K   t        | d      s| j                         | _        t        j                  | j
                  | j                               rd}nd}| j
                  j                  | j                         t        j                  z   dz   | j                  j                  | j                  | j
                  j                  j                  | j                  t        j                  z   |z   dz         | j                  dz         }| j                   r|D ]  }|  yyw)	zSGet symbols of the module

        Yields:
                A symbol object
        _elf_table_nameElf64_Elf32_rb   Symrj   re   N)hasattrr   r   r   symbol_table_is_64bitr3   r6   rk   r   r7   rl   rf   section_symtabr4   rn   
num_symtabsection_strtab)r+   prefixsymssyms       r/   get_symbolszmodule.get_symbols   s      t./#'#:#:#<D ((8R8R8TUFF}}##&&(9>>9GCxx**&&MM..77$$y~~5>F //A% $ 
 	  s   DD!returnc              #     K   | j                         D ]  }| j                  j                  | j                         t        j
                  z   dz   | j                  j                  | j                  |j                  z         }	 t        j                  |d      }|dk7  s| j                  j                  | j                  j                     j                   }|j"                  |z  }||f  y# t        j                  $ r Y w xY ww)zGet names and addresses for each symbol of the module

        Yields:
                A tuple for each symbol containing the symbol name and its corresponding value
        rb   rf   rg       N)r   r3   rk   r6   r   r7   rl   native_layer_namer   st_namer   r^   r   InvalidAddressExceptionlayersrf   address_maskst_value)r+   r   sym_arrsym_namemasksym_addresss         r/   get_symbols_names_and_addressesz&module.get_symbols_names_and_addresses   s      ##%Cmm****,y~~=G8855**S[[8 + G
"22S
 2~}}++DHH,?,?@MM!llT1--! & 55 s1   A?DC-DAD-D DDDc                 F    | j                         D ]  \  }}||k(  s|c S  y)z(Get symbol value for a given symbol nameNr   )r+   wanted_sym_namer   r   s       r/   
get_symbolzmodule.get_symbol   s.    %)%I%I%K!Hk(*"" &L r0   c                 F    | j                         D ]  \  }}||k(  s|c S  y)z*Get symbol name for a given symbol addressNr   )r+   wanted_sym_addressr   r   s       r/   get_symbol_by_addresszmodule.get_symbol_by_address   s-    %)%I%I%K!Hk![0 &L r0   c                     | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      )Nkallsymssymtabz&module -> symtab: Unable to get symtab)rC   r   r   rF   r<   s    r/   r   zmodule.section_symtab  s@    ??:&=='''__X&;;EFFr0   c                     | j                  d      rt        | j                  j                        S | j                  d      rt        | j                        S t	        d      )Nr   r   z;module -> num_symtab: Unable to determine number of symbols)rC   intr   r   rF   r<   s    r/   r   zmodule.num_symtab  sN    ??:&t}}//00__\*t''I
 	
r0   c                     | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      )Nr   strtabz&module -> strtab: Unable to get strtab)rC   r   r   rF   r<   s    r/   r   zmodule.section_strtab  sB     ??:&=='''__X&;;EFFr0   )__name__
__module____qualname__r)   propertyr2   rG   rQ   rW   rY   r\   r`   rr   ry   r   r   r   strr   r   r   r   r   r   r   __classcell__)r.   s   @r/   r%   r%   !   s    " " "&U
(
*UU2"&	4.sCx .2 G G 
 
 G Gr0   r%   c                       e Zd Z	 ddededee   fdZ	 ddedeee	e	f   ddf   fdZ
edefd       Zedefd	       Zedefd
       Zdeej"                  j$                     fdZy)task_structNconfig_prefixpreferred_namer   c                    | j                   j                  | j                  j                     }	 | j                  j
                  }t        |t        j                        st        d      |j                  |      \  }}|sy|&| j                  j                  d| j                   z   }| j                  | j                   |||      S # t        j                  $ r Y yw xY w)zkConstructs a new layer based on the process's DTB.

        Returns the name of the Layer or None.
        NzJParent layer is not a translation layer, unable to construct process layer_Process)r3   r   rl   rf   mmpgdr   r   
isinstancer   LinearlyMappedLayer	TypeError	translatepid_add_process_layer)r+   r   r   parent_layerr   dtbrf   s          r/   add_process_layerztask_struct.add_process_layer"  s     }}++DHH,?,?@	''++C ,(B(BC\  '005Z!!XX00XdhhZ3HHN&&MM3~
 	
 11 		s   C CC	heap_onlyc              #     K   | j                   j                         D ]  }t        |j                        }t        |j                        }|r3|| j                   j
                  k  r|| j                   j                  k\  sbt        j                  d|dd| j                   j
                  dd|dd| j                   j                  d       |||z
  f  yw)zdReturns a list of sections based on the memory manager's view of
        this task's virtual memory.zadding vma: x z | N)	r   get_vma_iterr   vm_startvm_endbrk	start_brkr:   info)r+   r   vmastartends        r/   get_process_memory_sectionsz'task_struct.get_process_memory_sections=  s     
 77'')C%Ecjj/C%477;;"63$''BSBS;S "5)1TWW[[O3s1gQtwwGXGXYZF[\ #+&& *s   CCc                 V    | j                   t        j                  j                  z  dk7  S )zChecks if this task is a kernel thread.

        Returns:
            bool: True, if this task is a kernel thread. Otherwise, False.
        r   )flagsr   r!   
PF_KTHREADr<   s    r/   is_kernel_threadztask_struct.is_kernel_threadO  s"     

Y__777A==r0   c                 4    | j                   | j                  k(  S )zChecks if this task is a thread group leader.

        Returns:
            bool: True, if this task is a thread group leader. Otherwise, False.
        )tgidr   r<   s    r/   is_thread_group_leaderz"task_struct.is_thread_group_leaderX  s     yyDHH$$r0   c                 R    | j                    xr | j                  | j                  k7  S )zChecks if this task is a user thread.

        Returns:
            bool: True, if this task is a user thread. Otherwise, False.
        )r   r   r   r<   s    r/   is_user_threadztask_struct.is_user_threada  s%     (((BTYY$((-BBr0   c              #      K   | j                         }| j                  j                  | t        j                   dd      D ]  }|  yw)zWReturns a list of the task_struct based on the list_head
        thread_node structure.r   thread_groupN)r6   r   to_listr   r7   )r+   task_symbol_table_nametasks      r/   get_threadsztask_struct.get_threadsj  sQ      "&!;!;!= %%--%&y~~&6kBN
D J
s   A
A)NN)F)r   r   r   r   r   r   boolr   r   r   r   r   r   r   r   r   r   r   ObjectInterfacer    r0   r/   r   r   !  s    ?C
 
9<
	#
8 !&''	5c?D$.	/'$ >$ > > % % % C C CXj&8&8&H&HI r0   r   c                       e Zd Zd Zd Zy)	fs_structc                     | j                  d      r| j                  S | j                  j                  d      r| j                  j                  S t        d      )NrootmntdentryzUnable to find the root dentry)rC   rootr   rF   r<   s    r/   get_root_dentryzfs_struct.get_root_dentry{  sF    ??9%99YY!!(+99###=>>r0   c                     | j                  d      r| j                  S | j                  j                  d      r| j                  j                  S t	        d      )Nr   mntzUnable to find the root mount)rC   r   r   r   rF   r<   s    r/   get_root_mntzfs_struct.get_root_mnt  sD    ??9%<<YY!!%(99== <==r0   N)r   r   r   r   r   r   r0   r/   r   r   z  s    ?>r0   r   c                   B    e Zd ZdZdZdZdZdZdZdZ	dZ
dZd Z	 	 dd
Zy	)
maple_tree|               r   rj   c              #      K   | j                   j                  | j                   z  }| j                  | j                  z  | j
                  z	  }| j                  | j                  ||      E d{    y7 w)z4Parse the Maple Tree and return every non zero slot.N)rl   rg   MAPLE_NODE_POINTER_MASKma_flagsMT_FLAGS_HEIGHT_MASKMT_FLAGS_HEIGHT_OFFSET_parse_maple_tree_nodema_root)r+   maple_tree_offsetexpected_maple_tree_depths      r/   get_slot_iterzmaple_tree.get_slot_iter  sl      HHOO0L0L.MMMMD555((%)! ..LL+-F
 	
 	
s   A+A5-A3.A5Nc           	   #     K   |
t               }||v r#t        j                  dt        |       d       y|j	                  |       ||k  r<t        j                  dt        | j
                  j                         d| d| d       || j                   z  }|| j                  z	  | j                  z  }| j                         }| j                  j                  |t        j                  z   dz   | j
                  j                  |	      }	|	| j                   z  }
|
|k(  sJ | j                  j                  |t        j                  z   d
z   | j
                  j                   |	      }|| j"                  k(  r4|j$                  j&                  D ]  }|| j                   z  dk7  s|  y|| j(                  k(  r4|j*                  j&                  D ]  }|| j                   z  dk7  s|  y|| j,                  k(  rP|j*                  j&                  D ]6  }|| j                   z  dk7  s| j/                  |||||dz         E d{    8 y|| j0                  k(  rP|j2                  j&                  D ]6  }|| j                   z  dk7  s| j/                  |||||dz         E d{    8 yt5        d| dt        |       d      7 7 $w)z@Recursively parse Maple Tree Nodes and yield all non empty slotsNzThe mte zL has all ready been seen, no further results will be produced for this node.z The depth for the maple tree at z is z,, however when parsing the nodes a depth of zC was reached. This is unexpected and may lead to incorrect results.rc   r   
maple_noder   rj   zUnkown Maple Tree node type z at offset .)setr:   warninghexaddrl   rg   r   MAPLE_NODE_TYPE_SHIFTMAPLE_NODE_TYPE_MASKr6   r3   rk   r   r7   r   rf   MAPLE_DENSEallocslotMAPLE_LEAF_64mr64MAPLE_RANGE_64r   MAPLE_ARANGE_64ma64rF   )r+   maple_tree_entryparentr   seencurrent_depthrc   	node_typesymbol_table_namenode_parent_mtenode_parent_pointernoder  s                r/   r   z!maple_tree._parse_maple_tree_node  s    " <5D t#NN3/011}~ HH%&
 %}4NN23txx3G2HMfLg h+_,oq #t'C'C%DD : ::%%&	
 !668--..	.:xx11 / 
 .$2N2N0OO #f,,, }}##	.=xx** $ 
 (((

T6677A=J ( $,,,		T6677A=J ' $---		T6677A=#::1%)    ' $...		T6677A=#::1%)    ' !.ykS\NRST 's?   F K
#AK
&AK
)K
KAK
K
#K$#K
K
Nrj   )r   r   r   r   r   r  r  r   r	  r  r  r  r   r   r   r0   r/   r   r     sM      ! !" KMNO
 br0   r   c                   .   e Zd Zdeej
                  j                     fdZdeej
                  j                     fdZdeej
                  j                     fdZ	deej
                  j                     fdZ
deej
                  j                     fdZy)	mm_structr   c              #   j   K   t         j                  d       | j                         E d{    y7 w)zL
        Deprecated: Use either get_vma_iter() or _get_mmap_iter().
        MThis method has been deprecated in favour of using the get_vma_iter() method.Nr:   r  r   r<   s    r/   get_mmap_iterzmm_struct.get_mmap_iter  +      	[	
 $$&&&   )313c              #     K   | j                  d      st        d      | j                  sy| j                   | j                  j                  j                  h}| j                  j
                  }|dk7  rn|j                  j                  |vrU| |j                  |j                  j                         |j
                  }|dk7  r|j                  j                  |vrSyyyyw)zReturns an iterator for the mmap list member of an mm_struct. Use this only if
        required, get_vma_iter() will choose the correct _get_maple_tree_iter() or
        _get_mmap_iter() automatically as required.mmapz?_get_mmap_iter called on mm_struct where no mmap member exists.Nr   )rC   rF   r$  rl   rg   vm_nextr  )r+   r  links      r/   _get_mmap_iterzmm_struct._get_mmap_iter  s     
 v& Q  yyii		$$%yy  aiDHHOO47JHHTXX__%<<D aiDHHOO47i7is   CC%!C%c              #   j   K   t         j                  d       | j                         E d{    y7 w)zR
        Deprecated: Use either get_vma_iter() or _get_maple_tree_iter().
        r  Nr  r<   s    r/   get_maple_tree_iterzmm_struct.get_maple_tree_iter.  r!  r"  c              #   6  K   | j                  d      st        d      | j                         }| j                  j	                         D ]L  }| j
                  j                  |t        j                  z   dz   | j                  j                  |      }| N yw)zReturns an iterator for the mm_mt member of an mm_struct. Use this only if
        required, get_vma_iter() will choose the correct _get_maple_tree_iter() or
        get_mmap_iter() automatically as required.mm_mtzF_get_maple_tree_iter called on mm_struct where no mm_mt member exists.vm_area_structr   N)rC   rF   r6   r+  r   r3   rk   r   r7   rl   r   )r+   r  vma_pointerr   s       r/   _get_maple_tree_iterzmm_struct._get_maple_tree_iter7  s     
 w' X  !668::335K--&&!INN25EE8855" ' C
 I 6s   BBc              #      K   | j                  d      r| j                         E d{    y| j                  d      r| j                         E d{    yt        d      7 :7 w)zgReturns an iterator for the VMAs in an mm_struct. Automatically choosing the mmap or mm_mt as required.r$  Nr+  z)Unable to find mmap or mm_mt in mm_struct)rC   r'  r.  rF   r<   s    r/   r   zmm_struct.get_vma_iterJ  sY      ??6"**,,,__W%00222 !LMM	 -2s!   %A&A")A&A$A&$A&N)r   r   r   r   r   r   r   r   r'  r)  r.  r   r   r0   r/   r  r    s    'x
(:(:(J(JK ' ););)K)K L  ,'Xj.@.@.P.P%Q 'hz/A/A/Q/Q&R &Nhz'9'9'I'IJ Nr0   r  c                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZede
de	dediZedefd       Zedefd       ZdefdZdee   fdZd Zy)super_block   rj   r            @                    @       syncdirsyncmandlazytimer   c                 4    | j                   | j                  z	  S r'   s_dev	MINORBITSr<   s    r/   majorzsuper_block.majorp  s    zzT^^++r0   c                 @    | j                   d| j                  z  dz
  z  S r  rD  r<   s    r/   minorzsuper_block.minort  s    zza4>>1Q677r0   c                 <    | j                   | j                  z  rdS dS Nrorw)s_flags	SB_RDONLYr<   s    r/   get_flags_accesszsuper_block.get_flags_accessx  s    ||dnn4t>$>r0   c                 |    | j                   D cg c]!  }|| j                  z  s| j                   |   # }}|S c c}w r'   )SB_OPTSrN  )r+   sb_optsb_optss      r/   get_flags_optszsuper_block.get_flags_opts{  s@    /3||
%+v?TDLL 
 
 
s   99c                     t        j                  | j                  j                  d      }| j                  r)t        j                  | j                  d      }|d|z   z  }|S )Nr   ri   r  )r   pointer_to_strings_typer_   	s_subtype)r+   mnt_sb_typemnt_sb_subtypes      r/   rn   zsuper_block.get_type  sP    //0@0@L>>$66t~~SQN3//Kr0   N)r   r   r   rF  rO  	SB_NOSUIDSB_NODEV	SB_NOEXECSB_SYNCHRONOUSSB_MANDLOCK
SB_DIRSYNC
SB_NOATIMESB_NODIRATIME	SB_SILENTSB_POSIXACLSB_KERNMOUNTSB_I_VERSIONSB_LAZYTIMErR  r   r   rG  rI  r   rP  r   rU  rn   r   r0   r/   r1  r1  U  s    I IIHINKJJMIKLLK 	IVZ	G ,s , , 8s 8 8?# ? r0   r1  c                       e Zd ZddddZi ddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6Zd7efd8Zd7efd9Zd7efd:Zd7e	fd;Z
d< Zd?d>Zy=)@r,  rwr   )rj   r   r3  rj   VM_READr   VM_WRITEr3  VM_EXECr4  	VM_SHAREDr5  
VM_MAYREAD    VM_MAYWRITEr6  
VM_MAYEXECr7  VM_MAYSHARE   VM_GROWSDOWNr   VM_NOHUGEPAGEr8  	VM_PFNMAPr9  VM_DENYWRITE   VM_EXECUTABLE    	VM_LOCKEDi @  VM_IOr:  VM_SEQ_READr;  VM_RAND_READVM_DONTCOPYVM_DONTEXPANDVM_RESERVED
VM_ACCOUNTVM_NORESERVE
VM_HUGETLBVM_NONLINEARVM_MAPPED_COP__VM_HUGEPAGEVM_INSERTPAGEVM_ALWAYSDUMPVM_CAN_NONLINEARVM_MIXEDMAPVM_SAOVM_PFN_AT_MMAPVM_MERGEABLE)i   i   i   i   i    r<  r=  i   r>  i   i   i   i    i   @l        r   c                 `    d}|j                         D ]  \  }}||z  |k(  r||z   }|dz   } |S )zJReturns an string representation of the flags in a
        vm_area_struct.r   -)items)r+   vm_flagsparse_flagsretvalr   chars         r/   _parse_flagszvm_area_struct._parse_flags  sE     %++-JD$4D($#	 .
 r0   c                 \    | j                  | j                  dz  t        j                        S )Nr   )r  r  r,  
perm_flagsr<   s    r/   get_protectionzvm_area_struct.get_protection  s$      !79R9RSSr0   c                 N    | j                  | j                  | j                        S r'   )r  r  extended_flagsr<   s    r/   	get_flagszvm_area_struct.get_flags  s      0C0CDDr0   c                     | j                   dk(  ry| j                  j                  | j                  j                     }| j
                  |j                  z  S Nr   )vm_filer3   r   rl   rf   vm_pgoff
page_shift)r+   r   s     r/   get_page_offsetzvm_area_struct.get_page_offset  sD    <<1}}++DHH,?,?@}} 7 777r0   c                 2   | j                   dk7  r-t        j                  j                  ||| j                         }|S | j                  |j
                  j                  k  r'| j                  |j
                  j                  k\  rd}|S | j                  |j
                  j                  cxk  r| j                  k  rd}|S  | j                  j                  j                  d      r1| j                  | j                  j                  j                  k(  rd}|S d}|S )Nr   z[heap]z[stack]vdsoz[vdso]zAnonymous Mapping)r  r!   LinuxUtilitiespath_for_filer   r   r   r   r   start_stackvm_mmcontextrC   r  )r+   r  r   fnames       r/   r`   zvm_area_struct.get_name  s    <<1((66wdllSE  ]]dgg///DKK477;;4NE  ]]dgg11@T[[@E  A JJ))&1!3!3!8!88E  (Er0   Nc                 >   d}| j                         }|dk(  rd}|S |dk(  r5| j                  j                         j                  j                  dk(  rd}|S |rmd|v rit        | j                  | j                  |j                        D ];  }	 |j                  |      r't        j                  dt        |       d       d} |S = |S # t        j                  t        j                  f$ r2}t        j!                  d	t        |       d
|        d}Y d }~ |S d }~ww xY w)NFrwxTzr-xr   r   z%Found malicious (dirty+exec) page at z !zUnable to translate address z : )r  r  dereferencerl   rg   ranger   r   	page_sizeis_dirtyr:   r  r  r   PagedInvalidAddressExceptionr   r;   )r+   	proclayerret	flags_striexcps         r/   is_suspiciouszvm_area_struct.is_suspicious  s,   '')	C* 
) %DLL$<$<$>$B$B$I$IQ$NC& 
% 3)+4==$++y7J7JK ))!,CCF82N # 
 - L" 
 ;;66  LL#?Axs4&!QRC
s   5C#D*&DDr'   )r   r   r   r  r  r   r  r  r  r   r  r`   r  r   r0   r/   r,  r,    sU   J!I!J! 	I! 	K	!
 	L! 	M! 	L! 	M! 	N! 	O! 	K! 	N! 	O! 	K! 	G!  	M!!" 	N#!$ "#! " "0##&!$"A!NFS T TE3 E8 8"r0   r,  c                       e Zd ZdefdZy)qstrr   c                     | j                  d      r| j                  dz   }nd}	 t        j                  j	                  | j
                  |      }|S # t        j                  t        f$ r d}Y |S w xY w)Nlenrj   r   r   )	rC   r  r   r   rX  r_   r   r   
ValueError)r+   
str_lengthr  s      r/   name_as_strzqstr.name_as_str  sl    ??5!AJJ	//33DIIzJC 
 22J? 	C
	s   *A A0/A0N)r   r   r   r   r  r   r0   r/   r  r    s    	S 	r0   r  c                   d    e Zd ZdefdZdefdZd Zd Zde	j                  j                  fdZy)r   r   c                    g }t               }| }|j                         s|j                  j                  |vr|j                  }|j                  |j                  j                                |j                  |j                  j                         |}|j                         s|j                  j                  |vrddj                  t        |            z   S )z,Based on __dentry_path Linux kernel function/)r  is_rootrl   rg   d_parentappendd_namer  r  joinreversed)r+   reversed_pathdentry_seencurrent_dentryr  s        r/   pathzdentry.path  s    e&&(""))<#,,F  !6!6!B!B!DEOON..556#N &&(""))< SXXh}5666r0   c                 r    t        | d      r$	 | j                  j                  | j                  k(  S y #  Y yxY w)Nr  F)getattrrl   rg   r  r<   s    r/   r  zdentry.is_root  s7    4$xx$--77 %s   "2 6c                 X    | j                   j                  |k(  ry| j                  |      S )zIs this dentry a subdirectory of old_dentry?

        Returns true if this dentry is a subdirectory of the parent (at any depth).
        Otherwise, it returns false.
        T)rl   rg   
d_ancestor)r+   
old_dentrys     r/   	is_subdirzdentry.is_subdir"  s&     88??j(z**r0   c                 j   t               }| }|j                         s|j                  j                  |vr|j                  |j                  j                  k(  r|S |j                  |j                  j                         |j                  }|j                         s|j                  j                  |vry)zSearch for an ancestor

        Returns the ancestor dentry which is a child of "ancestor_dentry",
        if "ancestor_dentry" is an ancestor of "child_dentry", else None.
        N)r  r  rl   rg   r  r  )r+   ancestor_dentryr  r  s       r/   r  zdentry.d_ancestor,  s     e&&(""))<&&/*=*=*D*DD%%OON..556+44N &&(""))< r0   c              #     K   | j                  d      r*| j                  d      rd}| j                  j                  }nF| j                  d      r | j                  d      rd}| j                  }nt	        j
                  d      | j                         t        j                  z   dz   }|j                  ||      E d{    y7 w)zJWalks dentry subdirs

        Yields:
            A dentry object
        d_sib
d_childrend_child	d_subdirszUnsupported dentry typer   N)
rC   r  firstr  r   VolatilityExceptionr6   r   r7   r   )r+   walk_memberlist_head_memberdentry_type_names       r/   get_subdirszdentry.get_subdirs?  s      ??7#(E!K#44__Y'DOOK,H#K#~~001JKK557)..H8S#++,<kJJJs   B;C=C>CN)r   r   r   r   r  r   r  r  r  r   r   r   r  r   r0   r/   r   r   
  s>    7c 7 +&KZ//?? Kr0   r   c                   t    e Zd Zdej                  j
                  fdZdej                  j
                  fdZy)struct_filer   c                     | j                  d      r| j                  S | j                  d      r| j                  j                  S t	        d      )Nf_dentryf_pathzUnable to find file -> dentry)rC   r  r  r   rF   r<   s    r/   
get_dentryzstruct_file.get_dentryU  s@    ??:&== __X&;;%%% !@AAr0   c                     | j                  d      r| j                  S | j                  d      r| j                  j                  S t	        d      )z4Returns the fs (vfsmount) where this file is mountedf_vfsmntr  z Unable to find file -> vfs mount)rC   r  r  r   rF   r<   s    r/   
get_vfsmntzstruct_file.get_vfsmnt]  s>    ??:&== __X&;;??" !CDDr0   N)r   r   r   r   r   r   r  r  r   r0   r/   r  r  T  s6    BJ..>> BEJ..>> Er0   r  c                       e Zd Z	 	 	 d
dededededee   deej                  j                     fdZ
deej                  j                     fd	Zy)	list_headNsymbol_typememberforwardsentinellayerr   c              #   D  K   |xs | j                   j                  }| j                  j                  j	                  |      j                  |      }d}|rd}	 t        | |      j                         }|s7| j                  j                  ||| j                   j                  |z
         | j                   j                  h}	|j                   j                  |	vr| j                  j                  |||j                   j                  |z
        }
|
 |	j                  |j                   j                         	 t        ||      j                         }|j                   j                  |	vryy# t        j                  $ r Y yw xY w# t        j                  $ r Y yw xY ww)an  Returns an iterator of the entries in the list.

        Args:
                symbol_type: Type of the list elements
                member: Name of the list_head member in the list elements
                forward: Set false to go backwards
                sentinel: Whether self is a "sentinel node", meaning it is not embedded in a member of the list
                Sentinel nodes are NOT yielded. See https://en.wikipedia.org/wiki/Sentinel_node for further reference
                layer: Name of layer to read from
        Yields:
            Objects of the type specified via the "symbol_type" argument.

        prevnextNrg   )rl   rf   r3   r4   rn   relative_child_offsetr  r  r   r   rk   rg   r  )r+   r  r  r  r  r  relative_offset	directionr&  r  objs              r/   r   zlist_head.to_listh  sm    * ,,,--44==



' 	 	I	4+779D --&&U488??_+L '    hhooT)--&&U488??_+L ' C IHHTXX__%tY/;;= hhooT) 11 		  55 sU   AF E. 2CF 9F F ,F .FF FF FF FF c                     | j                  | j                  j                  j                  j                  | j                  j                        S r'   )r   rl   r  	type_namemember_namer<   s    r/   __iter__zlist_head.__iter__  s1    ||DHHOO//99488;O;OPPr0   )TTN)r   r   r   r   r   r   r   r   r   r   r   r  r   r0   r/   r  r  g  s    
 #11 1 	1
 1 }1 
*$$44	51fQ(:#5#5#E#EF Qr0   r  c                   t    e Zd Zdej                  j
                  fdZdej                  j
                  fdZy)files_structr   c                     | j                  d      r$| j                  j                  j                         S | j                  d      r| j                  j                         S t	        d      )Nfdtfdz(Unable to find files -> file descriptors)rC   r   r  r  rF   r<   s    r/   get_fdszfiles_struct.get_fds  sP    ??5!88;;**,,__T"77&&(( !KLLr0   c                     | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      )Nr   max_fdsz0Unable to find files -> maximum file descriptors)rC   r   r  rF   r<   s    r/   get_max_fdszfiles_struct.get_max_fds  s@    ??5!88###__Y'<< !STTr0   N)r   r   r   r   r   r   r  r  r   r0   r/   r  r    s6    M++;; MUZ//?? Ur0   r  c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZedededededediZdefdZd Zd Zd Zd Zd ZdefdZd Zd Zd Zd ZdefdZdee   fdZdefd Z defd!Z!defd"Z"defd#Z#defd$Z$d% Z%d& Z&d' Z'y())mountrj   r   r3  r4  r5  rr  r6  rv  r   r{  r}  nosuidnodevnoexecnoatime
nodiratimerelatimer   c                     | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      )$Returns a pointer to the super_blockr   mnt_sbz#Unable to find mount -> super block)rC   r   r  rF   r<   s    r/   
get_mnt_sbzmount.get_mnt_sb  s>    ??5!88??"__X&;; !FGGr0   c                     | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      )Nr   mnt_rootz"Unable to find mount -> mount root)rC   r   r  rF   r<   s    r/   get_mnt_rootzmount.get_mnt_root  s@    ??5!88$$$__Z(==  !EFFr0   c                     | j                  d      r| j                  j                  S | j                  d      r| j                  S t        d      )Nr   	mnt_flagsz#Unable to find mount -> mount flags)rC   r   r  rF   r<   s    r/   get_mnt_flagszmount.get_mnt_flags  s@    ??5!88%%%__[)>>! !FGGr0   c                     | j                   S )zZGets the fs where we are mounted on

        Returns:
            A mount pointer
        )
mnt_parentr<   s    r/   get_mnt_parentzmount.get_mnt_parent  s     r0   c                     | j                   S )YGets the dentry of the mountpoint

        Returns:
            A dentry pointer
        )mnt_mountpointr<   s    r/   get_mnt_mountpointzmount.get_mnt_mountpoint  s     """r0   c                 6    | j                   j                         S r'   )r   get_parent_mountr<   s    r/   r   zmount.get_parent_mount  s    xx((**r0   c                 H    | j                   | j                  j                  k7  S )zpChecks if this mount has a parent

        Returns:
            bool: 'True' if this mount has a parent
        )r  rl   rg   r<   s    r/   
has_parentzmount.has_parent  s     $((//11r0   c                     | j                   S )zZReturns the fs where we are mounted on

        Returns:
            A 'vfsmount'
        )r   r<   s    r/   get_vfsmnt_currentzmount.get_vfsmnt_current  s     xxr0   c                 >    | j                         j                         S )zjGets the parent fs (vfsmount) to where it's mounted on

        Returns:
            A 'vfsmount'
        )r  r$  r<   s    r/   get_vfsmnt_parentzmount.get_vfsmnt_parent       ""$7799r0   c                 >    | j                         }|j                  }|S z\Returns the root of the mounted tree

        Returns:
            A dentry pointer
        )r$  r  )r+   vfsmntr   s      r/   get_dentry_currentzmount.get_dentry_current  s      ((*r0   c                 >    | j                         j                         S zcReturns the parent root of the mounted tree

        Returns:
            A dentry pointer
        )r  r+  r<   s    r/   get_dentry_parentzmount.get_dentry_parent  r'  r0   c                 D    | j                         | j                  z  rdS dS rK  )r  MNT_READONLYr<   s    r/   rP  zmount.get_flags_access!  s#    ))+d.?.??tITIr0   c                     | j                   D cg c]$  }|| j                         z  r| j                   |   & }}|S c c}w r'   )	MNT_FLAGSr  )r+   mntflagr   s      r/   rU  zmount.get_flags_opts$  sK      >>
++-- NN7#
 

 
s   )<c                 <    | j                         | j                  z  S r'   )r  
MNT_SHAREDr<   s    r/   	is_sharedzmount.is_shared,  s    !!#doo55r0   c                 <    | j                         | j                  z  S r'   )r  MNT_UNBINDABLEr<   s    r/   is_unbindablezmount.is_unbindable/  s    !!#d&9&999r0   c                 d    | j                   xr# | j                   j                  j                  dk7  S r  
mnt_masterrl   rg   r<   s    r/   is_slavezmount.is_slave2  &    B4??#6#6#=#=#BBr0   c                 D    t        j                  | j                  d      S Nr   rW  r   rX  mnt_devnamer<   s    r/   get_devnamezmount.get_devname5      (()9)9EEr0   c                    t               }| j                  }|r|j                  j                  dk7  r|j                  j                  |vr|j	                  | j
                  |      }|r%|j                  j                  dk7  r|j                  S |j                  |j                  j                         |j                  }|r2|j                  j                  dk7  r|j                  j                  |vry)zUGet ID of closest dominating peer group having a representative under the given root.r   )r  r<  rl   rg   get_peer_under_rootmnt_nsmnt_group_idr  )r+   r   mnt_seencurrent_mntpeers        r/   get_dominating_idzmount.get_dominating_id8  s    5oo&&!+&&h6224;;ED1,(((LL//0%00K &&!+&&h6 r0   c                    t               }| }|j                  j                  |vr|j                  |k(  r(|j	                  |j
                  j                  |      r|S |j                  |j                  j                         |j                         }|j                  j                  | j                  j                  k(  r	 y|j                  j                  |vry)zReturn true if path is reachable from root.
        It mimics the kernel function is_path_reachable(), ref: fs/namespace.c
        N)	r  rl   rg   rG  is_path_reachabler   r  r  	next_peer)r+   nsr   rI  rJ  s        r/   rF  zmount.get_peer_under_rootH  s     5oo$$H4!!R'K,I,I(($- #"LL//0%//1K%%8 oo$$H4 r0   c                 ~   t               }| }|j                  j                  j                  |j                  k7  r|j	                         r|j                  j                  |vr|j
                  }|j                  |j                  j                         |j                  }|j                  j                  j                  |j                  k7  r)|j	                         r|j                  j                  |vr|j                  j                  j                  |j                  k(  xr |j                  |j                        S )ztReturn true if path is reachable.
        It mimics the kernel function with same name, ref fs/namespace.c:
        )
r  r   rl   rg   r"  r  r  r  r  r   )r+   r  r   rI  rJ  s        r/   rN  zmount.is_path_reachableY  s     5OO&&$((2&&(&&h6(77NLL//0%00K OO&&$((2&&(&&h6
 ""))TXX5 
.:R:RKK;
 	
r0   c                    | j                   j                  j                  t        j                        d   }dj                  |t        j                        }| j                  j                  j                  |      j                  d      }| j                  j                  || j                   j                  | j                  j                  j                   j                  |z
        S )Nr   z{0}{1}mount	mnt_sharer  )rl   r  splitr   r7   formatr3   r4   rn   r  rk   rf   rS  r  rg   )r+   
table_namemount_structrg   s       r/   rO  zmount.next_peerk  s    XX''--inn=a@
$++J	G++44



, 	 }}##HH>>&&**11F: $ 
 	
r0   N)(r   r   r   
MNT_NOSUID	MNT_NODEV
MNT_NOEXECMNT_NOATIMEMNT_NODIRATIMEMNT_RELATIMEr0  MNT_SHRINKABLEMNT_WRITE_HOLDr5  r8  r2  r   r  r  r  r  r  r   r   r"  r$  r&  r+  r.  r   rP  r   rU  r6  r9  r=  rC  rL  rF  rN  rO  r   r0   r/   r  r    s   JIJKNLLNNJN 	H7HYjIHC HGH#+2D 2:	:J# J 64 6:t :C$ CFS F  "
$
r0   r  c                       e Zd Zd ZdefdZdefdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdefdZd ZdefdZdee   fdZd ZdefdZdefdZdefdZdefdZy)vfsmountc                 |    | j                         dk7  xr( | j                         dk7  xr | j                         dk7  S r  )r  r  r  r<   s    r/   is_validzvfsmount.is_validz  sB    OO" +!!#q(+##%*	
r0   r   c                 $    | j                  d      S )a  Helper to distinguish between kernels prior to version 3.3.8 that
        lacked the 'mount' structure and later versions that have it.

        The 'mnt_parent' member was moved from struct 'vfsmount' to struct
        'mount' when the latter was introduced.

        Alternatively, vmlinux.has_type('mount') can be used here but it is faster.

        Returns:
            bool: 'True' if the kernel
        r  )rC   r<   s    r/    _is_kernel_prior_to_struct_mountz)vfsmount._is_kernel_prior_to_struct_mount  s     |,,r0   c                     t        |      t        j                  k(  r| j                  j                  |k(  S t        j                  d      )a;  Helper to make sure it is comparing two pointers to 'vfsmount'.

        Depending on the kernel version, the calling object (self) could be
        a 'vfsmount \*' (<3.3.8) or a 'vfsmount' (>=3.3.8). This way we trust
        in the framework "auto" dereferencing ability to assure that when we
        reach this point 'self' will be a 'vfsmount' already and self.vol.offset
        a 'vfsmount \*' and not a 'vfsmount \*\*'. The argument must be a 'vfsmount \*'.
        Typically, it's called from do_get_path().

        Args:
            vfsmount_ptr (vfsmount *): A pointer to a 'vfsmount'

        Raises:
            exceptions.VolatilityException: If vfsmount_ptr is not a 'vfsmount \*'

        Returns:
            bool: 'True' if the given argument points to the the same 'vfsmount'
            as 'self'.
        z5Unexpected argument type. It has to be a 'vfsmount *')typer   Pointerrl   rg   r   r  )r+   vfsmount_ptrs     r/   is_equalzvfsmount.is_equal  s>    ( 088??l2200G r0   c                     t         j                  j                  | j                  |       }t         j                  j	                  | j
                  j                  dd|      S )zGets the struct 'mount' containing this 'vfsmount'.

        It should be only called from kernels >= 3.3.8 when 'struct mount' was introduced.

        Returns:
            mount: the struct 'mount' containing this 'vfsmount'.
        r  r   )r!   r  get_module_from_volobj_typer3   container_ofrl   rg   )r+   vmlinuxs     r/   _get_real_mntzvfsmount._get_real_mnt  sK     &&BB4==RVW##00HHOOWeW
 	
r0   c                 "    | j                         S )zhReturns the current fs where we are mounted on

        Returns:
            A vfsmount pointer
        )r  r<   s    r/   r$  zvfsmount.get_vfsmnt_current  s     ""$$r0   c                 ~    | j                         r| j                         S | j                         j                         S )zGets the parent fs (vfsmount) to where it's mounted on

        Returns:
            For kernels <  3.3.8: A vfsmount pointer
            For kernels >= 3.3.8: A vfsmount object
        )re  r  ro  r&  r<   s    r/   r&  zvfsmount.get_vfsmnt_parent  s7     002&&((%%'99;;r0   c                 ~    | j                         r| j                         S | j                         j                         S r)  )re  r  ro  r+  r<   s    r/   r+  zvfsmount.get_dentry_current  7     002**,,%%'::<<r0   c                 ~    | j                         r| j                         S | j                         j                         S r-  )re  r  ro  r<   s    r/   r.  zvfsmount.get_dentry_parent  rs  r0   c                 v    | j                         r| j                  S | j                         j                         S )zGets the mnt_parent member.

        Returns:
            For kernels <  3.3.8: A vfsmount pointer
            For kernels >= 3.3.8: A mount pointer
        )re  r  ro  r  r<   s    r/   r  zvfsmount.get_mnt_parent  s2     002??"%%'6688r0   c                 p    | j                  d      r| j                  S | j                         j                  S )r  r  )rC   r  ro  r<   s    r/   r  zvfsmount.get_mnt_mountpoint  s2     ??+,&&&%%'666r0   c                     | j                   S r'   )r  r<   s    r/   r  zvfsmount.get_mnt_root  s    }}r0   c                     | j                         r#| j                  | j                  j                  k7  S | j	                         j                         S r'   )re  r  rl   rg   ro  r"  r<   s    r/   r"  zvfsmount.has_parent  s=    002??dhhoo55%%'2244r0   c                     | j                   S )r  )r  r<   s    r/   r  zvfsmount.get_mnt_sb  s    {{r0   c                 D    | j                   t        j                  z  rdS dS rK  )r  r  r0  r<   s    r/   rP  zvfsmount.get_flags_access  s    ~~(:(::tDDr0   c                     t         j                  j                         D cg c]  \  }}|| j                  z  dk7  r| }}}|S c c}}w r  )r  r2  r  r  )r+   r3  
mntflagtxtr   s       r/   rU  zvfsmount.get_flags_opts	  sO     (-'<'<'>
#'1, 
 

 
s   Ac                     | j                   S r'   )r  r<   s    r/   r  zvfsmount.get_mnt_flags  s    ~~r0   c                 D    | j                         t        j                  z  S r'   )r  r  r5  r<   s    r/   r6  zvfsmount.is_shared  s    !!#e&6&666r0   c                 D    | j                         t        j                  z  S r'   )r  r  r8  r<   s    r/   r9  zvfsmount.is_unbindable  s    !!#e&:&:::r0   c                 d    | j                   xr# | j                   j                  j                  dk7  S r  r;  r<   s    r/   r=  zvfsmount.is_slave  r>  r0   c                 D    t        j                  | j                  d      S r@  rA  r<   s    r/   rC  zvfsmount.get_devname  rD  r0   N)r   r   r   rc  r   re  rj  ro  r$  r&  r+  r.  r  r  r  r"  r  r   rP  r   rU  r  r6  r9  r=  rC  r   r0   r/   ra  ra  y  s    
-$ - 6
%
<	=	=
9	75D 5E# E 74 7;t ;C$ CFS Fr0   ra  c                       e Zd Zd Zy)kobjectc                     | j                   j                  }|j                  d      r|j                  }|S |j                  j                  }|S )Ncounter)krefrefcountrC   r  refs)r+   refcntr  s      r/   reference_countzkobject.reference_count"  sE    ##Y'..C 
 ++%%C
r0   N)r   r   r   r  r   r0   r/   r  r  !  s    r0   r  c                       e Zd Zd Zd Zy)mnt_namespacec                     | j                  d      r| j                  S | j                  d      r1| j                  j                  d      r| j                  j                  S t	        d      )N	proc_inumrP  inumz"Unable to find mnt_namespace inoderC   r  rP  r  rF   r<   s    r/   	get_inodezmnt_namespace.get_inode,  sO    ??;'>>!__T"tww'9'9&'A77<< !EFFr0   c              #   d  K   | j                   j                  j                  t        j                        d   }|t        j                  z   dz   }| j
                  j                  j                  |      s|t        j                  z   dz   }| j                  j                  |d      D ]  }|  y w)Nr   r  ra  mnt_list)
rl   r  rT  r   r7   r3   r4   has_typelistr   )r+   rV  mnt_typer  s       r/   get_mount_pointszmnt_namespace.get_mount_points4  s     XX''--inn=a@
	.8}}))228<!INN2Z?HYY&&x<EK =s   B.B0N)r   r   r   r  r  r   r0   r/   r  r  +  s    Gr0   r  c                       e Zd Zd Zy)netc                     | j                  d      r| j                  S | j                  d      r1| j                  j                  d      r| j                  j                  S t	        d      )Nr  rP  r  z"Unable to find net_namespace inoder  r<   s    r/   r  znet.get_inode?  sQ    ??;'>>!__T"tww'9'9&'A77<< !!EFFr0   N)r   r   r   r  r   r0   r/   r  r  >  s    	Gr0   r  c                       e Zd Zd Zd Zd Zy)socketc                 4   | j                   j                  j                  dd      }t        |      dk(  r|d   nd }t	        | j
                  j                  j                  |            }|st        d|       |d   }| j
                  j                  |   }|S )N!rj   r   r   z!No module using the symbol table )	rl   r  rT  r  r  r3   modulesget_modules_by_symbol_tablesr  )r+   symbol_table_arrsymbol_tablemodule_nameskernel_module_namekernels         r/   _get_vol_kernelzsocket._get_vol_kernelL  s    88--33C;.12B.Cq.H'*dMM!!>>|L
 @OPP)!_&&'9:r0   c                     	 | j                         }t        j                  j	                  | j
                  j                  dd|      }|j                  }|j                  S # t        $ r Y yw xY w)Nr   socket_allocr  )	r  r  r!   r  rm  rl   rg   	vfs_inodei_ino)r+   r  r  r  s       r/   r  zsocket.get_inodeY  si    	))+F ++88HHOO^Xv
 !**	  		s   A   	A,+A,c                 b    | j                   }d|cxk  rt        t              k  rt        |   S  y y r  )stater  r   )r+   socket_state_idxs     r/   	get_statezsocket.get_statee  s0    :: 53}#55 !122 6r0   N)r   r   r   r  r  r  r   r0   r/   r  r  K  s    
3r0   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)sockc                 v    | j                   j                  }d|cxk  rt        t              k  rt        |   S  y y r  )_sock__sk_common
skc_familyr  r   r+   
family_idxs     r/   
get_familyzsock.get_familyl  s5    %%00

-S--z** .r0   c                 B    t        j                  | j                  d      S )Nr   )r   getsk_typer<   s    r/   rn   zsock.get_typeq  s    ~~dllB//r0   c                 P    | j                   sy| j                   j                         S r  )	sk_socketr  r<   s    r/   r  zsock.get_inodet  s    ~~~~''))r0   c                      y r'   r   r<   s    r/   get_protocolzsock.get_protocoly      r0   c                     | j                  d      r$| j                  j                  j                         S | j                  j                         S )Nsk)rC   r  r  r  r<   s    r/   r  zsock.get_state|  s:    ??4 77$$..00~~''))r0   N)r   r   r   r  rn   r  r  r  r   r0   r/   r  r  k  s    +
0*
*r0   r  c                   $    e Zd Zd Zd Zd Zd Zy)	unix_sockc                     | j                   sy | j                   j                  j                  d      }t        t	        j
                  |j                              }|S )Nsockaddr_un)addrr_   castr   r   r^   sun_path)r+   r  saddrs      r/   r`   zunix_sock.get_name  sD    yyiinn))-8G++K,@,@ABr0   c                      y r'   r   r<   s    r/   r  zunix_sock.get_protocol  r  r0   c                    | j                   j                         dk(  rD| j                   j                  j                  }d|cxk  rt	        t
              k  rt
        |   S  yy| j                   j                  j                         S z,Return a string representing the sock state.STREAMr   N)r  rn   _unix_sock__sk_common	skc_stater  r   r  r  r+   	state_idxs     r/   r  zunix_sock.get_state  sj     77)++55II/J/!),, 0 77$$..00r0   c                 6    | j                   j                         S r'   )r  r  r<   s    r/   r  zunix_sock.get_inode  s    ww  ""r0   N)r   r   r   r`   r  r  r  r   r0   r/   r  r    s    
1#r0   r  c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)		inet_sockc                     | j                   j                  j                  }d|cxk  rt        t              k  rt        |   S  y y r  )r  _inet_sock__sk_commonr  r  r   r  s     r/   r  zinet_sock.get_family  s9    WW((33

-S--z** .r0   c                     t        j                  | j                  j                        }| j	                         dk(  r*t        j                  | j                  j                  |      }|S )NAF_INET6)r   r  r  sk_protocolr  r   )r+   protocols     r/   r  zinet_sock.get_protocol  sN      ##DGG$7$78??
*%))$''*=*=xHHr0   c                    | j                   j                         dk(  rD| j                   j                  j                  }d|cxk  rt	        t
              k  rt
        |   S  yy| j                   j                  j                         S r  )r  rn   r  r  r  r   r  r  r  s     r/   r  zinet_sock.get_state  sj     77)++55II/J/!),, 0 77$$..00r0   c           	      b    t        | dt        | dd             }|t        j                  |      S y )Nsport
inet_sport)r  socket_modulehtons)r+   sport_les     r/   get_src_portzinet_sock.get_src_port  s5    4'$d*KL &&x00  r0   c                 (   | j                   j                  }t        |d      r|j                  dz  }nLt        | d      r| j                  }n3t        | d      r| j
                  }nt        |d      r|j                  }ny t        j                  |      S )Nskc_portpairi  dport
inet_dport	skc_dport)	r  r  r   r  r  r  r  r  r  )r+   	sk_commondport_les      r/   get_dst_portzinet_sock.get_dst_port  sz    GG''	9n- --6HT7#zzHT<(HY, **H""8,,r0   c                    | j                   j                  }|j                  }|t        j                  k(  rAd}t        | d      r| j                  }nSt        | d      r| j                  }n:|j                  }n-|t        j                  k(  rd}| j                  j                  }ny | j                  j                  | j                  j                     }	 |j!                  |j                  j"                  |      }t        j,                  ||      S # t$        j&                  $ r0 t(        j+                  d|j                  j"                  d       Y y w xY w)Nr3  	rcv_saddrinet_rcv_saddrr5  z'Unable to read socket src address from #x)r  r  r  r  AF_INETr   r  r  skc_rcv_saddrr  pinet6r  r3   r   rl   rf   readrg   r   r   r:   r;   	inet_ntop)r+   r  family	addr_sizer  r   
addr_bytess          r/   get_src_addrzinet_sock.get_src_addr  s   GG''	%%]***It[)/0++!//}---IKK%%E}}++DHH,?,?@	%**599+;+;YGJ &&vz:: 11 	LL9%)):J:J29NO 		s   &D A EEc                    | j                   j                  }|j                  }|t        j                  k(  rYt        | d      r| j                  r| j                  }n1t        | d      r| j                  r| j                  }n|j                  }d}nP|t        j                  k(  r<t        | j                  d      r| j                  j                  }n|j                  }d}ny | j                  j                  | j                  j                     }	 |j!                  |j                  j"                  |      }t        j,                  ||      S # t$        j&                  $ r0 t(        j+                  d|j                  j"                  d       Y y w xY w)Ndaddr
inet_daddrr3  r5  z'Unable to read socket dst address from r  )r  r  r  r  r  r   r  r  	skc_daddrr  r  skc_v6_daddrr3   r   rl   rf   r  rg   r   r   r:   r;   r  )r+   r  r  r  r  r   r  s          r/   get_dst_addrzinet_sock.get_dst_addr  s=   GG''	%%]***tW%$**

|,!++I}---t{{G,))!..I}}++DHH,?,?@	%**599+;+;YGJ &&vz:: 11 	LL9%)):J:J29NO 		s   &E	 	A FFN)
r   r   r   r  r  r  r  r  r  r  r   r0   r/   r  r    s%    +
	11
-;4;r0   r  c                   $    e Zd Zd Zd Zd Zd Zy)netlink_sockc                 v    | j                   j                  }d|cxk  rt        t              k  rt        |   S  y y r  )r  r  r  r   )r+   protocol_idxs     r/   r  znetlink_sock.get_protocol  s4    ww**5s#455$\22 6r0   c                 J    | j                   j                  j                         S r'   r  r  r  r<   s    r/   r  znetlink_sock.get_state      ww  **,,r0   c                     | j                  d      r| j                  S | j                  d      r| j                  S t        d      )Nr   portidzUnable to find a source port id)rC   r   r  rF   r<   s    r/   
get_portidznetlink_sock.get_portid  s9    ??5!88O??8$;; !BCCr0   c                     | j                  d      r| j                  S | j                  d      r| j                  S t        d      )Ndst_pid
dst_portidz$Unable to find a destination port id)rC   r  r	  rF   r<   s    r/   get_dst_portidznetlink_sock.get_dst_portid  s:    ??9%<<??<(??" !GHHr0   N)r   r   r   r  r  r  r
  r   r0   r/   r  r    s    3
-DIr0   r  c                       e Zd Zd Zd Zy)
vsock_sockc                      y r'   r   r<   s    r/   r  zvsock_sock.get_protocol"      r0   c                 J    | j                   j                  j                         S r'   r  r<   s    r/   r  zvsock_sock.get_state&  r  r0   Nr   r   r   r  r  r   r0   r/   r  r  !  s    -r0   r  c                       e Zd Zd Zd Zy)packet_sockc                 z    t        j                  | j                        }|dk(  ry |t        v r	t        |   S d|dS )Nr   0xr   )r  r  numr   )r+   	eth_protos     r/   r  zpacket_sock.get_protocol,  sB    !''1	>-' ++	!}%%r0   c                 J    | j                   j                  j                         S r'   r  r<   s    r/   r  zpacket_sock.get_state5  r  r0   Nr  r   r0   r/   r  r  +  s    &-r0   r  c                       e Zd Zd Zd Zy)bt_sockc                 v    | j                   j                  }d|cxk  rt        t              k  rt        |   S  y y r  )r  r  r  r   )r+   type_idxs     r/   r  zbt_sock.get_protocol;  s4    77&&33233&x00 4r0   c                     | j                   j                  j                  }d|cxk  rt        t              k  rt        |   S  y y r  )r  _bt_sock__sk_commonr  r  r   r  s     r/   r  zbt_sock.get_state@  s:    GG''11		1C 011#I.. 2r0   Nr  r   r0   r/   r  r  :  s    1
/r0   r  c                       e Zd Zd Zd Zy)xdp_sockc                      y r'   r   r<   s    r/   r  zxdp_sock.get_protocolG  r  r0   c                 6    | j                   j                         S r'   )r  lookupr<   s    r/   r  zxdp_sock.get_stateK  s    zz  ""r0   Nr  r   r0   r/   r  r  F  s    #r0   r  c                   N    e Zd Zdeedf   fdZdeedf   fdZdeedf   fdZy)bpf_progr   Nc                    | j                  d      r| j                  j                  S | j                  d      rG| j                  r;| j                  j                  d      r | j                  j                  j                  S y)z+Returns a string with the eBPF program typerg  aux	prog_typeN)rC   rg  descriptionr&  r'  r<   s    r/   rn   zbpf_prog.get_typeQ  s_    
 ??6"99(((??5!dhhxx"";/xx))555 r0   c                    | j                  d      syt        j                  j                  | j                  |       }|j
                  j                  |j                     }| j                  j                  j                  }| j                  j                  }|j                  ||      }t        j                  |      j                         }|S )z*Returns a string with the eBPF program tagtagN)rC   r!   r  rl  r3   r  r   rf   r*  rl   rg   ri   r  binasciihexlifydecode)r+   rn  vmlinux_layerprog_tag_addrprog_tag_sizeprog_tag_bytesprog_tags          r/   get_tagzbpf_prog.get_tagb  s     u%&&BB4==RVW..w/A/AB++&++M=I##N3::<r0   c                 Z    | j                  d      sy| j                  j                         S )+Returns a string with the eBPF program namer&  N)rC   r&  r`   r<   s    r/   r`   zbpf_prog.get_namer  s$    u%xx  ""r0   )r   r   r   r
   r   rn   r3  r`   r   r0   r/   r$  r$  P  sA    %T	* "sDy)  #%T	* #r0   r$  c                   "    e Zd Zdeedf   fdZy)bpf_prog_auxr   Nc                 ~    | j                  d      sy| j                  syt        j                  | j                        S )r5  r_   N)rC   r_   r   r^   r<   s    r/   r`   zbpf_prog_aux.get_name|  s0    v&yy&&tyy11r0   )r   r   r   r
   r   r`   r   r0   r/   r7  r7  {  s    	2%T	* 	2r0   r7  c                   ,    e Zd ZdedefdZed        Zy)credr  r   c                    | j                  |      st        d| d      | j                  |      }t        |d      r|j                  }t        |      S t        |t        j                        r|}t        |      S t        d      )a  Helper to obtain the right cred member value for the current kernel.

        Args:
            member (str): The requested cred member name to obtain its value

        Raises:
            AttributeError: When the requested cred member doesn't exist
            AttributeError: When the cred implementation is not supported.

        Returns:
            int: The cred member value
        zstruct cred doesn't have a 'z' membervalz#Kernel struct cred is not supported)	rC   rF   r  r   r<  r   r   Integerr   )r+   r  cred_valvalues       r/   _get_cred_int_valuezcred._get_cred_int_value  s     v& #?xx!PQQ;;v&8U#LLE 5z '//2E 5z !!FGGr0   c                 $    | j                  d      S )zeReturns the effective user ID

        Returns:
            int: the effective user ID value
        euid)r@  r<   s    r/   rB  z	cred.euid  s     ''//r0   N)r   r   r   r   r   r@  r   rB  r   r0   r/   r:  r:    s)    # # 8 0 0r0   r:  c                   |    e Zd Zedefd       ZdefdZededee   fd       Z	defdZ
dee   fdZdedefd	Zy
)kernel_cap_structr   c                 &    t        t              dz
  S )zReturns the latest capability ID supported by the framework.

        Returns:
            int: The latest capability ID supported by the framework.
        rj   )r  r   )clss    r/   get_last_cap_valuez$kernel_cap_struct.get_last_cap_value  s     < 1$$r0   c                     t         j                  j                  | j                  |       }	 |j	                  d      }d|dz   z  dz
  S # t
        j                  $ r | j                         }Y 0w xY w)zReturn the maximum value allowed for this kernel for a capability

        Returns:
            int: The capability full bitfield mask
        cap_last_cap)symbol_namerj   )r!   r  rl  r3   object_from_symbolr   r9   rG  )r+   rn  rI  s      r/   get_kernel_cap_fullz%kernel_cap_struct.get_kernel_cap_full  su     &&BB4==RVW	5"55.5QL
 \A%%**	 %% 	5224L	5s   A	 	#A/.A/capabilities_bitfieldc                 r    g }t        t              D ]"  \  }}|d|z  z  dk7  s|j                  |       $ |S )zTranslates a capability bitfield to a list of capability strings.

        Args:
            capabilities_bitfield (int): The capability bitfield value.

        Returns:
            List[str]: A list of capability strings.
        rj   r   )	enumerater   r  )rF  rM  capabilitiesbitr_   s        r/   capabilities_to_stringz(kernel_cap_struct.capabilities_to_string  sC     "<0IC$S1Q6##D) 1 r0   c                    | j                  d      st        j                  d      t        | j                  t
        j                        rxt        | j                        dk(  r| j                  d   }n\t        | j                        dk(  r#| j                  d   dz  | j                  d   z  }n!t        j                  d      | j                  }|| j                         z  S )pReturns the capability bitfield value

        Returns:
            int: The capability bitfield value.
        cap.Unsupported kernel capabilities implementationrj   r   r   rr  )	rC   r   r  r   rU  r   Arrayr  rL  r+   	cap_values     r/   get_capabilitiesz"kernel_cap_struct.get_capabilities  s     u%00@  dhh.488}! !HHQK	TXX!# "XXa[B.$((1+=	 44D 
 I433555r0   c                 D    | j                         }| j                  |      S )zyReturns the list of capability strings.

        Returns:
            List[str]: The list of capability strings.
        )rZ  rR  )r+   capabilities_values     r/   enumerate_capabilitiesz(kernel_cap_struct.enumerate_capabilities  s%     "224**+=>>r0   
capabilityc                     |t         vrt        d| d      dt        j                  |      z  }|| j                         z  dk7  S )aR  Checks if the given capability string is enabled.

        Args:
            capability (str): A string representing the capability i.e. dac_read_search

        Raises:
            AttributeError: If the given capability is unknown to the framework.

        Returns:
            bool: "True" if the given capability is enabled.
        zUnknown capability with name ''rj   r   )r   rF   indexrZ  )r+   r^  rY  s      r/   has_capabilityz kernel_cap_struct.has_capability  sO     \) #A*Q!OPP++J77	40022a77r0   N)r   r   r   classmethodr   rG  rL  r	   r   rR  rZ  r]  r   rb  r   r0   r/   rD  rD    s}    %3 % %+S + 3 49  " 6#  6D?S	 ?8 8 8r0   rD  c                       e Zd ZdefdZy)kernel_cap_tr   c                     | j                  d      r| j                  }nt        j                  d      || j	                         z  S )rT  r<  rV  )rC   r<  r   r  rL  rX  s     r/   rZ  zkernel_cap_t.get_capabilities  sE     ??5!I00@  433555r0   N)r   r   r   r   rZ  r   r0   r/   re  re    s    6# 6r0   re  c                       e Zd ZdefdZy)
timespec64r   c                 d    t        j                  | j                  | j                  dz  z         }|S )z%Returns the respective aware datetime    eA)r   unixtime_to_datetimetv_sectv_nsec)r+   dts     r/   to_datetimeztimespec64.to_datetime/  s+     ,,T[[4<<#;M-MN	r0   N)r   r   r   r   ro  r   r0   r/   rh  rh  .  s    X r0   rh  c                   T   e Zd ZdefdZedefd       Zedefd       Zedefd       Zedefd       Z	edefd       Z
edefd       Zedefd	       Zedefd
       Zdeedf   fdZdefdZdefdZdefdZdefdZdefdZdej0                  j2                  fdZd Zy)inoder   c                 V    | j                   dkD  xr | j                  j                  dk\  S r  )r  i_countr  r<   s    r/   rc  zinode.is_valid7  s&     zzA~;$,,"6"6!";;r0   c                 F    t        j                  | j                        dk7  S )z(Returns True if the inode is a directoryr   )statS_ISDIRi_moder<   s    r/   is_dirzinode.is_dir<       ||DKK(A--r0   c                 F    t        j                  | j                        dk7  S )z+Returns True if the inode is a regular filer   )ru  S_ISREGrw  r<   s    r/   is_regzinode.is_regA  ry  r0   c                 F    t        j                  | j                        dk7  S )z&Returns True if the inode is a symlinkr   )ru  S_ISLNKrw  r<   s    r/   is_linkzinode.is_linkF  ry  r0   c                 F    t        j                  | j                        dk7  S )z#Returns True if the inode is a FIFOr   )ru  S_ISFIFOrw  r<   s    r/   is_fifozinode.is_fifoK       }}T[[)Q..r0   c                 F    t        j                  | j                        dk7  S )z%Returns True if the inode is a socketr   )ru  S_ISSOCKrw  r<   s    r/   is_sockzinode.is_sockP  r  r0   c                 F    t        j                  | j                        dk7  S )z+Returns True if the inode is a block devicer   )ru  S_ISBLKrw  r<   s    r/   is_blockzinode.is_blockU  ry  r0   c                 F    t        j                  | j                        dk7  S )z*Returns True if the inode is a char devicer   )ru  S_ISCHRrw  r<   s    r/   is_charzinode.is_charZ  ry  r0   c                 B    | j                   t        j                  z  dk7  S )z%Returns True if the sticky bit is setr   )rw  ru  S_ISVTXr<   s    r/   	is_stickyzinode.is_sticky_  s     dll*q00r0   Nc                     | j                   ry| j                  ry| j                  ry| j                  ry| j                  ry| j
                  ry| j                  ryy)	zRReturns inode type name

        Returns:
            The inode type name
        DIRREGLNKFIFOSOCKCHRBLKN)rx  r|  r  r  r  r  r  r<   s    r/   get_inode_typezinode.get_inode_typed  sM     ;;[[\\\\\\\\]]r0   c                    | j                  | d      rS| j                  | d      r?t        j                  | j                  | d      | j                  | d      dz  z         S | j                  d|       r"| j                  d|       j	                         S | j                  |      r| j                  |      j	                         S t        j                  d      )N_sec_nsecrj  __z,Unsupported kernel inode type implementation)rC   r   rk  r  ro  r   r  )r+   r  s     r/   _time_member_to_datetimezinode._time_member_to_datetime{  s    ??fXT?+6(%@P0Q 22vhdO,t&?O/PSV/VV  __r&]+ ;;F8}-99;;__V$;;v&224400> r0   c                 $    | j                  d      S )zReturns the inode's last access time
        This is updated when inode contents are read

        Returns:
            A datetime with the inode's last access time
        i_atimer  r<   s    r/   get_access_timezinode.get_access_time       ,,Y77r0   c                 $    | j                  d      S )zReturns the inode's last modification time
        This is updated when the inode contents change

        Returns:
            A datetime with the inode's last data modification time
        i_mtimer  r<   s    r/   get_modification_timezinode.get_modification_time  s     ,,Y77r0   c                 $    | j                  d      S )zReturns the inode's last change time
        This is updated when the inode metadata changes

        Returns:
            A datetime with the inode's last change time
        i_ctimer  r<   s    r/   get_change_timezinode.get_change_time  r  r0   c                 @    t        j                  | j                        S )zReturns the inode's file mode as string of the form '-rwxrwxrwx'.

        Returns:
            The inode's file mode string
        )ru  filemoderw  r<   s    r/   get_file_modezinode.get_file_mode  s     }}T[[))r0   c              #     K   | j                   sy| j                  r| j                  j                  dkD  syt        j                  | j
                  d| j                  j                               }|j                         E d{    y7 w)z\Gets the inode's cached pages

        Yields:
            The inode's cached pages
        Nr   r  )r  r  
page_cache)i_size	i_mappingnrpagesr!   	PageCacher3   r  get_cached_pages)r+   r  s     r/   	get_pageszinode.get_pages  si      {{..T^^%;%;a%?__MM'~~113


 ..000s   BBB	Bc              #      K   | j                         D ]-  }t        |j                        }|j                         }||f / yw)zGet the inode cached pages from the page cache

        Yields:
            page_index (int): The page index in the Tree. File offset is page_index * PAGE_SIZE.
            page_content (str): The page content
        N)r  r   ra  get_content)r+   page_obj
page_indexpage_contents       r/   get_contentszinode.get_contents  s@      (HX^^,J#//1Ll** )s   AA)r   r   r   r   rc  r   rx  r|  r  r  r  r  r  r  r
   r   r  r   r  r  r  r  r  r   r   r   r  r  r   r0   r/   rq  rq  6  sT   <$ <
 . . . . . . . . . / / / / / / .$ . . . . . 14 1 1c4i 0 .( &8 88x 88 8*s *1:--== 1$
+r0   rq  c                       e Zd Zed        Zy)address_spacec                     | j                  d      r| j                  d      S | j                  d      r| j                  d      S t        j                  d      )z=Returns the appropriate member containing the page cache treei_pages	page_treezUnsupported page cache tree)rC   r  r   r  r<   s    r/   r  zaddress_space.i_pages  sL     ??9%;;y))__[);;{++,,-JKKr0   N)r   r   r   r   r  r   r0   r/   r  r    s    	L 	Lr0   r  c                   ~    e Zd Ze ej
                         defd              Zdee	   fdZ
defdZdee	df   fdZy)pager   c                    	 | j                   j                  j                  | j                         t        j
                  z   dz         j                  }|S # t        j                  $ r t        j                  d       i }Y |S w xY w)zReturns 'pageflags' enumeration key/values

        Returns:
            A dictionary with the pageflags enumeration key/values
        	pageflagszOUnable to find pageflags enum. This can happen in kernels < 2.6.26 or wrong ISF)r3   r4   r5   r6   r   r7   r8   r   r9   r:   r;   )r+   pageflags_enums     r/   r  zpage.pageflags_enum  s~    		 !]]77GG**,y~~=Kg   %% 	 LLa  N	 s   AA *BBc                     g }| j                   j                         D ],  \  }}| j                  d|z  z  dk7  s|j                  |       . |S )zVReturns a list of page flags

        Returns:
            List of page flags
        rj   r   )r  r  r   r  )r+   r   r_   r?  s       r/   get_flags_listzpage.get_flags_list  sN     ..446KD%zzQ%Z(A-T" 7 r0   c                    t         j                  j                  | j                  |       }|j                  j
                  |j                     }d}|j                  d      rL|j                  d      r|j                  d      }n|j                  dk  rd}|}nst        j                  d      |j                  d      r|j                  d      }n;|j                  d      rt        j                  d	      t        j                  d
      |st        j                  d      |j                  d      j                  }|j                  | j                  j                         }||z
  |z  }||j"                  z  }|S )zConverts a page's virtual address to its physical address using the current physical memory model.

        Returns:
            int: page physical address
        Nmem_sectionvmemmap_base9   l        ( z#5-level paging is not yet supportedmem_map	node_dataz"NUMA systems are not yet supportedzUnsupported Linux memory modelz*Something went wrong, we shouldn't be herer  )r!   r  rl  r3   r  r   rf   
has_symbolrK  _maxvirtaddrr   r  rn   rP   canonicalizerl   rg   r  )	r+   rn  r.  vmemmap_startvmemmap_base_l4page_type_sizepagecpfn
page_paddrs	            r/   to_paddrzpage.to_paddr  s^    &&BB4==RVW..w/A/ABm,!!.1 ' : :> J !--2&8O$3M %88=  	*#66yAM,001UVV001QRR00<  !))&166**488??;}$7=222
r0   Nc                 0   t         j                  j                  | j                  |       }|j                  j
                  |j                     }|j                  j
                  d   }| j                         }|sy|j                  ||j                        }|S )zPReturns the page content

        Returns:
            The page content
        memory_layerN)
r!   r  rl  r3   r  r   rf   r  r  r  )r+   rn  r.  physical_layerr  	page_datas         r/   r  zpage.get_content7  s~     &&BB4==RVW..w/A/AB //?]]_
"''
M4K4KL	r0   )r   r   r   r   	functools	lru_cacher   r  r	   r   r  r   r  r
   r  r   r0   r/   r  r    s`    Y   *S	 1# 1fU39- r0   r  c                       e Zd ZdZdez  dz
  ZdZedz  dz
  Zdez  ZdedefdZ	dedefdZ
defd	Zdefd
ZdefdZy)IDRr4  rj   r3  
num_layersr   c                 p    t        | j                  || j                  z  | j                  g      }d|z  dz
  S )zReturns the maximum ID which can be allocated given idr::layers

        Args:
            num_layers: Number of layers

        Returns:
            Maximum ID for a given number of layers
        rj   )minINT_SIZEIDR_BITSMAX_IDR_SHIFT)r+   r  bitss      r/   idr_maxzIDR.idr_maxO  s6     DMM:#=t?Q?QRST	Qr0   idr_idc                 0   t         j                  j                  | j                  |       }|j	                  d      j                  d      st        j                  d       y|dk  ry| j                  }|sy|j                  dz   | j                  z  }|| j                  |j                  dz         kD  ry|dk7  sJ |dkD  rV|rT|| j                  z  }||j                  | j                  z  k(  sJ |j                  ||z	  | j                  z     }|dkD  r|rT|S )zFinds an ID within the IDR data structure.
        Based on idr_find_slowpath(), 3.9 <= Kernel < 4.11
        Args:
            idr_id: The IDR lookup ID

        Returns:
            A pointer to the given ID element
        	idr_layerr  zUUnsupported IDR implementation, it should be a very very old kernel, probabably < 2.6Nr   rj   )r!   r  rl  r3   rn   rC   r:   r   topr  r  r  aryIDR_MASK)r+   r  rn  r  ns        r/   idr_findzIDR.idr_find]  s    &&BB4==RVW,77@KKg A:HH	__q DMM1DLL1!455Avv!e	A	$--7777!v{dmm&CDI !e	
 r0   c              #      K   | j                   }dx}}||k  r(| j                  |      }|r	| |dz  }|dz  }||k  r'y y w)Nr   rj   )curr  )r+   r  totalnext_identrys        r/   _old_kernel_get_entrieszIDR._old_kernel_get_entries  sQ     hhmMM'*E
qLG ms
   <AAc              #      K   t         j                  j                  | j                  d      }|j	                  | j
                        D ]  }|  y w)Nr  )r  )r   )r!   	IDStoragechoose_id_storager3   get_entriesidr_rt)r+   
id_storage	page_addrs      r/   _new_kernel_get_entrieszIDR._new_kernel_get_entries  sL     __66MMh 7 

 $//T[[/AIO Bs   AAc              #      K   | j                  d      r| j                  }n| j                  } |       D ]  }|  yw)zWalks the IDR and yield a pointer associated with each element.

        Args:
            in_use (int, optional): _description_. Defaults to 0.

        Yields:
            A pointer associated with each element.
        r  N)rC   r  r  )r+   get_entries_funcr  s      r/   r  zIDR.get_entries  s@      ??8$#;;  $;;)+IO ,s   <>N)r   r   r   r  r  r  r  MAX_IDR_BITr   r  r  r  r  r  r   r0   r/   r  r  H  s}    HX"HHqL1$M}$K# # #s #s #J
 
 S r0   r  )[collections.abccollectionsloggingr  r+  ru  r   r  r  typingr   r   r   r   r   r	   r
   r   volatility3.frameworkr   r   r   r   r   volatility3.framework.renderersr   #volatility3.framework.configurationr   %volatility3.framework.constants.linuxr   r   r   r   r   r   r   r   r   r   r   volatility3.framework.layersr   volatility3.framework.objectsr   volatility3.framework.symbolsr    r!   r"   .volatility3.framework.symbols.linux.extensionsr#   	getLoggerr   r:   GenericIntelProcessr%   r   
StructTyper   r   r  r1  r,  r  r   r  abcr  r  r  ra  r  r  r  r  r  r  r  r  r  r  r  r$  r7  r:  rD  re  rh  rq  r  r  r  r   r0   r/   <module>r     s2  
        T T T U U 6 < I N O Q T > / 1 B B >			8	$
}GW(( }G@V'-- Vr>"" >$}## }@FN"" FNR1'$$ 1hqW'' qh
7 
GKW GKTE'$$ E&5Q""KOO$<$< 5QpU7%% U$E
G E
PeFw!! eFPg   G&& &
G'

 
G3W 3@*7 *0#"" #6a;"" a;HI7%% I>-## --'$$ -	/g   	/#w!! #(#w!! (#V
27%% 
2%07 %0Pg8** g8T6$ 6(## X+G X+vLG&& Lf7 fR_'

 _r0   