
    *1fG                        d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ  ej&                  e      Z G d dej,                        Z G d	 d
ej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z  G d dej0                        Z! G d dej0                        Z" G d dej0                        Z# G d d ej0                        Z$y)!    N)	GeneratorIterableOptionalSetTuple)	constants
exceptions
interfacesobjects)utility)
conversion)genericc                       e Zd Zd Z	 ddededee   fdZdeej                  j                     fdZ	 ddej                  j                  ded	edeeeef   ddf   fd
Zy)procc                 T    | j                   j                         j                  d      S )Ntask)r   dereferencecastselfs    g/home/panchajanya/Development/work/volatility3/volatility3/framework/symbols/mac/extensions/__init__.pyget_taskzproc.get_task   s     yy$$&++F33    Nconfig_prefixpreferred_namereturnc                    | j                   j                  | j                  j                     }t	        |t
        j                  j                        st        d      	 | j                         j                  j                  j                  }|&| 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.
        zJParent layer is not a translation layer, unable to construct process layerN_Process)_contextlayersvol
layer_name
isinstancer
   TranslationLayerInterface	TypeErrorr   mappmappm_cr3r	   InvalidAddressExceptionp_pid_add_process_layer)r   r   r   parent_layerdtbs        r   add_process_layerzproc.add_process_layer   s     }}++DHH,?,?@,
(9(9(S(ST\ 	--/%%**11C
 !!XX00Xdjj\3JJN &&MM3~
 	
 11 		s   .C C('C(c              #     K   	 | j                         }|j                  j                  j                  j                  }t               }t        |j                  j                  j                        D ]7  }|r|j                  j                  |v s| j                  j                  |j                  j                     j                  |j!                         j                  j                  |j!                         j                  j"                        s&t$        j'                  t(        j*                  d        y |j                  j,                  dk(  s|j                  j.                  dk(  r y | |j1                  |j                  j                         |j                  j                  }: y # t
        j                  $ r Y y w xY ww)Nz5Breaking process maps iteration due to invalid state.l   >[={mu )r   r&   hdrlinksnextr	   r)   setrangenentriesr!   offsetr   r    native_layer_nameis_validr   sizevolloglogr   LOGLEVEL_VVVstartendadd)r   r   current_mapseenis        r   get_map_iterzproc.get_map_iter0   sZ    	==?D((,,,,11K txx||,,- 	1A??))T1}}++DHH,F,FGPP++-1188++-1166
 

**K  !!''+==$$((,>>HH[__++,%++00K1	1 11 		s(   G:F- E/G-G GGGcontext
rw_no_filec              #   @  K   | j                         D ]  }t        |j                  j                        }t        |j                  j                        }|r<|j                         dk7  s|j                  ||      dk7  r|j                         dk7  r|||z
  f  yw)zdReturns a list of sections based on the memory manager's view of
        this task's virtual memory.rw [heap]N)rC   intr1   r=   r>   	get_permsget_pathget_special_path)r   rD   r   rE   vmar=   r>   s          r   get_process_memory_sectionsz proc.get_process_memory_sectionsY   s      $$& 	'C		(Eciimm$CMMOt+||G];rA++-9 #+&&	's   BB)NN)F)__name__
__module____qualname__r   strr   r.   r   r
   r   ObjectInterfacerC   rD   ContextInterfaceboolr   r   rJ   rO    r   r   r   r      s    4 @D
 
9<
	#
8!1hz'9'9'I'IJ !1Z !	'##44' ' 	'
 
5c?D$.	/'r   r   c                       e Zd Zd Zy)fileglobc                 N   d }| j                  d      r| j                  }nQ| j                  dk7  rBt        j                  t
        j                        5  | j                  j                  }d d d        |r%t        |j                        j                  dd      }|S # 1 sw Y   2xY w)Nfg_typer   DTYPE_rH   )
has_memberr[   fg_ops
contextlibsuppressr	   r)   fo_typerS   descriptionreplacer   rets     r   get_fg_typezfileglob.get_fg_typeq   s    ??9%,,C[[A$$Z%G%GH *kk))* coo&..x<C
* *s   BB$N)rP   rQ   rR   rf   rW   r   r   rY   rY   p   s    r   rY   c                       e Zd Zd Zy)vm_map_objectc                     | j                  d      r| j                  S | j                  d      r| j                  S t        d      )N	vm_object
vmo_objectzvm_map_object -> get_object)r]   rj   rk   AttributeErrorr   s    r   get_map_objectzvm_map_object.get_map_object   s:    ??;'>>!__\*??":;;r   N)rP   rQ   rR   rm   rW   r   r   rh   rh      s    <r   rh   c                       e Zd Zd Zd Zy)vnodec                 N   |y |r&	 |j                  t        j                  |d             t        |j                        dz  dk7  rt        |j                        dk7  rit        |j                  j                        dk7  rF| j                  ||j                  j                  |j                  j                  j                         y y 	 |j                  }|j                  }| j                  |||       y # t        j                  $ r Y y w xY w# t        j                  $ r Y y w xY w)N      r   )appendr   pointer_to_stringr	   r)   rJ   v_flagv_mountmnt_vnodecovered_do_calc_pathv_namev_parent)r   re   vnodeobjvnameparentparent_names         r   rx   zvnode._do_calc_path   s	   

