
    [
#gl                        d dl Z d dlZd dl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mZ d dlmZ d dl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mZ  ej@                  e!      Z" G d
 dejF                  jH                        Z%y)    N)DictIterableListOptionalTupleUnioncast)	constants
exceptions
interfacesobjects	rendererssymbols)requirements)format_hints)intermed)versions)	callbacks)	driverirphandlespoolscannerssdtc                      e Zd ZdZdZdZedeej                  j                     fd       Zedej                  j                  dededeej"                     fd       Zedej                  j                  dedeej"                     fd	       Zededeej"                     fd
       Zedej                  j                  dededefd       Zedej                  j                  dedededeeeeej4                  j6                  f   eeeej4                  j6                  f   f      f
d       Zedej>                  de eef   deeeej4                  j6                  f   eeeej4                  j6                  f   f   fd       Z!edej                  j                  dedededeeeee"e   f      f
d       Z#edej                  j                  dedededeeeedf      f
d       Z$edej                  j                  dedededeeeee"e   f      f
d       Z%edej                  j                  dedededeeeee"e   f      f
d       Z&edej                  j                  dedededeeeeej4                  j6                  f      f
d       Z'edej                  j                  dedededeeeeeej<                  jP                  ejR                  f   f      f
d       Z*d Z+d Z,y)	Callbacksz1Lists kernel callbacks and notification routines.)   r   r   returnc           	      `   t        j                  ddddg      t        j                  dt        j                  d      t        j                  d	t
        j                  d      t        j                  d
t        j                  d      t        j                  dt        j                  d      gS )NkernelzWindows kernelIntel32Intel64)namedescriptionarchitecturesr   )   r   r   )r!   pluginversionr   r   r   )r   ModuleRequirementPluginRequirementr   SSDTr   PoolScannerr   	DriverIrpr   Handles)clss    a/home/panchajanya/Development/work/volatility3/volatility3/framework/plugins/windows/callbacks.pyget_requirementszCallbacks.get_requirements!   s     **,()4
 **DIIy **";+B+BI ** )<)<i **w	
 	
    contextsymbol_tableis_vista_or_abovec                 V    | j                  ||      }|r|| j                  |      z  }|S )a  Creates a list of Pool Tag Constraints for callback objects.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            symbol_table: The name of an existing symbol table containing the symbols / types
            is_vista_or_above: A boolean indicating whether the OS version is Vista or newer.

        Returns:
            The list containing the built constraints.
        ) _create_default_scan_constraints(_create_scan_constraints_vista_and_above)r-   r1   r2   r3   constraintss        r.    create_callback_scan_constraintsz*Callbacks.create_callback_scan_constraints7   s4    " ::7LQ3GGUUKr0   c           	      F   | j                   j                  |t        j                  z   dz         j                  }| j                   j                  |t        j                  z   dz         j                  }| j                   j                  |t        j                  z   dz         j                  }t        j                  d|t        j                  z   dz   |d ft
        j                  j                  t
        j                  j                  z  t
        j                  j                  z        t        j                  d|t        j                  z   dz   |d ft
        j                  j                  t
        j                  j                  z  t
        j                  j                  z  d      t        j                  d	|t        j                  z   dz   |d ft
        j                  j                  t
        j                  j                  z  t
        j                  j                  z        gS )
N_SHUTDOWN_PACKET_GENERIC_CALLBACK_NOTIFICATION_PACKETs   IoFs	type_namesize	page_types   IoSh)r   r   r>   r?   r@   indexs   Cbrb)symbol_spaceget_typer
   BANGr?   r   PoolConstraintPoolTypeNONPAGEDPAGEDFREE)r1   r2   shutdown_packet_sizegeneric_callback_sizenotification_packet_sizes        r.   r5   z*Callbacks._create_default_scan_constraintsM   s   
  '33<<9>>),>> 

$ 	 !( 4 4 = =9>>),??!

$ 	 $+#7#7#@#@9>>),BB$

$ 	!
 &&&7:PP.5%..77&&,,-&&++,	 &&&7:LL*D1%..77&&,,-&&++,  &&&7:MM+T2%..77&&,,-&&++,	%
 	
r0   c           
         t        j                  d| t        j                  z   dz   dt         j                  j
                  t         j                  j                  z  t         j                  j                  z        t        j                  d| t        j                  z   dz   dt         j                  j
                  t         j                  j                  z  t         j                  j                  z  d	      t        j                  d
| t        j                  z   dz   dt         j                  j
                  t         j                  j                  z  t         j                  j                  z  d	      t        j                  d| t        j                  z   dz   dt         j                  j
                  t         j                  j                  z  t         j                  j                  z  d	      gS )aW  Creates a list of Pool Tag Constraints for callback objects.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            symbol_table: The name of an existing symbol table containing the symbols / types

        Returns:
            The list containing the built constraints.
        s   DbCb_DBGPRINT_CALLBACK)    @   r=   s   Pnp9_NOTIFY_ENTRY_HEADER)0   N)r$   r$   rA   s   PnpD)rQ   Ns   PnpC)8   N)r   rF   r
   rE   rG   rH   rI   rJ   )r2   s    r.   r6   z2Callbacks._create_scan_constraints_vista_and_abovex   s    &&&7:NN!%..77&&,,-&&++,	 &&&7:PP!%..77&&,,-&&++,  &&&7:PP!%..77&&,,-&&++,  &&&7:PP!%..77&&,,-&&++, 7$
 $	
r0   nt_symbol_tableconfig_pathc           	          |j                   |   j                  }t        j                  ||      }d|i}|rd}nd}t        j
                  j                  ||d||st        j                  nd||      S )a  Creates a symbol table for kernel callback objects.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            nt_symbol_table: The name of the table containing the kernel symbols
            config_path: The config path where to find symbol files

        Returns:
            The name of the constructed symbol table
        
nt_symbolszcallbacks-x64zcallbacks-x86windowsN)class_typesnative_typestable_mapping)	rC   nativesr   symbol_table_is_64bitr   IntermediateSymbolTablecreater   class_types_x86)r-   r1   rU   rV   r[   is_64bitr\   symbol_filenames           r.   create_callback_symbol_tablez&Callbacks.create_callback_symbol_table   s    " ++O<DD00/J%7-O-O//669A	11t%' 7 
 	
r0   
layer_namecallback_symbol_tablec              #     K   t        j                  ||      }t        j                  j	                  |||      }| j                  |||      }t        j                  j                  ||||      D ]8  \  }}	}
	 t        |	d      r|	j                         s%| j                  |	|       : y# t        j                  $ r Y Qw xY ww)aF  Scans for callback objects using the poolscanner module and constraints.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            nt_symbol_table: The name of the table containing the kernel symbols
            callback_symbol_table: The name of the table containing the callback object symbols (_SHUTDOWN_PACKET etc.)

        Returns:
            A list of callback objects found by scanning the `layer_name` layer for callback pool signatures
        r1   r2   is_validN)r   is_vista_or_laterr   r,   get_type_mapr8   r   r*   generate_pool_scanhasattrri   _process_scanned_callbackr   InvalidAddressException)r-   r1   re   rU   rf   rj   type_mapr7   _constraint
mem_object_headers              r.   scanzCallbacks.scan   s     2 %66/
 ??//_U::*,=
 $$77Z+
	
:z2:;N;N;P33JII
 55 s6   A5C8B,CB,)C,C?CCCmemory_objectrp   c                 x   |j                         }|j                  j                  }t        |t        j
                        s||t        j                  z   dz   k(  rud}	 |j                  j                  }t        j                  j                  d      }|j                  |   }|j                  j                  xs t!        j"                         }	n||t        j                  z   dz   k(  r$d}|j,                  }t!        j*                         }	n||t        j                  z   dz   k(  r|j                  j/                         r|j                  j1                         nd }|r[|j3                         }
	 |
j5                  |      dk(  r!|
j6                  j8                  j                  }	nt!        j*                         }	nt!        j:                         }	|j<                  j>                  r|j<                  j@                  nt!        j"                         }|jB                  }n||t        j                  z   dz   k(  r#d	}|jD                  }t!        j*                         }	nJ||t        j                  z   d
z   k(  r#d}|jF                  }t!        j*                         }	ntI        d|       ||t        |	tJ        j                   jL                        s|	fS |	fS # t$        j&                  $ r- |j                  j(                  }t!        j*                         }	Y kw xY w# t$        j&                  $ r t!        j:                         }	Y lw xY w)Nr:   IoRegisterShutdownNotificationIRP_MJ_SHUTDOWNr<   IoRegisterFsRegistrationChangerR   Driverr;   GenericKernelCallbackrO   DbgSetDebugPrintCallbackzUnexpected object type )'get_symbol_table_namevolr>   
isinstancer   r:   r
   rE   DeviceObjectDriverObjectr   MAJOR_FUNCTIONSrB   MajorFunction
DriverNameStringr   UnparsableValuer   ro   offsetNotApplicableValueNotificationRoutineis_readabledereferenceget_object_headerget_object_typeNameInfoNameUnreadableValueEventCategoryis_valid_choicer"   CallbackRoutineCallbackFunction
ValueErrorr   BaseAbsentValue)r-   ru   rp   r2   r>   callback_typedriverrB   callback_addressdetailsheaders              r.   rn   z#Callbacks._process_scanned_callback  s    %::<!%%//	mY%?%?@	69KKK<M9&33@@!11778IJ#)#7#7#>  ++22Qi6O6O6Q
 ,7:PPP<M,@@224G,7:PPP !--99; **668  113:--h78C"(//"6"6"="="+">">"@ $335 !..>> ++77..0   -<<,7:MMM3M,55224G,7:NNN6M,55224G 6ykBCC  "':+?+?+O+OP 	
 	
 
 	
g 55 9#0#4#4#;#; #66892 "99 :'779G:s&   A0K .A	L =L
L'L98L9callback_table_namec              #     K   |j                   |   j                  d   }|j                  |||      }t        j                  ||      }|t
        j                  z   dz   }g d}	|	D ]  \  }
}	 |j                  |
      j                  }|r|rd}nd}t        t        t        j                      |j#                  d	||j%                  d
      |            }|D ]C  }	 |j'                         j                  |      }|j*                  dk7  s3|
|j*                  df E  y# t        j                  $ r t        j                  d|
        Y w xY w# t        j(                  $ r Y w xY ww)a  Lists all kernel notification routines.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            symbol_table: The name of the table containing the kernel symbols
            callback_table_name: The name of the table containing the callback symbols

        Yields:
            A name, location and optional detail string
        kernel_virtual_offsetre   r   rh   r;   ))PspLoadImageNotifyRoutineF)PspCreateThreadNotifyRoutineT)PspCreateProcessNotifyRoutineTzCannot find rQ      array_EX_FAST_REFobject_typer   subtypecountr   N)layersconfigmoduler   rj   r
   rE   
get_symboladdressr   SymbolErrorvollogdebugr	   r   r   PointerobjectrD   r   ro   r   )r-   r1   re   r2   r   kvontkrnlmprj   full_type_namesymbol_namessymbol_nameextended_listsymbol_offsetr   	fast_refsfast_refcallbacks                    r.   list_notify_routineszCallbacks.list_notify_routinesT  sv    ( nnZ(//0GH>>,:c>R$66,
 -y~~=@SS
 +7&K ( 3 3K @ H H
 !]W__% '($--n=	   I &'335::>JH $$)%x'8'8$>> &- +7 )) |K=9:, "99 sU   A*E)-DAE)E9E)	E)+E
E)EE)E&#E)%E&&E)Nc           
   #   ~  K   |j                   |   j                  d   }|j                  |||      }|t        j                  z   dz   }|j                  d      j                  }|j                  d      j                  }	|j                  d|	      }
|
dk(  ry	t        t        t        j                     |j                  d
||j                  d      |
            }|D ]C  }	 |j                         j                  |      }|j                   dk7  s3d|j                   d	f E y	# t        j                  $ r Y \w xY ww)z]
        Lists all registry callbacks from the old format via the CmpCallBackVector.
        r   r   _EX_CALLBACK_ROUTINE_BLOCKCmpCallBackVectorCmpCallBackCountunsigned intr   r   r   Nr   r   r   CmRegisterCallback)r   r   r   r
   rE   r   r   r   r	   r   r   r   rD   r   r   ro   r   )r-   r1   re   r2   r   r   r   r   r   symbol_count_offsetcallback_countr   r   r   s                 r.   _list_registry_callbacks_legacyz)Callbacks._list_registry_callbacks_legacy  sH     nnZ(//0GH>>,:c>R)..03OO 	 !++,?@HH&112DEMM!&/B ) 
 Q!OO#$ )).9$	  
	 "H#//166~F   A%*H,=,=tCC " 55 s0   CD=!D$ D=D=$D:7D=9D::D=c              #   R  K   |j                   |   j                  d   }|j                  |||      }|t        j                  z   dz   }|j                  d      j                  }|j                  d      j                  }	|j                  d|	      }
|
dk(  ry	|j                  d
|      }|j                  |d      D ]Z  }d	}t        j                  t        j                        5  |j                  j                  }d	d	d	       d|j                  d| f \ y	# 1 sw Y    xY ww)zH
        Lists all registry callbacks via the CallbackListHead.
        r   r   _CM_CALLBACK_ENTRYCallbackListHeadr   r   r   r   N_LIST_ENTRYLinkCmRegisterCallbackExz
Altitude: )r   r   r   r
   rE   r   r   r   to_list
contextlibsuppressr   ro   Altituder   r   )r-   r1   re   r2   r   r   r   r   r   r   r   callback_listr   altitudes                 r.   _list_registry_callbacks_newz&Callbacks._list_registry_callbacks_new  s!     nnZ(//0GH>>,:c>R,y~~=@TT ++,>?GG&112DEMM!&/B ) 
 Q M-X%--nfEHH$$Z%G%GH 4#,,334((*;*;z(=TTT	 F4 4s   C#D'%D<D'D$	 D'c              #     K   |j                   |   j                  d   }|j                  |||      }|j                  d      r.|j                  d      r| j	                  ||||      E d{    y|j                  d      r.|j                  d      r| j                  ||||      E d{    yg d}t        j                  d       |D ]3  }d	}	|j                  |      rd
}	t        j                  d| d|	 d       5 y7 7 Yw)a  Lists all registry callbacks.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            symbol_table: The name of the table containing the kernel symbols
            callback_table_name: The name of the table containing the callback symbols

        Yields:
            A name, location and optional detail string
        r   r   r   r   Nr   )r   r   r   z!Failed to get registry callbacks!zdoes not existexistszsymbol  .)r   r   r   
has_symbolr   r   r   r   )
r-   r1   re   r2   r   r   r   symbols_to_checkr   symbol_statuss
             r.   list_registry_callbacksz!Callbacks.list_registry_callbacks  s"    ( nnZ(//0GH>>,:c>R238K8K9
 ::\3F     !349L9L:
 77\3F   
 LL<=/ 0&&{3$,Mw{m1]O1EF	  0 -s%   A*D,D->D+D,ADDc              #     K   |j                   |   j                  d   }|j                  |||      }	 |j                  d      j                  }|t        j                  z   dz   }|j                  |||z   |      }	|	j                  D ]^  }
|j                   |   j                  |
j                  d      s-	 |j                  d	d
|
j                  dd      }d|
j                  |f ` y# t
        j                  $ r t        j                  d       Y yw xY w# t
        j                   $ r t#        j$                         }Y kw xY ww)a  Lists all kernel bugcheck reason callbacks.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            symbol_table: The name of the table containing the kernel symbols
            callback_table_name: The name of the table containing the callback symbols

        Yields:
            A name, location and optional detail string
        r   r    KeBugCheckReasonCallbackListHeadz,Cannot find KeBugCheckReasonCallbackListHeadN!_KBUGCHECK_REASON_CALLBACK_RECORD)r   r   re   rQ   stringTreplace)absoluter   