744UC@A x(*a/C8H8H4IQ4N8##445:""$$55$$55<< ;!**$mm sFK8# 55  55 s#   %C5 	D 5D
DD$#D$c                    | j                   dz  dk7  r.| j                  dk7  r| j                  j                  dz  dk7  rd}npg }g }| j                  || | j                         |j                          |D ]"  }|j                  |j                  d             $ dj                  |      }|rd|z   }|j                  d      S )Nrr   r   i @     /zutf-8)
ru   rv   mnt_flagrx   ry   reversers   encodejoindecode)r   re   elementsfileses        r   	full_pathzvnode.full_path   s    KK("a'!%%
2a7CHExt{{; 0QXXg./0 ))E"CSjzz'""r   N)rP   rQ   rR   rx   r   rW   r   r   ro   ro      s    94#r   ro   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
vm_map_entryc                 t    d}| j                         }|dk(  rd}|S |dk(  r| j                  ||      dk(  rd}|S )zhFlags memory regions that are mapped rwx or that map an executable
        not back from a file on disk.FrwxTzr-xrH   )rK   rL   )r   rD   r   re   permss        r   is_suspiciouszvm_map_entry.is_suspicious   sM      E>C
 
 e^g} E KC
r   c                 x    d}d}t        g d      D ]%  \  }}| j                  |z  |k(  r	|||   z   }!|dz   }' |S )Nr   rH   )rr         -)	enumerate
protection)r   permaskr   ctrrB   s        r   rK   zvm_map_entry.get_perms   sS    	* 	$FC!#),		$ r   c                     | j                  d      rt        | j                        }|S t        | j                        dz  }|S )Naliasi  )r]   rJ   r   
vme_offsetrd   s     r   get_range_aliaszvm_map_entry.get_range_alias   s<    ??7#djj/C 
 doo&.C
r   c                 \    | j                         }d|cxk  rdk  rd}|S  |dk(  rd}|S d}|S )Nr   
   rI      z[stack]rH   )r   )r   checkre   s      r   rM   zvm_map_entry.get_special_path   sK    $$&u>r>C 
 b[C 
 C
r   c                 L   | j                  ||      }t        |      t        k(  r	|dk(  r|}|S |rg }t               }|r|j                  j
                  |vr	 t        j                  |j                  d      }|j                  |       t        |      dkD  rnL|j                  |j                  j
                         |j                  }|r|j                  j
                  |vr|j                          ddj!                  |      z   }|S d}|S # t        j                  $ r Y ?w xY w)Nsub_maprq   i   /rH   )	get_vnodetyperS   r3   r!   r6   r   rt   ry   r	   r)   rs   lenr?   rz   r   r   )r   rD   r   nodere   pathrA   ry   s           r   rL   zvm_map_entry.get_path   s   ~~g}5:!2C. 
- D UD488??$6$66t{{CHF F#t9t#)}} 488??$6 LLN&C 
 C
! "99 s    D D#"D#c                     | j                  d      r| j                  S | j                  d      r| j                  S t        d      )N
vme_objectobjectz6vm_map_entry -> get_object: Unable to determine object)r]   r   r   rl   r   s    r   
get_objectzvm_map_entry.get_object
  :    ??<(??"__X&;;UVVr   c                     | j                  d      r| j                  S | j                  d      r| j                  S t        d      )Nr   r6   z6vm_map_entry -> get_offset: Unable to determine offset)r]   r   r6   rl   r   s    r   
get_offsetzvm_map_entry.get_offset  r   r   c                 N   | j                   dk(  ry| j                         j                         }|dk(  ry d}|s<	 |j                  j	                         }|j                  j                  dk(  rd}n|}|s<|j                  j                  dk(  ry 	 |j                  }|dk(  ry |j                  j	                         }d}|j                  j                  |j                  j                        D ]*  }	|	j                  t        j                        d   dv s(d} n |rT|j!                  |t        j                  z   dz   |j                  j"                  |j                        }
|
j$                  }|S d }|S # t
        j                  $ r Y w xY w# t
        j                  $ r Y y w xY w)	Nrr   r   r   FT)vnode_pager_ops_vnode_pager_opsvnode_pager)r"   r6   )
is_sub_mapr   rm   shadowr   r	   r)   r!   r6   pagermo_pager_opssymbol_spaceget_symbols_by_locationsplitr   BANGr   r7   vnode_handle)r   rD   r   vnode_object	found_endtmp_vnode_objectr   opsfoundsymvpagerre   s               r   r   zvm_map_entry.get_vnode  s   ??a (7791	#/#6#6#B#B#D   ##**a/ 	/  ""a'	 &&Ez$$002C ''??O 	Cyy(+/VV	
 ^^	.>'++==#)) $ F
 %%C 
 C
I 55 " 11 		s)   E4 F "F 4F
FF$#F$N)rP   rQ   rR   r   rK   r   rM   rL   r   r   r   rW   r   r   r   r      s,    

:WW1r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)socketc                     	 | j                   j                         j                  d      }|S # t        j                  $ r d }Y |S w xY w)Ninpcb)so_pcbr   r   r	   r)   rd   s     r   	get_inpcbzsocket.get_inpcbO  sL    	++))+009C 
 11 	C
	s   )- AAc                 B    | j                   j                  j                  S N)so_proto	pr_domain
dom_familyr   s    r   
get_familyzsocket.get_familyW  s    }}&&111r   c                 Z    | j                   j                  }|dk(  rd}|S |dk(  rd}|S d}|S )N   TCP   UDPrH   )r   pr_protocol)r   protore   s      r   get_protocol_as_stringzsocket.get_protocol_as_stringZ  sE    ))A:C 
 b[C 
 C
r   c                     d}| j                   j                  dk(  r"| j                         }||j                         }|S )NrH   r   )r   r   r   get_tcp_state)r   re   r   s      r   	get_statezsocket.get_statef  s>    ==$$)NN$E ))+
r   c                     | j                         }|d }|S | j                         dk(  r|j                         }|S |j                         }|S )N   )r   r   get_ipv4_infoget_ipv6_info)r   r   re   s      r   get_connection_infozsocket.get_connection_infop  sZ     =C 
 __!#%%'C 
 %%'C
r   c                 z    | j                         }|r&t        j                  | j                         |      }|S d }|S r   )r   r   convert_network_four_tupler   )r   valsre   s      r   get_converted_connection_infoz$socket.get_converted_connection_info|  s?    '')778I4PC 
 C
r   N)	rP   rQ   rR   r   r   r   r   r   r   rW   r   r   r   r   N  s     2

r   r   c                       e Zd Zd Zd Zd Zy)r   c                     d}	 | j                   j                         j                  d      }|j
                  }|r|t        |      k  r||   }|S d}|S # t        j                  $ r Y yw xY w)N)CLOSEDLISTENSYN_SENTSYN_RECVESTABLISHED