max_lengtherrorsr   r   r   r   r   r   r   r   r   r
   rE   r   Entryri   r   	Componentro   r   r   r-   r1   re   r2   r   r   r   list_offsetr   callback_recordr   	components               r.   list_bugcheck_reason_callbacksz(Callbacks.list_bugcheck_reason_callbacks  sW    4 nnZ(//0GH>>,:c>R	"--2g   )..03VV 	 "..&s[/@Z ) 
 (--H>>*-66x7O7OQST8 OO!#--!$ $   5h6N6NPYYY% . %% 	LLGH	4 55 8%557	8sM   1EC* A&E6 DE*(DEDE'E?EEEc              #     K   |j                   |   j                  d   }|j                  |||      }	 |j                  d      j                  }|t        j                  z   dz   }|j                  |||z   |      }	|	j                  D ]r  }
|j                   |   j                  |
j                  d      s-	 |j                  |t        j                  z   d	z   ||
j                  dd
      }d|
j                  |f t y# t
        j                  $ r t        j                  d       Y yw xY w# t
        j                   $ r t#        j$                         }Y kw xY ww)a  Lists all kernel bugcheck callbacks.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            symbol_table: The name of the table containing the kernel symbols
            callback_table_name: The name of the table containing the callback symbols

        Yields:
            A name, location and optional detail string
        r   r   KeBugCheckCallbackListHeadz&Cannot find KeBugCheckCallbackListHeadN_KBUGCHECK_CALLBACK_RECORD)r   re   rQ   r   r   )re   r   r   r   r   r   s               r.   list_bugcheck_callbacksz!Callbacks.list_bugcheck_callbacksW  s[    4 nnZ(//0GH>>,:c>R	"--.JKSSK  )..03OO 	 "..3#4 ) 
 (--H>>*-66x7O7OQST	8#NN 9>>1H<)#--!$ + 	 /0H0H)SS . %% 	LLAB	. 55 8%557	8sM   1EC> A&E64D,*E>(D)&E(D))E,'EEEEc              #      K   | j                   j                  | j                  d      }| j                  | j                   |j                  | j
                        }t        j                  j                  | j                   |j                  |j                        }| j                  | j                  | j                  | j                  | j                  f}|D ]5  } || j                   |j                  |j                  |      D ]  \  }}}|t        j                          }	n|}	t#        |j%                  |            }