CLOSE_WAIT	FIN_WAIT1CLOSINGLAST_ACK	FIN_WAIT2	TIME_WAITtcpcbrH   )inp_ppcbr   r   r	   r)   t_stater   )r   
tcp_statesr   
state_typestates        r   r   zinpcb.get_tcp_state  s{    

	MM--/44W=E ]]
*s:6z*E  E 11 		s   )A A*)A*c                 N   	 | j                   j                  j                  j                  }| j                  }	 | j                  j                  j                  j                  }| j                  }||||gS # t        j
                  $ r Y y w xY w# t        j
                  $ r Y y w xY wr   )
inp_dependladdrinp46_local
ia46_addr4s_addrr	   r)   	inp_lportinp_dependfaddrinp46_foreign	inp_fportr   liplportriprports        r   r   zinpcb.get_ipv4_info  s    	&&22==DDC 	&&44??FFC UC'' 11 		 11 		s"   *A5 *B 5B
BB$#B$c                 ~   	 | j                   j                  j                  d      j                  d      }| j
                  }	 | j                  j                  j                  d      j                  d      }| j                  }||||gS # t        j                  $ r Y y w xY w# t        j                  $ r Y y w xY w)N	__u6_addrattr__u6_addr32)	r   
inp6_localmemberr	   r)   r   r   inp6_foreignr   r   s        r   r   zinpcb.get_ipv6_info  s    	&&1188k8JQQ" R C 	&&33:::LSS" T C UC'' 11 		 11 		s#   6B 6B& B#"B#&B<;B<N)rP   rQ   rR   r   r   r   rW   r   r   r   r     s    8("(r   r   c                       e Zd Z	 ddej                  j
                  dedededeej                  j
                     f