|
r|
D ]  \  }}d}|D ]B  }d}d|t'        j(                  |      ||j+                  t,        j.                        d   |	ff D |rRd|t'        j(                  |      |t        j0                         |	ff  d|t'        j(                  |      t        j0                         t        j0                         |	ff  8 y w)Nr   FTr   r$   )r1   modulesr   rd   symbol_table_namerV   r   r)   build_module_collectionre   r   r   r   r   rt   r   r   list'get_module_symbols_by_absolute_locationr   Hexsplitr
   rE   NotAvailableValue)selfr   rf   
collectioncallback_methodscallback_methodr   r   callback_detaildetailmodule_symbolsmodule_namesymbol_generatorsymbols_foundsymbols                  r.   
_generatorzCallbacks._generator  s    %%dkk(&;< $ A ALL&22D4D4D!
 YY66LL&++V-E-E


 %%((//((II
  0ODS!!((%	E@/ #*&99;F,F!%FFGWX" "9G5%5(- '7F,0M !$1$0$4$45E$F$/$*LL$@$C$*!"	# 	 '7  - !$1$0$4$45E$F$/$-$?$?$A$*!"	# 	' :H@ )(,,-=>%779%779"	 	_E  0s   FHA<Hc                     t        j                  dt        fdt        j                  fdt        fdt        fdt        fg| j                               S )NTyper   ModuleSymbolDetail)r   TreeGridstrr   r   r  )r   s    r.   runzCallbacks.run  sP    !!\--.333 OO	
 		
r0   )-__name__
__module____qualname____doc___required_framework_version_versionclassmethodr   r   configurationRequirementInterfacer/   r1   ContextInterfacer  boolr   rF   r8   staticmethodr5   r6   rd   r   r   r   r   r   intrt   r   
StructTyper   rn   r   r   r   r   r   r   ObjectInterfacer   r   r  r   r0   r.   r   r      s   ;"+H
j&>&>&S&S!T 
 
* ##44   	
 
k((	) * (
##44(
DG(
	k((	)(
 (
T 1
1
	k((	)1
 1
f !
##44!
 !
 	!

 
!
 !
F /##44/ / 	/
  #/ 
#z++;;;<#z++;;;<>	

/ /b O
#..O
:>sCx.O
	c:''7778c:''7778	:
O
 O
b >?##44>? >? 	>?
 !>? 
%S(3-/0	1>? >?@ ,D##44,D ,D 	,D
 !,D 
%S$'	(,D ,D\ U##44U U 	U
 !U 
%S(3-/0	1U U@ /##44/ / 	/
 !/ 
%S(3-/0	1/ /b =Z##44=Z =Z 	=Z
 !=Z 
  002	

=Z =Z~ 8T##448T 8T 	8T
 !8T 
*$$44i6O6OOPR	

8T 8TtL\

r0   r   )&r   loggingtypingr   r   r   r   r   r   r	   volatility3.frameworkr
   r   r   r   r   r   #volatility3.framework.configurationr   volatility3.framework.renderersr   volatility3.framework.symbolsr   %volatility3.framework.symbols.windowsr   0volatility3.framework.symbols.windows.extensionsr   volatility3.plugins.windowsr   r   r   r   	getLoggerr  r   pluginsPluginInterfacer   r  r0   r.   <module>r,     sc   
   E E E  = 8 2 : F M M			8	$O

""22 O
r0   