dZ	y)	queue_entry	list_headmember_name	type_namemax_sizer   c              #     K   d}t               }dD ]G  }t        j                  t        j                        5  t        | |      j                         j                  |      }||j                  j                  |j                  j                  k7  r|j                  j                  |v rn| |j                  |j                  j                         |dz   }||k(  r	 ddd        yt        |j                  |      |      j                         j                  |      }|.|j                  j                  |j                  j                  k7  rddd       J y# 1 sw Y   VxY ww)a  
        Walks a queue in a smear-aware and smear-resistant manner

        smear is detected by:
            - the max_size parameter sets an upper bound
            - each seen entry is only allowed once

        attempts to work around smear:
            - the list is walked in both directions to help find as many elements as possible

        Args:
            list_head   - the head of the list
            member_name - the name of the embedded list member
            type_name   - the type of each element in the list
            max_size    - the maximum amount of elements that will be returned

        Returns:
            Each instance of the queue cast as "type_name" type
        r   )r2   prevNrr   r  )r3   r_   r`   r	   r)   getattrr   r   r!   r6   r?   r
  )	r   r  r  r  r  yieldedrA   r  queue_elements	            r   	walk_listzqueue_entry.walk_list  s<    6 u$ 	D$$Z%G%GH  'd 3 ? ? A F Fy Q!-%))00IMM4H4HH$((//47''HH]..556%kG(*# $   4 4+ 4 FM$i " "-%))00IMM4H4HH	 	 s*   6E*B&E
E*(A(EE*E'	"E*N)i   )
rP   rQ   rR   r
   r   rT   rS   rJ   r   r  rW   r   r   r  r    sY     5%%555 5 	5
 5 
*$$44	55r   r  c                       e Zd Zd Zy)ifnetc                    | j                  d      r6	 | j                  j                  j                         j	                  d      }|S 	 | j                  j                  j                  j                         j	                  d      }|S # t
        j                  $ r d }Y |S w xY w# t
        j                  $ r d }Y |S w xY w)N	if_lladdrsockaddr_dl)	r]   r  ifa_addrr   r   r	   r)   if_addrhead	tqh_first)r   vals     r   r  zifnet.sockaddr_dl  s    ??;'nn--99;@@O 
&&0099EEGLL! 
 55  
 55 
s#   3B 	=B$ B! B!$B=<B=N)rP   rQ   rR   r  rW   r   r   r  r    s    r   r  c                       e Zd Zd Zy)r  c                    d}| j                   dkD  r|S t        | j                         D ]9  }	 | j                  | j                  |z      }|j                  d      }||ddz   }; |r|d   dk(  r|d d }|S # t        $ r Y  w xY w)NrH      zunsigned char02X:)sdl_alenr4   sdl_datasdl_nlen
IndexErrorr   )r   re   rB   r   s       r   __str__zsockaddr_dl.__str__  s    ==2Jt}}% 	$AMM$--!"34 'A1S'#C	$ 3r7c>cr(C
  s   A66	BBN)rP   rQ   rR   r+  rW   r   r   r  r    s    r   r  c                       e Zd Zd Zy)sockaddrc                    d}| j                   }|dk(  r<| j                  d      }t        j                  |j                  j
                        }|S |dk(  rR| j                  d      }t        j                  |j                  j                  d      j                  d            }|S |d	k(  r| j                  d
      }t        |      }|S )NrH   r   sockaddr_inr   sockaddr_in6r  r  r     r  )
	sa_familyr   r   convert_ipv4sin_addrr   convert_ipv6	sin6_addrr
  rS   )r   ipfamilyaddr_inaddr_in6addr_dls         r   get_addresszsockaddr.get_address/  s    Q;ii.G(()9)9)@)@AB 	 r\yy0H(("")){);BBBVB 		 r\ii.GWB	r   N)rP   rQ   rR   r<  rW   r   r   r-  r-  .  s    r   r-  c                   $    e Zd ZdefdZdefdZy)
sysctl_oidr   c                 z    d}g d}g d}t        |      D ]"  \  }}|| j                  z  r	|||   z   }|dz   }$ |S )z
        Returns the actions allowed on the node

        Args: None

        Returns:
            A combination of:
                R - readable
                W - writeable
                L - self handles locking
        rH   )l        i   @i   )RWLr   )r   oid_kind)r   re   checksr   rB   cs         r   rK   zsysctl_oid.get_permsE  sT     5f% 	 DAq4== E!HnCi		  
r   c                 b    dddddd}| j                   dz  }d|cxk  rd	k  r
n n||   }|S d
}|S )at  
        Returns the type of the sysctl node

        Args: None

        Returns:
            One of:
                CTLTYPE_NODE
                CTLTYPE_INT
                CTLTYPE_STRING
                CTLTYPE_QUAD
                CTLTYPE_OPAQUE
                an empty string for nodes not in the above types

        Based on sysctl_sysctl_debug_dump_node
        CTLTYPE_NODECTLTYPE_INTCTLTYPE_STRINGCTLTYPE_QUADCTLTYPE_OPAQUE)rr   r   r      r      r   r   rH   )rC  )r   typesctltypere   s       r   get_ctltypezsysctl_oid.get_ctltype^  sQ    $ 
 --#%w??.C 
 C
r   N)rP   rQ   rR   rS   rK   rP  rW   r   r   r>  r>  D  s    3 2 S  r   r>  c                       e Zd Zd Zy)kauth_scopec              #   b   K   | j                   D ]  }|dk7  s	|j                  dk7  s|  y w)Nr   )ks_listenerskll_callback)r   listeners     r   get_listenerszkauth_scope.get_listeners  s4     )) 	H1}!6!6!!;	s   ///N)rP   rQ   rR   rW  rW   r   r   rR  rR    s    r   rR  )%r_   loggingtypingr   r   r   r   r   volatility3.frameworkr   r	   r
   r   volatility3.framework.objectsr   volatility3.framework.renderersr   volatility3.framework.symbolsr   	getLoggerrP   r:   GenericIntelProcessr   
StructTyperY   rh   ro   r   r   r   r  r  r  r-  r>  rR  rW   r   r   <module>ra     s+     < < L L 1 6 1			8	$]'7&& ]'@w!!  <G&& <0#G 0#fN7%% Nb6W 6rA(G A(H6'$$ 6rG &'$$ .w!! ,:## :z'$$ r   